diff options
Diffstat (limited to 'Build/source/libs/icu/icu-50.1/layout')
164 files changed, 27367 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-50.1/layout/AlternateSubstSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/AlternateSubstSubtables.cpp new file mode 100644 index 00000000000..6c8758bc993 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/AlternateSubstSubtables.cpp @@ -0,0 +1,51 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "AlternateSubstSubtables.h" +#include "GlyphIterator.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_uint32 AlternateSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const +{ + // NOTE: For now, we'll just pick the first alternative... + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + le_uint16 altSetCount = SWAPW(alternateSetCount); + + if (coverageIndex < altSetCount) { + Offset alternateSetTableOffset = SWAPW(alternateSetTableOffsetArray[coverageIndex]); + const AlternateSetTable *alternateSetTable = + (const AlternateSetTable *) ((char *) this + alternateSetTableOffset); + le_int32 altIndex = glyphIterator->getFeatureParam(); + + if (altIndex < SWAPW(alternateSetTable->glyphCount)) { + TTGlyphID alternate = SWAPW(alternateSetTable->alternateArray[altIndex]); + + if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, alternate))) { + glyphIterator->setCurrGlyphID(alternate); + } + + return 1; + } + + // feature param was out of range for the glyph + } + + // XXXX If we get here, the table's mal-formed... + } + + return 0; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/AlternateSubstSubtables.h b/Build/source/libs/icu/icu-50.1/layout/AlternateSubstSubtables.h new file mode 100644 index 00000000000..41e3bc9409d --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/AlternateSubstSubtables.h @@ -0,0 +1,38 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __ALTERNATESUBSTITUTIONSUBTABLES_H +#define __ALTERNATESUBSTITUTIONSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +struct AlternateSetTable +{ + le_uint16 glyphCount; + TTGlyphID alternateArray[ANY_NUMBER]; +}; + +struct AlternateSubstitutionSubtable : GlyphSubstitutionSubtable +{ + le_uint16 alternateSetCount; + Offset alternateSetTableOffsetArray[ANY_NUMBER]; + + le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/AnchorTables.cpp b/Build/source/libs/icu/icu-50.1/layout/AnchorTables.cpp new file mode 100644 index 00000000000..24f3cf31df4 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/AnchorTables.cpp @@ -0,0 +1,106 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "DeviceTables.h" +#include "AnchorTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +void AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, + LEPoint &anchor) const +{ + switch(SWAPW(anchorFormat)) { + case 1: + { + const Format1AnchorTable *f1 = (const Format1AnchorTable *) this; + + f1->getAnchor(fontInstance, anchor); + break; + } + + case 2: + { + const Format2AnchorTable *f2 = (const Format2AnchorTable *) this; + + f2->getAnchor(glyphID, fontInstance, anchor); + break; + } + + case 3: + { + const Format3AnchorTable *f3 = (const Format3AnchorTable *) this; + + f3->getAnchor(fontInstance, anchor); + break; + } + + default: + // unknown format: just use x, y coordinate, like format 1... + const Format1AnchorTable *f1 = (const Format1AnchorTable *) this; + + f1->getAnchor(fontInstance, anchor); + break; + } +} + +void Format1AnchorTable::getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const +{ + le_int16 x = SWAPW(xCoordinate); + le_int16 y = SWAPW(yCoordinate); + LEPoint pixels; + + fontInstance->transformFunits(x, y, pixels); + + fontInstance->pixelsToUnits(pixels, anchor); +} + +void Format2AnchorTable::getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, LEPoint &anchor) const +{ + LEPoint point; + + if (! fontInstance->getGlyphPoint(glyphID, SWAPW(anchorPoint), point)) { + le_int16 x = SWAPW(xCoordinate); + le_int16 y = SWAPW(yCoordinate); + + fontInstance->transformFunits(x, y, point); + } + + + fontInstance->pixelsToUnits(point, anchor); +} + +void Format3AnchorTable::getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const +{ + le_int16 x = SWAPW(xCoordinate); + le_int16 y = SWAPW(yCoordinate); + LEPoint pixels; + Offset dtxOffset = SWAPW(xDeviceTableOffset); + Offset dtyOffset = SWAPW(yDeviceTableOffset); + + fontInstance->transformFunits(x, y, pixels); + + if (dtxOffset != 0) { + const DeviceTable *dtx = (const DeviceTable *) ((char *) this + dtxOffset); + le_int16 adjx = dtx->getAdjustment((le_int16) fontInstance->getXPixelsPerEm()); + + pixels.fX += adjx; + } + + if (dtyOffset != 0) { + const DeviceTable *dty = (const DeviceTable *) ((char *) this + dtyOffset); + le_int16 adjy = dty->getAdjustment((le_int16) fontInstance->getYPixelsPerEm()); + + pixels.fY += adjy; + } + + fontInstance->pixelsToUnits(pixels, anchor); +} + +U_NAMESPACE_END + diff --git a/Build/source/libs/icu/icu-50.1/layout/AnchorTables.h b/Build/source/libs/icu/icu-50.1/layout/AnchorTables.h new file mode 100644 index 00000000000..71825c5ca16 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/AnchorTables.h @@ -0,0 +1,54 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __ANCHORTABLES_H +#define __ANCHORTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +struct AnchorTable +{ + le_uint16 anchorFormat; + le_int16 xCoordinate; + le_int16 yCoordinate; + + void getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, + LEPoint &anchor) const; +}; + +struct Format1AnchorTable : AnchorTable +{ + void getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const; +}; + +struct Format2AnchorTable : AnchorTable +{ + le_uint16 anchorPoint; + + void getAnchor(LEGlyphID glyphID, const LEFontInstance *fontInstance, LEPoint &anchor) const; +}; + +struct Format3AnchorTable : AnchorTable +{ + Offset xDeviceTableOffset; + Offset yDeviceTableOffset; + + void getAnchor(const LEFontInstance *fontInstance, LEPoint &anchor) const; +}; + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/ArabicLayoutEngine.cpp b/Build/source/libs/icu/icu-50.1/layout/ArabicLayoutEngine.cpp new file mode 100644 index 00000000000..c0f780e4480 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ArabicLayoutEngine.cpp @@ -0,0 +1,217 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEScripts.h" +#include "LEGlyphFilter.h" +#include "LEGlyphStorage.h" +#include "LayoutEngine.h" +#include "OpenTypeLayoutEngine.h" +#include "ArabicLayoutEngine.h" +#include "ScriptAndLanguageTags.h" +#include "CharSubstitutionFilter.h" + +#include "GlyphSubstitutionTables.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositioningTables.h" + +#include "GDEFMarkFilter.h" + +#include "ArabicShaping.h" +#include "CanonShaping.h" + +U_NAMESPACE_BEGIN + +le_bool CharSubstitutionFilter::accept(LEGlyphID glyph) const +{ + return fFontInstance->canDisplay((LEUnicode) glyph); +} + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ArabicOpenTypeLayoutEngine) + +ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) +{ + fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; +} + +ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) +{ + fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount); + + // NOTE: We don't need to set fFeatureOrder to TRUE here + // because this constructor is only called by the constructor + // for UnicodeArabicOpenTypeLayoutEngine, which uses a pre-built + // GSUB table that has the features in the correct order. + + //fFeatureOrder = TRUE; +} + +ArabicOpenTypeLayoutEngine::~ArabicOpenTypeLayoutEngine() +{ + // nothing to do +} + +// Input: characters +// Output: characters, char indices, tags +// Returns: output character count +le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + outChars = LE_NEW_ARRAY(LEUnicode, count); + + if (outChars == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + glyphStorage.allocateGlyphArray(count, rightToLeft, success); + glyphStorage.allocateAuxData(success); + + if (LE_FAILURE(success)) { + LE_DELETE_ARRAY(outChars); + return 0; + } + + CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, outChars, glyphStorage); + + // Note: This processes the *original* character array so we can get context + // for the first and last characters. This is OK because only the marks + // will have been reordered, and they don't contribute to shaping. + ArabicShaping::shape(chars, offset, count, max, rightToLeft, glyphStorage); + + return count; +} + +void ArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, + LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (chars == NULL || offset < 0 || count < 0) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fGPOSTable != NULL) { + OpenTypeLayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphStorage, success); + } else if (fGDEFTable != NULL) { + GDEFMarkFilter filter(fGDEFTable); + + adjustMarkGlyphs(glyphStorage, &filter, success); + } else { + GlyphDefinitionTableHeader *gdefTable = (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; + GDEFMarkFilter filter(gdefTable); + + adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); + } +} + +UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) + : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) +{ + fGSUBTable = (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; + fGDEFTable = (const GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; + + fSubstitutionFilter = new CharSubstitutionFilter(fontInstance); +} + +UnicodeArabicOpenTypeLayoutEngine::~UnicodeArabicOpenTypeLayoutEngine() +{ + delete fSubstitutionFilter; +} + +// "glyphs", "indices" -> glyphs, indices +le_int32 UnicodeArabicOpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + // FIXME: we could avoid the memory allocation and copy if we + // made a clone of mapCharsToGlyphs which took the fake glyphs + // directly. + le_int32 tempGlyphCount = tempGlyphStorage.getGlyphCount(); + LEUnicode *tempChars = LE_NEW_ARRAY(LEUnicode, tempGlyphCount); + + if (tempChars == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + for (le_int32 i = 0; i < tempGlyphCount; i += 1) { + tempChars[i] = (LEUnicode) LE_GET_GLYPH(tempGlyphStorage[i]); + } + + glyphStorage.adoptCharIndicesArray(tempGlyphStorage); + + ArabicOpenTypeLayoutEngine::mapCharsToGlyphs(tempChars, 0, tempGlyphCount, FALSE, TRUE, glyphStorage, success); + + LE_DELETE_ARRAY(tempChars); + + return tempGlyphCount; +} + +void UnicodeArabicOpenTypeLayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool /*mirror*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (chars == NULL || offset < 0 || count < 0) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + le_int32 i, dir = 1, out = 0; + + if (reverse) { + out = count - 1; + dir = -1; + } + + glyphStorage.allocateGlyphArray(count, reverse, success); + + for (i = 0; i < count; i += 1, out += dir) { + glyphStorage[out] = (LEGlyphID) chars[offset + i]; + } +} + +void UnicodeArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, + LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (chars == NULL || offset < 0 || count < 0) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + GDEFMarkFilter filter(fGDEFTable); + + adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); +} + +U_NAMESPACE_END + diff --git a/Build/source/libs/icu/icu-50.1/layout/ArabicLayoutEngine.h b/Build/source/libs/icu/icu-50.1/layout/ArabicLayoutEngine.h new file mode 100644 index 00000000000..a449701f181 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ArabicLayoutEngine.h @@ -0,0 +1,241 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#ifndef __ARABICLAYOUTENGINE_H +#define __ARABICLAYOUTENGINE_H + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "LEGlyphFilter.h" +#include "LayoutEngine.h" +#include "OpenTypeLayoutEngine.h" + +#include "GlyphSubstitutionTables.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositioningTables.h" + +U_NAMESPACE_BEGIN + +/** + * This class implements OpenType layout for Arabic fonts. It overrides + * the characerProcessing method to assign the correct OpenType feature + * tags for the Arabic contextual forms. It also overrides the adjustGlyphPositions + * method to guarantee that all vowel and accent glyphs have zero advance width. + * + * @internal + */ +class ArabicOpenTypeLayoutEngine : public OpenTypeLayoutEngine +{ +public: + /** + * This is the main constructor. It constructs an instance of ArabicOpenTypeLayoutEngine for + * a particular font, script and language. It takes the GSUB table as a parameter since + * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an + * Indic OpenType font. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param gsubTable - the GSUB table + * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see OpenTypeLayoutEngine + * @see ScriptAndLanguageTags.h for script and language codes + * + * @internal + */ + ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known + * until after this constructor has been invoked. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param success - set to an error code if the operation fails + * + * @see OpenTypeLayoutEngine + * @see ScriptAndLanguageTags.h for script and language codes + * + * @internal + */ + ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. + * + * @internal + */ + virtual ~ArabicOpenTypeLayoutEngine(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +protected: + + /** + * This method does Arabic OpenType character processing. It assigns the OpenType feature + * tags to the characters to generate the correct contextual forms and ligatures. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run + * + * Output parameters: + * @param outChars - the output character arrayt + * @param charIndices - the output character index array + * @param featureTags - the output feature tag array + * @param success - set to an error code if the operation fails + * + * @return the output character count + * + * @internal + */ + virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method applies the GPOS table if it is present, otherwise it ensures that all vowel + * and accent glyphs have a zero advance width by calling the adjustMarkGlyphs method. + * If the font contains a GDEF table, that is used to identify voewls and accents. Otherwise + * the character codes are used. + * + * @param chars - the input character context + * @param offset - the offset of the first character to process + * @param count - the number of characters to process + * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered + * @param glyphs - the input glyph array + * @param glyphCount - the number of glyphs + * @param positions - the position array, will be updated as needed + * @param success - output parameter set to an error code if the operation fails + * + * @internal + */ + virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + // static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); + +}; + +/** + * The class implements OpenType layout for Arabic fonts which don't + * contain a GSUB table, using a canned GSUB table based on Unicode + * Arabic Presentation Forms. It overrides the mapCharsToGlyphs method + * to use the Presentation Forms as logical glyph indices. It overrides the + * glyphPostProcessing method to convert the Presentation Forms to actual + * glyph indices. + * + * @see ArabicOpenTypeLayoutEngine + * + * @internal + */ +class UnicodeArabicOpenTypeLayoutEngine : public ArabicOpenTypeLayoutEngine +{ +public: + /** + * This constructs an instance of UnicodeArabicOpenTypeLayoutEngine for a specific font, + * script and language. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param languageCode - the language + * @param success - set to an error code if the operation fails + * + * @see LEFontInstance + * @see ScriptAndLanguageTags.h for script and language codes + * + * @internal + */ + UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. + * + * @internal + */ + virtual ~UnicodeArabicOpenTypeLayoutEngine(); + +protected: + + /** + * This method converts the Arabic Presentation Forms in the temp glyph array + * into actual glyph indices using ArabicOpenTypeLayoutEngine::mapCharsToGlyps. + * + * Input paramters: + * @param tempGlyphs - the input presentation forms + * @param tempCharIndices - the input character index array + * @param tempGlyphCount - the number of Presentation Froms + * + * Output parameters: + * @param glyphs - the output glyph index array + * @param charIndices - the output character index array + * @param success - set to an error code if the operation fails + * + * @return the number of glyph indices in the output glyph index array + * + * @internal + */ + virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method copies the input characters into the output glyph index array, + * for use by the canned GSUB table. It also generates the character index array. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the offset of the first character to be mapped + * @param count - the number of characters to be mapped + * @param reverse - if <code>TRUE</code>, the output will be in reverse order + * @param mirror - if <code>TRUE</code>, do character mirroring + * @param glyphStorage - the glyph storage object. Glyph and char index arrays will be updated. + * + * @param success - set to an error code if the operation fails + * + * @internal + */ + virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method ensures that all vowel and accent glyphs have a zero advance width by calling + * the adjustMarkGlyphs method. The character codes are used to identify the vowel and mark + * glyphs. + * + * @param chars - the input character context + * @param offset - the offset of the first character to process + * @param count - the number of characters to process + * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered + * @param glyphStorage - the glyph storage object. The glyph positions will be updated as needed. + * @param success - output parameter set to an error code if the operation fails + * + * @internal + */ + virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/ArabicShaping.cpp b/Build/source/libs/icu/icu-50.1/layout/ArabicShaping.cpp new file mode 100644 index 00000000000..5433305e9fb --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ArabicShaping.cpp @@ -0,0 +1,272 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "ArabicShaping.h" +#include "LEGlyphStorage.h" +#include "ClassDefinitionTables.h" + +U_NAMESPACE_BEGIN + +// This table maps Unicode joining types to +// ShapeTypes. +const ArabicShaping::ShapeType ArabicShaping::shapeTypes[] = +{ + ArabicShaping::ST_NOSHAPE_NONE, // [U] + ArabicShaping::ST_NOSHAPE_DUAL, // [C] + ArabicShaping::ST_DUAL, // [D] + ArabicShaping::ST_LEFT, // [L] + ArabicShaping::ST_RIGHT, // [R] + ArabicShaping::ST_TRANSPARENT // [T] +}; + +// Draft Mongolian shaping classes, not provided by the Unicode data files at this time +enum { + _c_ = ArabicShaping::ST_NOSHAPE_DUAL, + _d_ = ArabicShaping::ST_DUAL, + _n_ = ArabicShaping::ST_NONE, + _r_ = ArabicShaping::ST_RIGHT, + _t_ = ArabicShaping::ST_TRANSPARENT, + _x_ = ArabicShaping::ST_NOSHAPE_NONE +}; + +const ArabicShaping::ShapeType ArabicShaping::mongolianTypes[] = +{ + _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _t_, _t_, _t_, _t_, _n_, // 0x1800 - 0x180f + _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, // 0x1810 - 0x181f + _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1820 - 0x182f + _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1830 - 0x183f + _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1840 - 0x184f + _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1850 - 0x185f + _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1860 - 0x186f + _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, // 0x1870 - 0x187f + _n_, _n_, _n_, _n_, _n_, _n_, _n_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1880 - 0x188f + _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1890 - 0x189f + _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _t_, _n_, _n_, _n_, _n_, _n_, _n_ // 0x18a0 - 0x18af +}; + +/* + shaping array holds types for Arabic chars between 0610 and 0700 + other values are either unshaped, or transparent if a mark or format + code, except for format codes 200c (zero-width non-joiner) and 200d + (dual-width joiner) which are both unshaped and non_joining or + dual-joining, respectively. +*/ +ArabicShaping::ShapeType ArabicShaping::getShapeType(LEUnicode c) +{ + const ClassDefinitionTable *joiningTypes = (const ClassDefinitionTable *) ArabicShaping::shapingTypeTable; + le_int32 joiningType = joiningTypes->getGlyphClass(c); + + if (joiningType == ArabicShaping::JT_RIGHT_JOINING) { // check for Syriac exceptions ALAPH, DALATH, RISH + if (c == 0x0710) + return ArabicShaping::ST_ALAPH; + if (c == 0x0715 || c == 0x0716 || c == 0x072A || c == 0x072F) + return ArabicShaping::ST_DALATH_RISH; + } + + if (joiningType == 0) { // check for Mongolian range, not supported by ArabicShaping::shapingTypeTable + if (c >= 0x1800 && c <= 0x18af) + return ArabicShaping::mongolianTypes[c - 0x1800]; + } + + if (joiningType >= 0 && joiningType < ArabicShaping::JT_COUNT) { + return ArabicShaping::shapeTypes[joiningType]; + } + + return ArabicShaping::ST_NOSHAPE_NONE; +} + +#define isolFeatureTag LE_ISOL_FEATURE_TAG +#define initFeatureTag LE_INIT_FEATURE_TAG +#define mediFeatureTag LE_MEDI_FEATURE_TAG +#define med2FeatureTag LE_MED2_FEATURE_TAG +#define finaFeatureTag LE_FINA_FEATURE_TAG +#define fin2FeatureTag LE_FIN2_FEATURE_TAG +#define fin3FeatureTag LE_FIN3_FEATURE_TAG +#define ligaFeatureTag LE_LIGA_FEATURE_TAG +#define msetFeatureTag LE_MSET_FEATURE_TAG +#define markFeatureTag LE_MARK_FEATURE_TAG +#define ccmpFeatureTag LE_CCMP_FEATURE_TAG +#define rligFeatureTag LE_RLIG_FEATURE_TAG +#define caltFeatureTag LE_CALT_FEATURE_TAG +#define dligFeatureTag LE_DLIG_FEATURE_TAG +#define cswhFeatureTag LE_CSWH_FEATURE_TAG +#define cursFeatureTag LE_CURS_FEATURE_TAG +#define kernFeatureTag LE_KERN_FEATURE_TAG +#define mkmkFeatureTag LE_MKMK_FEATURE_TAG + +// NOTE: +// The isol, fina, init and medi features must be +// defined in the above order, and have masks that +// are all in the same byte. +#define isolFeatureMask 0x80000000UL +#define finaFeatureMask 0x40000000UL +#define initFeatureMask 0x20000000UL +#define mediFeatureMask 0x10000000UL +#define fin2FeatureMask 0x08000000UL +#define fin3FeatureMask 0x04000000UL +#define med2FeatureMask 0x03000000UL /* two bits, from shifting either fin2 or fin3 */ + +#define ccmpFeatureMask 0x00800000UL +#define rligFeatureMask 0x00400000UL +#define caltFeatureMask 0x00200000UL +#define ligaFeatureMask 0x00100000UL +#define dligFeatureMask 0x00080000UL +#define cswhFeatureMask 0x00040000UL +#define msetFeatureMask 0x00020000UL +#define cursFeatureMask 0x00010000UL +#define kernFeatureMask 0x00008000UL +#define markFeatureMask 0x00004000UL +#define mkmkFeatureMask 0x00002000UL + +#define NO_FEATURES 0 +#define ISOL_FEATURES (isolFeatureMask | ligaFeatureMask | msetFeatureMask | markFeatureMask | ccmpFeatureMask | rligFeatureMask | caltFeatureMask | dligFeatureMask | cswhFeatureMask | cursFeatureMask | kernFeatureMask | mkmkFeatureMask) + +#define SHAPE_MASK 0xFF000000UL + +static const FeatureMap featureMap[] = { + {ccmpFeatureTag, ccmpFeatureMask}, + {isolFeatureTag, isolFeatureMask}, + {finaFeatureTag, finaFeatureMask}, + {fin2FeatureTag, fin2FeatureMask}, + {fin3FeatureTag, fin3FeatureMask}, + {mediFeatureTag, mediFeatureMask}, + {med2FeatureTag, med2FeatureMask}, + {initFeatureTag, initFeatureMask}, + {rligFeatureTag, rligFeatureMask}, + {caltFeatureTag, caltFeatureMask}, + {ligaFeatureTag, ligaFeatureMask}, + {dligFeatureTag, dligFeatureMask}, + {cswhFeatureTag, cswhFeatureMask}, + {msetFeatureTag, msetFeatureMask}, + {cursFeatureTag, cursFeatureMask}, + {kernFeatureTag, kernFeatureMask}, + {markFeatureTag, markFeatureMask}, + {mkmkFeatureTag, mkmkFeatureMask} +}; + +const FeatureMap *ArabicShaping::getFeatureMap(le_int32 &count) +{ + count = LE_ARRAY_SIZE(featureMap); + + return featureMap; +} + +void ArabicShaping::adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage) +{ + LEErrorCode success = LE_NO_ERROR; + FeatureMask featureMask = (FeatureMask) glyphStorage.getAuxData(outIndex, success); + FeatureMask shape = featureMask & SHAPE_MASK; + + shape >>= shapeOffset; + + glyphStorage.setAuxData(outIndex, ((featureMask & ~SHAPE_MASK) | shape), success); +} + +void ArabicShaping::shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax, + le_bool rightToLeft, LEGlyphStorage &glyphStorage) +{ + // iterate in logical order, store tags in visible order + // + // the effective right char is the most recently encountered + // non-transparent char + // + // four boolean states: + // the effective right char shapes + // the effective right char causes left shaping + // the current char shapes + // the current char causes right shaping + // + // if both cause shaping, then + // shaper.shape(errout, 2) (isolate to initial, or final to medial) + // shaper.shape(out, 1) (isolate to final) + + // special cases for Syriac ALAPH: + // final ALAPH is fin2 when effective right char shapes but does not cause left shaping, and is not DALATH/RISH + // final ALAPH is fin3 when effective right char is DALATH/RISH + // medial ALAPH is med2 when effective right char shapes but does not cause left shaping + // using one of: + // shaper.shape(out, 4) (isolate to fin2) + // shaper.shape(out, 5) (isolate to fin3) + + ShapeType rightType = ST_NOSHAPE_NONE, leftType = ST_NOSHAPE_NONE; + LEErrorCode success = LE_NO_ERROR; + le_int32 i; + + for (i = offset - 1; i >= 0; i -= 1) { + rightType = getShapeType(chars[i]); + + if (rightType != ST_TRANSPARENT) { + break; + } + } + + for (i = offset + charCount; i < charMax; i += 1) { + leftType = getShapeType(chars[i]); + + if (leftType != ST_TRANSPARENT) { + break; + } + } + + // erout is effective right logical index + le_int32 erout = -1; + le_bool rightShapes = FALSE; + le_bool rightCauses = (rightType & MASK_SHAPE_LEFT) != 0; + le_int32 in, e, out = 0, dir = 1; + + if (rightToLeft) { + out = charCount - 1; + erout = charCount; + dir = -1; + } + + for (in = offset, e = offset + charCount; in < e; in += 1, out += dir) { + LEUnicode c = chars[in]; + ShapeType t = getShapeType(c); + + if (t == ST_NOSHAPE_NONE) { + glyphStorage.setAuxData(out, NO_FEATURES, success); + } else { + glyphStorage.setAuxData(out, ISOL_FEATURES, success); + } + + if ((t & MASK_TRANSPARENT) != 0) { + continue; + } + + le_bool curShapes = (t & MASK_NOSHAPE) == 0; + le_bool curCauses = (t & MASK_SHAPE_RIGHT) != 0; + + if (rightCauses && curCauses) { + if (rightShapes) { + adjustTags(erout, 2, glyphStorage); + } + + if (curShapes) { + adjustTags(out, 1, glyphStorage); + } + } else if (t == ST_ALAPH) { + if (rightType == ST_DALATH_RISH) { + adjustTags(out, 5, glyphStorage); + } else if (rightShapes && !rightCauses) { + adjustTags(out, 4, glyphStorage); + } + } + + rightShapes = curShapes; + rightCauses = (t & MASK_SHAPE_LEFT) != 0; + rightType = t; // remember this; might need to know if it was DALATH/RISH + erout = out; + } + + if (rightShapes && rightCauses && (leftType & MASK_SHAPE_RIGHT) != 0) { + adjustTags(erout, 2, glyphStorage); + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/ArabicShaping.h b/Build/source/libs/icu/icu-50.1/layout/ArabicShaping.h new file mode 100644 index 00000000000..e90cee000a5 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ArabicShaping.h @@ -0,0 +1,83 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#ifndef __ARABICSHAPING_H +#define __ARABICSHAPING_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class ArabicShaping /* not : public UObject because all methods are static */ { +public: + // Joining types + enum JoiningTypes + { + JT_NON_JOINING = 0, + JT_JOIN_CAUSING = 1, + JT_DUAL_JOINING = 2, + JT_LEFT_JOINING = 3, + JT_RIGHT_JOINING = 4, + JT_TRANSPARENT = 5, + JT_COUNT = 6 + }; + + // shaping bit masks + enum ShapingBitMasks + { + MASK_SHAPE_RIGHT = 1, // if this bit set, shapes to right + MASK_SHAPE_LEFT = 2, // if this bit set, shapes to left + MASK_TRANSPARENT = 4, // if this bit set, is transparent (ignore other bits) + MASK_NOSHAPE = 8, // if this bit set, don't shape this char, i.e. tatweel + + MASK_ALAPH = 16, // if this bit set, char is Syriac ALAPH + MASK_DALATH_RISH = 32 // if this bit set, char is Syriac DALATH/RISH + }; + + // shaping values + enum ShapeTypeValues + { + ST_NONE = 0, + ST_RIGHT = MASK_SHAPE_RIGHT, + ST_LEFT = MASK_SHAPE_LEFT, + ST_DUAL = MASK_SHAPE_RIGHT | MASK_SHAPE_LEFT, + ST_TRANSPARENT = MASK_TRANSPARENT, + ST_NOSHAPE_DUAL = MASK_NOSHAPE | ST_DUAL, + ST_NOSHAPE_NONE = MASK_NOSHAPE, + ST_ALAPH = MASK_ALAPH | MASK_SHAPE_RIGHT, + ST_DALATH_RISH = MASK_DALATH_RISH | MASK_SHAPE_RIGHT + }; + + typedef le_int32 ShapeType; + + static void shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax, + le_bool rightToLeft, LEGlyphStorage &glyphStorage); + + static const FeatureMap *getFeatureMap(le_int32 &count); + +private: + // forbid instantiation + ArabicShaping(); + + static ShapeType getShapeType(LEUnicode c); + + static const le_uint8 shapingTypeTable[]; + static const ShapeType shapeTypes[]; + static const ShapeType mongolianTypes[]; + + static void adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage); +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/AttachmentPosnSubtables.h b/Build/source/libs/icu/icu-50.1/layout/AttachmentPosnSubtables.h new file mode 100644 index 00000000000..7f8406dc19f --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/AttachmentPosnSubtables.h @@ -0,0 +1,42 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#ifndef __ATTACHMENTPOSITIONINGSUBTABLES_H +#define __ATTACHMENTPOSITIONINGSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "GlyphPositioningTables.h" +#include "ValueRecords.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +struct AttachmentPositioningSubtable : GlyphPositioningSubtable +{ + Offset baseCoverageTableOffset; + le_uint16 classCount; + Offset markArrayOffset; + Offset baseArrayOffset; + + inline le_int32 getBaseCoverage(LEGlyphID baseGlyphId) const; + + le_uint32 process(GlyphIterator *glyphIterator) const; +}; + +inline le_int32 AttachmentPositioningSubtable::getBaseCoverage(LEGlyphID baseGlyphID) const +{ + return getGlyphCoverage(baseCoverageTableOffset, baseGlyphID); +} + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/CanonData.cpp b/Build/source/libs/icu/icu-50.1/layout/CanonData.cpp new file mode 100644 index 00000000000..f4fe33bb47a --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/CanonData.cpp @@ -0,0 +1,3619 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. + * + * Generated on: 03/12/2008 03:14:34 PM HST + */ + +#include "LETypes.h" +#include "CanonShaping.h" + +U_NAMESPACE_BEGIN + +const le_uint8 CanonShaping::glyphSubstitutionTable[] = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x34, 0x02, 0x46, 0x00, 0x10, 0x61, 0x72, 0x61, 0x62, + 0x00, 0x62, 0x62, 0x61, 0x6C, 0x69, 0x00, 0x76, 0x62, 0x65, 0x6E, 0x67, 0x00, 0x82, 0x63, 0x79, + 0x72, 0x6C, 0x00, 0x8E, 0x64, 0x65, 0x76, 0x61, 0x00, 0x9A, 0x67, 0x72, 0x65, 0x6B, 0x00, 0xA6, + 0x68, 0x69, 0x72, 0x61, 0x00, 0xB2, 0x6B, 0x61, 0x6E, 0x61, 0x00, 0xBE, 0x6B, 0x6E, 0x64, 0x61, + 0x00, 0xCA, 0x6C, 0x61, 0x74, 0x6E, 0x00, 0xD6, 0x6D, 0x6C, 0x79, 0x6D, 0x00, 0xE2, 0x6D, 0x79, + 0x6D, 0x72, 0x00, 0xEE, 0x6F, 0x72, 0x79, 0x61, 0x00, 0xFA, 0x73, 0x69, 0x6E, 0x68, 0x01, 0x06, + 0x74, 0x61, 0x6D, 0x6C, 0x01, 0x12, 0x74, 0x65, 0x6C, 0x75, 0x01, 0x1E, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x05, 0x00, 0x00, 0x00, 0x11, 0x00, 0x13, 0x00, 0x10, 0x00, 0x12, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x03, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x01, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x06, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x01, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0B, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x00, 0x01, 0x00, 0x0E, 0x00, 0x14, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x7A, 0x63, 0x63, 0x6D, 0x70, + 0x00, 0x82, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x8A, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x92, 0x63, 0x63, + 0x6D, 0x70, 0x00, 0x9A, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xA2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xAA, + 0x63, 0x63, 0x6D, 0x70, 0x00, 0xB2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xBA, 0x63, 0x63, 0x6D, 0x70, + 0x00, 0xC2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xCA, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xD2, 0x63, 0x63, + 0x6D, 0x70, 0x00, 0xDA, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xE2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xEA, + 0x63, 0x63, 0x6D, 0x70, 0x00, 0xF2, 0x66, 0x69, 0x6E, 0x61, 0x00, 0xFA, 0x69, 0x6E, 0x69, 0x74, + 0x01, 0x00, 0x6C, 0x69, 0x67, 0x61, 0x01, 0x06, 0x6D, 0x65, 0x64, 0x69, 0x01, 0x0C, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x08, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x13, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x14, 0x00, 0x15, 0x00, 0x00, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x1B, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x20, 0x00, 0x21, 0x00, 0x00, 0x00, 0x02, 0x00, 0x22, 0x00, 0x23, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x24, 0x00, 0x4A, 0x00, 0xC0, 0x01, 0x22, 0x01, 0xEC, + 0x02, 0xB6, 0x03, 0xF0, 0x14, 0xFE, 0x15, 0x26, 0x15, 0x4C, 0x17, 0xFE, 0x1A, 0x74, 0x1A, 0xB0, + 0x1A, 0xE0, 0x4E, 0xDA, 0x8B, 0xBC, 0x8D, 0x2A, 0x8E, 0x4A, 0x8E, 0xA0, 0x8E, 0xFC, 0x90, 0xA2, + 0x91, 0xEA, 0xB1, 0xA2, 0xD5, 0x1E, 0xD5, 0x54, 0xD5, 0x84, 0xD5, 0xA4, 0xD5, 0xC0, 0xD5, 0xF0, + 0xD6, 0x20, 0xD6, 0x68, 0xD6, 0xBA, 0xD6, 0xFE, 0xD7, 0x38, 0xD7, 0x58, 0xD7, 0x74, 0xD8, 0x20, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x5E, 0x00, 0x06, 0x00, 0x12, + 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, + 0x00, 0x14, 0x06, 0x22, 0x00, 0x02, 0x06, 0x53, 0x06, 0x23, 0x00, 0x02, 0x06, 0x54, 0x06, 0x25, + 0x00, 0x02, 0x06, 0x55, 0x00, 0x01, 0x00, 0x04, 0x06, 0x24, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, + 0x00, 0x04, 0x06, 0x26, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xC2, 0x00, 0x02, + 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xD3, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, + 0x06, 0xC0, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x06, 0x06, 0x27, 0x06, 0x48, 0x06, 0x4A, + 0x06, 0xC1, 0x06, 0xD2, 0x06, 0xD5, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x46, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, + 0x00, 0x3A, 0x00, 0x40, 0x00, 0x02, 0x06, 0x27, 0x06, 0x53, 0x00, 0x02, 0x06, 0x27, 0x06, 0x54, + 0x00, 0x02, 0x06, 0x48, 0x06, 0x54, 0x00, 0x02, 0x06, 0x27, 0x06, 0x55, 0x00, 0x02, 0x06, 0x4A, + 0x06, 0x54, 0x00, 0x02, 0x06, 0xD5, 0x06, 0x54, 0x00, 0x02, 0x06, 0xC1, 0x06, 0x54, 0x00, 0x02, + 0x06, 0xD2, 0x06, 0x54, 0x00, 0x01, 0x00, 0x08, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, + 0x06, 0x26, 0x06, 0xC0, 0x06, 0xC2, 0x06, 0xD3, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8B, 0xFE, 0x91, 0xFE, 0x97, 0xFE, 0x9B, 0xFE, 0x9F, + 0xFE, 0xA3, 0xFE, 0xA7, 0xFE, 0xB3, 0xFE, 0xB7, 0xFE, 0xBB, 0xFE, 0xBF, 0xFE, 0xC3, 0xFE, 0xC7, + 0xFE, 0xCB, 0xFE, 0xCF, 0xFE, 0xD3, 0xFE, 0xD7, 0xFE, 0xDB, 0xFE, 0xDF, 0xFE, 0xE3, 0xFE, 0xE7, + 0xFE, 0xEB, 0xFB, 0xE8, 0xFE, 0xF3, 0xFB, 0x68, 0xFB, 0x60, 0xFB, 0x54, 0xFB, 0x58, 0xFB, 0x64, + 0xFB, 0x5C, 0xFB, 0x78, 0xFB, 0x74, 0xFB, 0x7C, 0xFB, 0x80, 0xFB, 0x6C, 0xFB, 0x70, 0xFB, 0x90, + 0xFB, 0xD5, 0xFB, 0x94, 0xFB, 0x9C, 0xFB, 0x98, 0xFB, 0xA2, 0xFB, 0xAC, 0xFB, 0xA8, 0xFB, 0xFE, + 0xFB, 0xE6, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, + 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, + 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, + 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, + 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, + 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC, + 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, + 0xFE, 0x8C, 0xFE, 0x92, 0xFE, 0x98, 0xFE, 0x9C, 0xFE, 0xA0, 0xFE, 0xA4, 0xFE, 0xA8, 0xFE, 0xB4, + 0xFE, 0xB8, 0xFE, 0xBC, 0xFE, 0xC0, 0xFE, 0xC4, 0xFE, 0xC8, 0xFE, 0xCC, 0xFE, 0xD0, 0xFE, 0xD4, + 0xFE, 0xD8, 0xFE, 0xDC, 0xFE, 0xE0, 0xFE, 0xE4, 0xFE, 0xE8, 0xFE, 0xEC, 0xFB, 0xE9, 0xFE, 0xF4, + 0xFB, 0x69, 0xFB, 0x61, 0xFB, 0x55, 0xFB, 0x59, 0xFB, 0x65, 0xFB, 0x5D, 0xFB, 0x79, 0xFB, 0x75, + 0xFB, 0x7D, 0xFB, 0x81, 0xFB, 0x6D, 0xFB, 0x71, 0xFB, 0x91, 0xFB, 0xD6, 0xFB, 0x95, 0xFB, 0x9D, + 0xFB, 0x99, 0xFB, 0xA3, 0xFB, 0xAD, 0xFB, 0xA9, 0xFB, 0xFF, 0xFB, 0xE7, 0x00, 0x01, 0x00, 0x2E, + 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, + 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, + 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, + 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, + 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, + 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x9A, 0x00, 0x4A, 0xFE, 0x82, 0xFE, 0x84, 0xFE, 0x86, + 0xFE, 0x88, 0xFE, 0x8A, 0xFE, 0x8E, 0xFE, 0x90, 0xFE, 0x94, 0xFE, 0x96, 0xFE, 0x9A, 0xFE, 0x9E, + 0xFE, 0xA2, 0xFE, 0xA6, 0xFE, 0xAA, 0xFE, 0xAC, 0xFE, 0xAE, 0xFE, 0xB0, 0xFE, 0xB2, 0xFE, 0xB6, + 0xFE, 0xBA, 0xFE, 0xBE, 0xFE, 0xC2, 0xFE, 0xC6, 0xFE, 0xCA, 0xFE, 0xCE, 0xFE, 0xD2, 0xFE, 0xD6, + 0xFE, 0xDA, 0xFE, 0xDE, 0xFE, 0xE2, 0xFE, 0xE6, 0xFE, 0xEA, 0xFE, 0xEE, 0xFE, 0xF0, 0xFE, 0xF2, + 0xFB, 0x51, 0xFB, 0x67, 0xFB, 0x5F, 0xFB, 0x53, 0xFB, 0x57, 0xFB, 0x63, 0xFB, 0x5B, 0xFB, 0x77, + 0xFB, 0x73, 0xFB, 0x7B, 0xFB, 0x7F, 0xFB, 0x89, 0xFB, 0x85, 0xFB, 0x83, 0xFB, 0x87, 0xFB, 0x8D, + 0xFB, 0x8B, 0xFB, 0x6B, 0xFB, 0x6F, 0xFB, 0x8F, 0xFB, 0xD4, 0xFB, 0x93, 0xFB, 0x9B, 0xFB, 0x97, + 0xFB, 0x9F, 0xFB, 0xA1, 0xFB, 0xAB, 0xFB, 0xA5, 0xFB, 0xA7, 0xFB, 0xE1, 0xFB, 0xDA, 0xFB, 0xD8, + 0xFB, 0xDC, 0xFB, 0xE3, 0xFB, 0xDF, 0xFB, 0xFD, 0xFB, 0xE5, 0xFB, 0xAF, 0xFB, 0xB1, 0x00, 0x01, + 0x00, 0x4A, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, + 0x06, 0x29, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x2F, 0x06, 0x30, + 0x06, 0x31, 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, + 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, + 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x71, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, + 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0x88, + 0x06, 0x8C, 0x06, 0x8D, 0x06, 0x8E, 0x06, 0x91, 0x06, 0x98, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, + 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBA, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC0, + 0x06, 0xC1, 0x06, 0xC5, 0x06, 0xC6, 0x06, 0xC7, 0x06, 0xC8, 0x06, 0xC9, 0x06, 0xCB, 0x06, 0xCC, + 0x06, 0xD0, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x10, 0x98, 0x00, 0x35, 0x00, 0x70, 0x00, 0x7A, 0x01, 0x0C, 0x01, 0x86, 0x01, 0xA8, 0x01, 0xB2, + 0x02, 0x0C, 0x02, 0x62, 0x03, 0x02, 0x03, 0x8A, 0x03, 0xB4, 0x03, 0xF6, 0x04, 0x46, 0x04, 0x8A, + 0x04, 0xBC, 0x04, 0xEC, 0x05, 0x26, 0x05, 0x38, 0x05, 0x42, 0x05, 0x64, 0x05, 0xF8, 0x06, 0x6C, + 0x06, 0xEC, 0x07, 0x80, 0x08, 0x1E, 0x08, 0x56, 0x08, 0xBA, 0x08, 0xF2, 0x09, 0x38, 0x09, 0x66, + 0x09, 0x78, 0x09, 0x82, 0x09, 0xD4, 0x0A, 0x0E, 0x0A, 0x40, 0x0A, 0x70, 0x0A, 0xCC, 0x0A, 0xF2, + 0x0B, 0x38, 0x0B, 0x68, 0x0B, 0xDC, 0x0C, 0x2A, 0x0C, 0xD6, 0x0D, 0x72, 0x0E, 0x16, 0x0E, 0x50, + 0x0E, 0xC8, 0x0F, 0x5A, 0x0F, 0xA8, 0x0F, 0xB6, 0x0F, 0xC0, 0x0F, 0xCA, 0x10, 0x2E, 0x00, 0x01, + 0x00, 0x04, 0xFB, 0xDD, 0x00, 0x02, 0x06, 0x74, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, + 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, + 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0xFB, 0xEC, + 0x00, 0x02, 0x00, 0x01, 0xFB, 0xF0, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF2, 0x00, 0x02, 0xFB, 0xDA, + 0xFB, 0xF4, 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF6, 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xF8, 0x00, 0x02, + 0xFB, 0xE7, 0xFB, 0xEA, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x00, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x97, + 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x01, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x98, 0x00, 0x02, 0xFE, 0xA4, + 0xFC, 0x99, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x02, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9A, 0x00, 0x02, + 0xFE, 0xE4, 0xFC, 0x9B, 0x00, 0x02, 0xFE, 0xEC, 0xFB, 0xEE, 0x00, 0x02, 0xFE, 0xEE, 0xFB, 0xF9, + 0x00, 0x02, 0xFE, 0xF0, 0xFB, 0xFB, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, + 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, + 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0xFB, 0xED, 0x00, 0x02, 0x00, 0x01, + 0xFB, 0xF1, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF3, 0x00, 0x02, 0xFB, 0xDA, 0xFB, 0xF5, 0x00, 0x02, + 0xFB, 0xDC, 0xFB, 0xF7, 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xEB, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x64, + 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x65, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x66, 0x00, 0x02, 0xFE, 0xE2, + 0xFC, 0xDF, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x67, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE0, 0x00, 0x02, + 0xFE, 0xEC, 0xFB, 0xEF, 0x00, 0x02, 0xFE, 0xEE, 0xFB, 0xFA, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x69, + 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x18, 0xFD, 0x3D, 0x00, 0x02, + 0x06, 0x4B, 0xFD, 0xF3, 0x00, 0x04, 0xFE, 0xDB, 0xFE, 0x92, 0xFE, 0xAE, 0xFD, 0xF2, 0x00, 0x04, + 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x01, 0x00, 0x04, 0xFD, 0x3C, 0x00, 0x02, 0x06, 0x4B, + 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, + 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0xFC, 0x05, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x9C, + 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x06, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x9D, 0x00, 0x02, 0xFE, 0xA4, + 0xFC, 0x07, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0x9E, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x08, 0x00, 0x02, + 0xFE, 0xE2, 0xFC, 0x9F, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA0, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x09, + 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x0A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, + 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, + 0xFD, 0xC2, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x9E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, + 0xFC, 0x6A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x6B, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x6C, 0x00, 0x02, + 0xFE, 0xE2, 0xFC, 0xE1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x6D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE2, + 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x6E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x6F, 0x00, 0x02, 0xFE, 0xF2, + 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, + 0x00, 0x56, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, + 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9A, 0xFC, 0x0B, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x50, 0x00, 0x03, + 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xA1, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x0C, 0x00, 0x02, 0xFE, 0xA2, + 0xFD, 0x52, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFD, 0x53, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, + 0xFC, 0xA2, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x0D, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x54, 0x00, 0x03, + 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xA3, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x0E, 0x00, 0x02, 0xFE, 0xE2, + 0xFD, 0x55, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x56, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, + 0xFD, 0x57, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8, 0xFC, 0xA4, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA5, + 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x0F, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x10, 0x00, 0x02, 0xFE, 0xF2, + 0x00, 0x0F, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, + 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, + 0xFD, 0xA0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0x9F, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, + 0xFD, 0x51, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0x9E, 0xFD, 0xA2, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, + 0xFD, 0xA1, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x70, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x71, + 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x72, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xA4, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xF0, 0xFD, 0xA3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xE3, 0x00, 0x02, 0xFE, 0xE4, + 0xFC, 0x73, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE4, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x74, 0x00, 0x02, + 0xFE, 0xF0, 0xFC, 0x75, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x24, 0xFC, 0x11, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x12, 0x00, 0x02, 0xFE, 0xE2, + 0xFC, 0xA6, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x13, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x14, 0x00, 0x02, + 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, + 0x00, 0x36, 0x00, 0x3C, 0xFC, 0x76, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x77, 0x00, 0x02, 0xFE, 0xB0, + 0xFC, 0x78, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE5, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x79, 0x00, 0x02, + 0xFE, 0xE6, 0xFC, 0xE6, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x7A, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7B, + 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x36, + 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0xFC, 0x15, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xA7, 0x00, 0x02, + 0xFE, 0xA4, 0xFD, 0xFB, 0x00, 0x08, 0xFE, 0xDE, 0x00, 0x20, 0xFE, 0x9F, 0xFE, 0xE0, 0xFE, 0x8E, + 0xFE, 0xDF, 0xFE, 0xEA, 0xFC, 0x16, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x59, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xA4, 0xFC, 0xA8, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x01, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x02, + 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x18, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, + 0x00, 0x38, 0x00, 0x3E, 0xFD, 0xA6, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xBE, 0x00, 0x03, + 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x58, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xA7, 0x00, 0x03, + 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA5, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1D, 0x00, 0x02, + 0xFE, 0xF0, 0xFD, 0x1E, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, + 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x17, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xA9, 0x00, 0x02, + 0xFE, 0xA0, 0xFC, 0x18, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xAA, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xFF, + 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x00, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, + 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0xBF, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x5B, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x5A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1B, + 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1C, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, + 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0xFC, 0x19, 0x00, 0x02, 0xFE, 0x9E, + 0xFC, 0xAB, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1A, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x1B, 0x00, 0x02, + 0xFE, 0xE2, 0xFC, 0xAC, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x03, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x04, + 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFD, 0x1F, 0x00, 0x02, 0xFE, 0xF0, + 0xFD, 0x20, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x5B, 0x00, 0x02, 0x06, 0x70, + 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x18, 0xFC, 0x5C, 0x00, 0x02, 0x06, 0x70, 0xFD, 0xFC, + 0x00, 0x04, 0xFB, 0xFE, 0xFE, 0x8E, 0xFE, 0xDD, 0xFD, 0xF6, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xEE, + 0xFE, 0xDD, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, + 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, + 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFC, 0x1C, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x5D, 0x00, 0x03, + 0xFE, 0xA0, 0xFE, 0xA4, 0xFC, 0xAD, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1D, 0x00, 0x02, 0xFE, 0xA2, + 0xFD, 0x5C, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFC, 0xAE, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x1E, + 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xAF, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0E, 0x00, 0x02, 0xFE, 0xAE, + 0xFC, 0x1F, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x61, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x60, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x63, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB0, + 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x31, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFB, 0x00, 0x02, 0xFE, 0xF0, + 0xFC, 0xFC, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, + 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, + 0x00, 0x6E, 0xFD, 0x5E, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0x34, 0x00, 0x02, 0xFE, 0xA0, + 0xFD, 0x35, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xA8, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xC6, + 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFD, 0x36, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x2A, 0x00, 0x02, + 0xFE, 0xAE, 0xFD, 0x5F, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x62, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xE2, 0xFC, 0xE7, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xE8, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x17, + 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x18, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, + 0x00, 0x2C, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, + 0x00, 0x60, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0xFD, 0x09, 0x00, 0x02, 0xFE, 0x9E, + 0xFD, 0x2D, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x0A, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x68, 0x00, 0x03, + 0xFE, 0xA4, 0xFE, 0xE4, 0xFD, 0x2E, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x0B, 0x00, 0x02, 0xFE, 0xA6, + 0xFD, 0x2F, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0D, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x0C, 0x00, 0x02, + 0xFE, 0xE2, 0xFD, 0x6B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8, 0xFD, 0x6D, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xE4, 0xFD, 0x30, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x32, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFD, + 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFE, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, + 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, + 0x00, 0x66, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFD, 0x25, + 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x69, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x37, 0x00, 0x02, + 0xFE, 0xA0, 0xFD, 0x26, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x67, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, + 0xFD, 0xAA, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x38, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x27, + 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x39, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x29, 0x00, 0x02, 0xFE, 0xAE, + 0xFD, 0x28, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x6A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA6, 0xFD, 0x6C, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFC, 0xE9, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xEA, 0x00, 0x02, + 0xFE, 0xEC, 0xFD, 0x19, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, + 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x50, + 0x00, 0x76, 0x00, 0x7E, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0xFC, 0x20, 0x00, 0x02, + 0xFE, 0xA2, 0xFD, 0x65, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA4, 0xFC, 0xB1, 0x00, 0x02, 0xFE, 0xA4, + 0xFC, 0xB2, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0F, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0xF0, 0x00, 0x03, + 0xFE, 0xE0, 0xFB, 0xAF, 0xFD, 0xF5, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xCC, 0xFE, 0xE2, 0xFD, 0xFA, + 0x00, 0x12, 0xFE, 0xE0, 0xFE, 0xF0, 0x00, 0x20, 0xFE, 0x8D, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, + 0x00, 0x20, 0xFE, 0xCB, 0xFE, 0xE0, 0xFE, 0xF4, 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xED, 0xFE, 0xB3, + 0xFE, 0xE0, 0xFE, 0xE2, 0xFD, 0xF9, 0x00, 0x03, 0xFE, 0xE0, 0xFE, 0xF0, 0xFC, 0x21, 0x00, 0x02, + 0xFE, 0xE2, 0xFD, 0xC5, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB3, 0x00, 0x02, 0xFE, 0xE4, + 0xFD, 0x05, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x06, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, + 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x64, 0x00, 0x03, 0xFE, 0xA4, + 0xFE, 0xA2, 0xFD, 0xA9, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x2B, 0x00, 0x02, 0xFE, 0xAE, + 0xFD, 0x66, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x21, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x22, + 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, + 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x22, + 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xB4, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x23, 0x00, 0x02, 0xFE, 0xA2, + 0xFC, 0xB5, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x24, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x70, 0x00, 0x03, + 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xB6, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x10, 0x00, 0x02, 0xFE, 0xAE, + 0xFC, 0x25, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xB7, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x07, 0x00, 0x02, + 0xFE, 0xF0, 0xFD, 0x08, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, + 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x6E, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xAB, + 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x6F, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0x2C, + 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x23, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x24, 0x00, 0x02, 0xFE, 0xF2, + 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, + 0x00, 0x40, 0xFC, 0x26, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xB8, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x27, + 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x72, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x73, 0x00, 0x03, + 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x33, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF5, 0x00, 0x02, 0xFE, 0xF0, + 0xFC, 0xF6, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22, + 0x00, 0x28, 0xFD, 0x71, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x74, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xF2, 0xFD, 0x3A, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x11, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x12, + 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFC, 0x28, 0x00, 0x02, 0xFE, 0xE2, + 0xFC, 0xB9, 0x00, 0x02, 0xFE, 0xE4, 0x00, 0x01, 0x00, 0x04, 0xFD, 0x3B, 0x00, 0x02, 0xFE, 0xE4, + 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40, + 0x00, 0x46, 0x00, 0x4C, 0xFC, 0x29, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0xC4, 0x00, 0x03, 0xFE, 0xA0, + 0xFE, 0xE4, 0xFC, 0xBA, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0xF7, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xF4, + 0xFE, 0xEA, 0xFC, 0x2A, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x77, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, + 0xFC, 0xBB, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF7, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF8, 0x00, 0x02, + 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x34, + 0xFD, 0x75, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0x76, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, + 0xFD, 0x78, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xB6, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, + 0xFD, 0x13, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x14, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, + 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x2B, 0x00, 0x02, 0xFE, 0x9E, + 0xFC, 0xBC, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x2C, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xBD, 0x00, 0x02, + 0xFE, 0xE4, 0xFC, 0xF9, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFA, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, + 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0x79, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xE2, 0xFD, 0x7B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x7A, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xF2, 0xFD, 0x15, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x16, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0B, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44, + 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0xFC, 0x2D, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBE, 0x00, 0x02, + 0xFE, 0xA0, 0xFC, 0x2E, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xBF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x2F, + 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x7D, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xC0, 0x00, 0x02, + 0xFE, 0xA8, 0xFC, 0x30, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xC1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x31, + 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x32, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, + 0x00, 0x1A, 0x00, 0x20, 0xFD, 0x7C, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0xC1, 0x00, 0x03, + 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7C, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7D, 0x00, 0x02, 0xFE, 0xF2, + 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, + 0x00, 0x40, 0xFC, 0x33, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC2, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xF1, + 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, 0xFC, 0x34, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB4, 0x00, 0x03, + 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xC3, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x35, 0x00, 0x02, 0xFE, 0xF0, + 0xFC, 0x36, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, + 0x00, 0x2A, 0xFD, 0x7E, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x7F, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xE2, 0xFD, 0xB2, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7E, 0x00, 0x02, 0xFE, 0xF0, + 0xFC, 0x7F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, + 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, + 0x00, 0x68, 0x00, 0x6E, 0xFC, 0x37, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x38, 0x00, 0x02, 0xFE, 0x9E, + 0xFC, 0xC4, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x39, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC5, 0x00, 0x02, + 0xFE, 0xA4, 0xFC, 0x3A, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xC6, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x3B, + 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xC7, 0x00, 0x02, 0xFE, 0xE0, 0xFC, 0x3C, 0x00, 0x02, 0xFE, 0xE2, + 0xFD, 0xC3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xC8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x3D, + 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x3E, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, + 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0x80, + 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x81, 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xEB, 0x00, 0x02, 0xFE, 0xE0, + 0xFC, 0x82, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xBB, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB7, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEC, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x83, 0x00, 0x02, + 0xFE, 0xF0, 0xFC, 0x84, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, + 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, + 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, + 0x00, 0xA6, 0xFE, 0xF5, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF7, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xF9, + 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFB, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x3F, 0x00, 0x02, 0xFE, 0x9E, + 0xFD, 0x83, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA0, 0xFD, 0xBA, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, + 0xFC, 0xC9, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x40, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0xB5, 0x00, 0x03, + 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCA, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x41, 0x00, 0x02, 0xFE, 0xA6, + 0xFD, 0x86, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xCB, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x42, + 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x88, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xCC, 0x00, 0x02, + 0xFE, 0xE4, 0xFC, 0xCD, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x43, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x44, + 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, + 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A, + 0x00, 0x82, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, 0xFE, 0xF6, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF8, + 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xFA, 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFC, 0x00, 0x02, 0xFE, 0x8E, + 0xFD, 0x84, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0x9E, 0xFD, 0xBC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, + 0xFD, 0xAC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x80, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, + 0xFD, 0x82, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0x81, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, + 0xFD, 0x85, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFC, 0x85, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x87, + 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xAD, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xED, + 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x86, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x87, 0x00, 0x02, 0xFE, 0xF2, + 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, + 0x00, 0x58, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8C, + 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0xFC, 0x45, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x8C, 0x00, 0x03, + 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x92, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA8, 0xFD, 0x8D, 0x00, 0x03, + 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xCE, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x46, 0x00, 0x02, 0xFE, 0xA2, + 0xFD, 0x89, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFD, 0xF4, 0x00, 0x04, 0xFE, 0xA4, 0xFE, 0xE4, + 0xFE, 0xAA, 0xFD, 0x8A, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCF, 0x00, 0x02, 0xFE, 0xA4, + 0xFC, 0x47, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x8E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xA0, 0xFD, 0x8F, + 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xD0, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x48, 0x00, 0x02, + 0xFE, 0xE2, 0xFC, 0xD1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x49, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x4A, + 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C, + 0x00, 0x32, 0xFC, 0x88, 0x00, 0x02, 0xFE, 0x8E, 0xFD, 0xC0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, + 0xFD, 0x8B, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0xB9, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, + 0xFC, 0x89, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB1, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0x00, 0x0E, + 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, + 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x72, 0xFC, 0x4B, 0x00, 0x02, + 0xFE, 0x9E, 0xFD, 0xB8, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x98, 0x00, 0x03, 0xFE, 0xA0, + 0xFE, 0xE4, 0xFC, 0xD2, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x4C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x95, + 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xD3, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x4D, 0x00, 0x02, + 0xFE, 0xA6, 0xFC, 0xD4, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x4E, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD5, + 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xD6, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x4F, 0x00, 0x02, 0xFE, 0xF0, + 0xFC, 0x50, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x3A, + 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, + 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0xFD, 0xBD, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA2, + 0xFD, 0x97, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0x99, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, + 0xFD, 0xC7, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x96, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, + 0xFD, 0xB3, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFC, 0x8A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x8B, + 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x8C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9B, 0x00, 0x03, 0xFE, 0xE4, + 0xFE, 0xF0, 0xFD, 0x9A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEE, 0x00, 0x02, 0xFE, 0xE4, + 0xFC, 0x8D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xEF, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x8E, 0x00, 0x02, + 0xFE, 0xF0, 0xFC, 0x8F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, + 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0xD9, 0x00, 0x02, + 0x06, 0x70, 0xFC, 0x51, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xD7, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x52, + 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x93, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x94, 0x00, 0x03, + 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xD8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x53, 0x00, 0x02, 0xFE, 0xF0, + 0xFC, 0x54, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x04, 0xFD, 0xF8, 0x00, 0x04, 0xFE, 0xB3, + 0xFE, 0xE0, 0xFE, 0xE2, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x5D, 0x00, 0x02, 0x06, 0x70, 0x00, 0x01, + 0x00, 0x04, 0xFC, 0x90, 0x00, 0x02, 0x06, 0x70, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, + 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, + 0x00, 0x5E, 0xFC, 0x55, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xDA, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x56, + 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xDB, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x57, 0x00, 0x02, 0xFE, 0xA6, + 0xFC, 0xDC, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x58, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9D, 0x00, 0x03, + 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xDD, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xDE, 0x00, 0x02, 0xFE, 0xEC, + 0xFC, 0x59, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x5A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, + 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, + 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0xFD, 0xAF, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0xAE, + 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFC, 0x91, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x92, 0x00, 0x02, + 0xFE, 0xB0, 0xFC, 0x93, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, + 0xFD, 0xB0, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xF0, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x94, + 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xF1, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x95, 0x00, 0x02, 0xFE, 0xF0, + 0xFC, 0x96, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x35, 0xFB, 0xD7, 0xFE, 0x8B, 0xFE, 0x8C, + 0xFE, 0x8D, 0xFE, 0x8E, 0xFE, 0x91, 0xFE, 0x92, 0xFE, 0x97, 0xFE, 0x98, 0xFE, 0x9B, 0xFE, 0x9C, + 0xFE, 0x9F, 0xFE, 0xA0, 0xFE, 0xA3, 0xFE, 0xA4, 0xFE, 0xA7, 0xFE, 0xA8, 0xFE, 0xAB, 0xFE, 0xAD, + 0xFE, 0xB3, 0xFE, 0xB4, 0xFE, 0xB7, 0xFE, 0xB8, 0xFE, 0xBB, 0xFE, 0xBC, 0xFE, 0xBF, 0xFE, 0xC0, + 0xFE, 0xC3, 0xFE, 0xC4, 0xFE, 0xC7, 0xFE, 0xC8, 0xFE, 0xCB, 0xFE, 0xCC, 0xFE, 0xCF, 0xFE, 0xD0, + 0xFE, 0xD3, 0xFE, 0xD4, 0xFE, 0xD7, 0xFE, 0xD8, 0xFE, 0xDB, 0xFE, 0xDC, 0xFE, 0xDF, 0xFE, 0xE0, + 0xFE, 0xE3, 0xFE, 0xE4, 0xFE, 0xE7, 0xFE, 0xE8, 0xFE, 0xEB, 0xFE, 0xED, 0xFE, 0xEF, 0xFE, 0xF0, + 0xFE, 0xF3, 0xFE, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1A, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x09, 0xCB, 0x00, 0x02, 0x09, 0xBE, + 0x09, 0xCC, 0x00, 0x02, 0x09, 0xD7, 0x00, 0x01, 0x00, 0x01, 0x09, 0xC7, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x16, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x02, + 0x09, 0xC7, 0x09, 0xBE, 0x00, 0x02, 0x09, 0xC7, 0x09, 0xD7, 0x00, 0x01, 0x00, 0x02, 0x09, 0xCB, + 0x09, 0xCC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x02, 0x66, 0x00, 0x20, + 0x00, 0x46, 0x00, 0x50, 0x00, 0x62, 0x00, 0x74, 0x00, 0x96, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xDC, + 0x00, 0xEE, 0x00, 0xF8, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, 0x01, 0x38, 0x01, 0x4A, 0x01, 0x5C, + 0x01, 0x7E, 0x01, 0x90, 0x01, 0x9A, 0x01, 0xC4, 0x01, 0xD6, 0x01, 0xE0, 0x02, 0x02, 0x02, 0x0C, + 0x02, 0x16, 0x02, 0x20, 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3E, 0x02, 0x48, 0x02, 0x52, 0x02, 0x5C, + 0x00, 0x01, 0x00, 0x04, 0x04, 0x07, 0x00, 0x02, 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0x04, 0xD0, 0x00, 0x02, 0x03, 0x06, 0x04, 0xD2, 0x00, 0x02, 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0C, 0x04, 0x03, 0x00, 0x02, 0x03, 0x01, 0x04, 0x03, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, + 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, 0x04, 0xD6, + 0x00, 0x02, 0x03, 0x06, 0x04, 0x01, 0x00, 0x02, 0x03, 0x08, 0x04, 0x00, 0x00, 0x02, 0x03, 0x40, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0xC1, 0x00, 0x02, 0x03, 0x06, 0x04, 0xDC, 0x00, 0x02, + 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDE, 0x00, 0x02, 0x03, 0x08, 0x00, 0x05, 0x00, 0x0C, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x04, 0x0D, 0x00, 0x02, 0x03, 0x00, 0x04, 0xE2, + 0x00, 0x02, 0x03, 0x04, 0x04, 0x19, 0x00, 0x02, 0x03, 0x06, 0x04, 0xE4, 0x00, 0x02, 0x03, 0x08, + 0x04, 0x0D, 0x00, 0x02, 0x03, 0x40, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0x0C, 0x00, 0x02, + 0x03, 0x01, 0x04, 0x0C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x04, 0xE6, 0x00, 0x02, + 0x03, 0x08, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x04, 0xEE, 0x00, 0x02, + 0x03, 0x04, 0x04, 0x0E, 0x00, 0x02, 0x03, 0x06, 0x04, 0xF0, 0x00, 0x02, 0x03, 0x08, 0x04, 0xF2, + 0x00, 0x02, 0x03, 0x0B, 0x00, 0x01, 0x00, 0x04, 0x04, 0xF4, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, + 0x00, 0x04, 0x04, 0xF8, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xEC, 0x00, 0x02, + 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0xD1, 0x00, 0x02, 0x03, 0x06, 0x04, 0xD3, + 0x00, 0x02, 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0x53, 0x00, 0x02, 0x03, 0x01, + 0x04, 0x53, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x04, 0x50, 0x00, 0x02, 0x03, 0x00, 0x04, 0xD7, 0x00, 0x02, 0x03, 0x06, 0x04, 0x51, 0x00, 0x02, + 0x03, 0x08, 0x04, 0x50, 0x00, 0x02, 0x03, 0x40, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0xC2, + 0x00, 0x02, 0x03, 0x06, 0x04, 0xDD, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDF, + 0x00, 0x02, 0x03, 0x08, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, + 0x04, 0x5D, 0x00, 0x02, 0x03, 0x00, 0x04, 0xE3, 0x00, 0x02, 0x03, 0x04, 0x04, 0x39, 0x00, 0x02, + 0x03, 0x06, 0x04, 0xE5, 0x00, 0x02, 0x03, 0x08, 0x04, 0x5D, 0x00, 0x02, 0x03, 0x40, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0C, 0x04, 0x5C, 0x00, 0x02, 0x03, 0x01, 0x04, 0x5C, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x01, 0x00, 0x04, 0x04, 0xE7, 0x00, 0x02, 0x03, 0x08, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x04, 0xEF, 0x00, 0x02, 0x03, 0x04, 0x04, 0x5E, 0x00, 0x02, 0x03, 0x06, + 0x04, 0xF1, 0x00, 0x02, 0x03, 0x08, 0x04, 0xF3, 0x00, 0x02, 0x03, 0x0B, 0x00, 0x01, 0x00, 0x04, + 0x04, 0xF5, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xF9, 0x00, 0x02, 0x03, 0x08, + 0x00, 0x01, 0x00, 0x04, 0x04, 0xED, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0x57, + 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0x76, 0x00, 0x02, 0x03, 0x0F, 0x00, 0x01, + 0x00, 0x04, 0x04, 0x77, 0x00, 0x02, 0x03, 0x0F, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDA, 0x00, 0x02, + 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDB, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, + 0x04, 0xEA, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xEB, 0x00, 0x02, 0x03, 0x08, + 0x00, 0x01, 0x00, 0x20, 0x04, 0x06, 0x04, 0x10, 0x04, 0x13, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, + 0x04, 0x18, 0x04, 0x1A, 0x04, 0x1E, 0x04, 0x23, 0x04, 0x27, 0x04, 0x2B, 0x04, 0x2D, 0x04, 0x30, + 0x04, 0x33, 0x04, 0x35, 0x04, 0x36, 0x04, 0x37, 0x04, 0x38, 0x04, 0x3A, 0x04, 0x3E, 0x04, 0x43, + 0x04, 0x47, 0x04, 0x4B, 0x04, 0x4D, 0x04, 0x56, 0x04, 0x74, 0x04, 0x75, 0x04, 0xD8, 0x04, 0xD9, + 0x04, 0xE8, 0x04, 0xE9, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x02, 0x1C, 0x00, 0x01, + 0x01, 0xA6, 0x00, 0x34, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, + 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, + 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, + 0x00, 0xF2, 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0A, 0x01, 0x10, 0x01, 0x16, 0x01, 0x1C, + 0x01, 0x22, 0x01, 0x28, 0x01, 0x2E, 0x01, 0x34, 0x01, 0x3A, 0x01, 0x40, 0x01, 0x46, 0x01, 0x4C, + 0x01, 0x52, 0x01, 0x58, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7C, + 0x01, 0x82, 0x01, 0x88, 0x01, 0x8E, 0x01, 0x94, 0x01, 0x9A, 0x01, 0xA0, 0x00, 0x02, 0x04, 0x15, + 0x03, 0x00, 0x00, 0x02, 0x04, 0x15, 0x03, 0x08, 0x00, 0x02, 0x04, 0x13, 0x03, 0x01, 0x00, 0x02, + 0x04, 0x06, 0x03, 0x08, 0x00, 0x02, 0x04, 0x1A, 0x03, 0x01, 0x00, 0x02, 0x04, 0x18, 0x03, 0x00, + 0x00, 0x02, 0x04, 0x23, 0x03, 0x06, 0x00, 0x02, 0x04, 0x18, 0x03, 0x06, 0x00, 0x02, 0x04, 0x38, + 0x03, 0x06, 0x00, 0x02, 0x04, 0x35, 0x03, 0x00, 0x00, 0x02, 0x04, 0x35, 0x03, 0x08, 0x00, 0x02, + 0x04, 0x33, 0x03, 0x01, 0x00, 0x02, 0x04, 0x56, 0x03, 0x08, 0x00, 0x02, 0x04, 0x3A, 0x03, 0x01, + 0x00, 0x02, 0x04, 0x38, 0x03, 0x00, 0x00, 0x02, 0x04, 0x43, 0x03, 0x06, 0x00, 0x02, 0x04, 0x74, + 0x03, 0x0F, 0x00, 0x02, 0x04, 0x75, 0x03, 0x0F, 0x00, 0x02, 0x04, 0x16, 0x03, 0x06, 0x00, 0x02, + 0x04, 0x36, 0x03, 0x06, 0x00, 0x02, 0x04, 0x10, 0x03, 0x06, 0x00, 0x02, 0x04, 0x30, 0x03, 0x06, + 0x00, 0x02, 0x04, 0x10, 0x03, 0x08, 0x00, 0x02, 0x04, 0x30, 0x03, 0x08, 0x00, 0x02, 0x04, 0x15, + 0x03, 0x06, 0x00, 0x02, 0x04, 0x35, 0x03, 0x06, 0x00, 0x02, 0x04, 0xD8, 0x03, 0x08, 0x00, 0x02, + 0x04, 0xD9, 0x03, 0x08, 0x00, 0x02, 0x04, 0x16, 0x03, 0x08, 0x00, 0x02, 0x04, 0x36, 0x03, 0x08, + 0x00, 0x02, 0x04, 0x17, 0x03, 0x08, 0x00, 0x02, 0x04, 0x37, 0x03, 0x08, 0x00, 0x02, 0x04, 0x18, + 0x03, 0x04, 0x00, 0x02, 0x04, 0x38, 0x03, 0x04, 0x00, 0x02, 0x04, 0x18, 0x03, 0x08, 0x00, 0x02, + 0x04, 0x38, 0x03, 0x08, 0x00, 0x02, 0x04, 0x1E, 0x03, 0x08, 0x00, 0x02, 0x04, 0x3E, 0x03, 0x08, + 0x00, 0x02, 0x04, 0xE8, 0x03, 0x08, 0x00, 0x02, 0x04, 0xE9, 0x03, 0x08, 0x00, 0x02, 0x04, 0x2D, + 0x03, 0x08, 0x00, 0x02, 0x04, 0x4D, 0x03, 0x08, 0x00, 0x02, 0x04, 0x23, 0x03, 0x04, 0x00, 0x02, + 0x04, 0x43, 0x03, 0x04, 0x00, 0x02, 0x04, 0x23, 0x03, 0x08, 0x00, 0x02, 0x04, 0x43, 0x03, 0x08, + 0x00, 0x02, 0x04, 0x23, 0x03, 0x0B, 0x00, 0x02, 0x04, 0x43, 0x03, 0x0B, 0x00, 0x02, 0x04, 0x27, + 0x03, 0x08, 0x00, 0x02, 0x04, 0x47, 0x03, 0x08, 0x00, 0x02, 0x04, 0x2B, 0x03, 0x08, 0x00, 0x02, + 0x04, 0x4B, 0x03, 0x08, 0x00, 0x01, 0x00, 0x34, 0x04, 0x00, 0x04, 0x01, 0x04, 0x03, 0x04, 0x07, + 0x04, 0x0C, 0x04, 0x0D, 0x04, 0x0E, 0x04, 0x19, 0x04, 0x39, 0x04, 0x50, 0x04, 0x51, 0x04, 0x53, + 0x04, 0x57, 0x04, 0x5C, 0x04, 0x5D, 0x04, 0x5E, 0x04, 0x76, 0x04, 0x77, 0x04, 0xC1, 0x04, 0xC2, + 0x04, 0xD0, 0x04, 0xD1, 0x04, 0xD2, 0x04, 0xD3, 0x04, 0xD6, 0x04, 0xD7, 0x04, 0xDA, 0x04, 0xDB, + 0x04, 0xDC, 0x04, 0xDD, 0x04, 0xDE, 0x04, 0xDF, 0x04, 0xE2, 0x04, 0xE3, 0x04, 0xE4, 0x04, 0xE5, + 0x04, 0xE6, 0x04, 0xE7, 0x04, 0xEA, 0x04, 0xEB, 0x04, 0xEC, 0x04, 0xED, 0x04, 0xEE, 0x04, 0xEF, + 0x04, 0xF0, 0x04, 0xF1, 0x04, 0xF2, 0x04, 0xF3, 0x04, 0xF4, 0x04, 0xF5, 0x04, 0xF8, 0x04, 0xF9, + 0x00, 0x01, 0x00, 0x46, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, + 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x02, 0x04, 0x15, 0x03, 0x40, 0x00, 0x02, 0x04, 0x13, + 0x03, 0x41, 0x00, 0x02, 0x04, 0x1A, 0x03, 0x41, 0x00, 0x02, 0x04, 0x18, 0x03, 0x40, 0x00, 0x02, + 0x04, 0x35, 0x03, 0x40, 0x00, 0x02, 0x04, 0x33, 0x03, 0x41, 0x00, 0x02, 0x04, 0x3A, 0x03, 0x41, + 0x00, 0x02, 0x04, 0x38, 0x03, 0x40, 0x00, 0x01, 0x00, 0x08, 0x04, 0x00, 0x04, 0x03, 0x04, 0x0C, + 0x04, 0x0D, 0x04, 0x50, 0x04, 0x53, 0x04, 0x5C, 0x04, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x2A, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x20, 0x00, 0x01, + 0x00, 0x04, 0x09, 0x29, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x31, 0x00, 0x02, + 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x34, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x03, + 0x09, 0x28, 0x09, 0x30, 0x09, 0x33, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, 0x09, 0x28, 0x09, 0x3C, + 0x00, 0x02, 0x09, 0x30, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x33, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x03, + 0x09, 0x29, 0x09, 0x31, 0x09, 0x34, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x33, 0x04, 0x00, 0x75, 0x00, 0xF0, 0x01, 0x1A, 0x04, 0x5A, 0x05, 0x0C, 0x08, 0x3C, 0x09, 0x24, + 0x09, 0xD6, 0x09, 0xE0, 0x0A, 0x54, 0x0D, 0x84, 0x0D, 0x8E, 0x0D, 0x98, 0x11, 0x44, 0x11, 0xF6, + 0x15, 0x92, 0x16, 0xBC, 0x17, 0x6E, 0x17, 0x88, 0x18, 0xB2, 0x1C, 0x4E, 0x1C, 0x78, 0x1C, 0xA2, + 0x1C, 0xAC, 0x1C, 0xC6, 0x1D, 0x5C, 0x1D, 0xF2, 0x1D, 0xFC, 0x1E, 0x06, 0x1E, 0x10, 0x1E, 0x1A, + 0x1E, 0x24, 0x1E, 0x2E, 0x1E, 0xC4, 0x1F, 0x5A, 0x1F, 0x64, 0x1F, 0x6E, 0x1F, 0x78, 0x1F, 0x82, + 0x1F, 0x8C, 0x1F, 0x96, 0x1F, 0xB8, 0x1F, 0xDA, 0x1F, 0xFC, 0x20, 0x1E, 0x20, 0xB4, 0x21, 0x4A, + 0x21, 0x54, 0x21, 0x5E, 0x21, 0x68, 0x21, 0x72, 0x21, 0x7C, 0x21, 0x86, 0x22, 0x1C, 0x22, 0xB2, + 0x22, 0xBC, 0x22, 0xC6, 0x22, 0xD0, 0x22, 0xDA, 0x22, 0xE4, 0x22, 0xEE, 0x23, 0x18, 0x23, 0x42, + 0x23, 0x6C, 0x23, 0x96, 0x23, 0xB8, 0x23, 0xDA, 0x23, 0xFC, 0x24, 0x1E, 0x24, 0x48, 0x24, 0x72, + 0x24, 0x9C, 0x25, 0x32, 0x25, 0xC8, 0x25, 0xD2, 0x25, 0xDC, 0x25, 0xE6, 0x25, 0xF0, 0x25, 0xFA, + 0x26, 0x04, 0x26, 0x9A, 0x27, 0x30, 0x27, 0x3A, 0x27, 0x44, 0x27, 0x4E, 0x27, 0x58, 0x27, 0x62, + 0x27, 0x6C, 0x27, 0x76, 0x27, 0x80, 0x27, 0x8A, 0x27, 0x94, 0x27, 0x9E, 0x27, 0xA8, 0x27, 0xD2, + 0x27, 0xFC, 0x28, 0x26, 0x28, 0x50, 0x28, 0x7A, 0x28, 0xA4, 0x28, 0xCE, 0x28, 0xF8, 0x29, 0x22, + 0x29, 0x4C, 0x29, 0x76, 0x29, 0xA0, 0x2A, 0x78, 0x2A, 0x82, 0x2B, 0x32, 0x2C, 0x5C, 0x2C, 0x86, + 0x2D, 0x5E, 0x2D, 0x68, 0x2E, 0x18, 0x2E, 0xF0, 0x2E, 0xFA, 0x2F, 0xAA, 0x2F, 0xD4, 0x00, 0x05, + 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xED, 0x00, 0x02, 0x03, 0x00, + 0x03, 0x85, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xED, 0x00, 0x02, 0x03, 0x40, 0x03, 0x85, 0x00, 0x02, + 0x03, 0x41, 0x1F, 0xC1, 0x00, 0x02, 0x03, 0x42, 0x00, 0x4C, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xA6, + 0x00, 0xAC, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xE0, 0x00, 0xE8, + 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x16, 0x01, 0x20, 0x01, 0x2A, 0x01, 0x34, + 0x01, 0x3E, 0x01, 0x46, 0x01, 0x4C, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x68, 0x01, 0x70, 0x01, 0x7A, + 0x01, 0x82, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xB0, 0x01, 0xBA, 0x01, 0xC4, + 0x01, 0xCE, 0x01, 0xD8, 0x01, 0xE0, 0x01, 0xE6, 0x01, 0xEC, 0x01, 0xF2, 0x01, 0xFC, 0x02, 0x04, + 0x02, 0x0E, 0x02, 0x16, 0x02, 0x20, 0x02, 0x28, 0x02, 0x32, 0x02, 0x3A, 0x02, 0x44, 0x02, 0x4C, + 0x02, 0x56, 0x02, 0x60, 0x02, 0x6A, 0x02, 0x74, 0x02, 0x7E, 0x02, 0x86, 0x02, 0x8C, 0x02, 0x96, + 0x02, 0xA0, 0x02, 0xAA, 0x02, 0xB4, 0x02, 0xBE, 0x02, 0xC6, 0x02, 0xD0, 0x02, 0xDA, 0x02, 0xE4, + 0x02, 0xEE, 0x02, 0xF8, 0x03, 0x00, 0x03, 0x0A, 0x03, 0x14, 0x03, 0x1E, 0x03, 0x28, 0x03, 0x32, + 0x03, 0x3A, 0x1F, 0xBA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x86, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xB9, + 0x00, 0x02, 0x03, 0x04, 0x1F, 0xB8, 0x00, 0x02, 0x03, 0x06, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x8A, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, + 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0E, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x42, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8C, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x08, + 0x00, 0x02, 0x03, 0x13, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0B, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x0D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x0B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x8B, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0x89, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x09, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xBA, + 0x00, 0x02, 0x03, 0x40, 0x03, 0x86, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x8A, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0E, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8C, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x08, + 0x00, 0x02, 0x03, 0x43, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x8C, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0x8B, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x89, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, + 0x1F, 0x8E, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x43, 0x1F, 0xBC, 0x00, 0x02, 0x03, 0x45, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, + 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, + 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, + 0x1F, 0xC8, 0x00, 0x02, 0x03, 0x00, 0x03, 0x88, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x1A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x00, 0x1F, 0x1C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x1A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x1C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x18, 0x00, 0x02, + 0x03, 0x13, 0x1F, 0x1B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x1D, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x01, 0x1F, 0x1B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x1D, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x41, 0x1F, 0x19, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xC8, 0x00, 0x02, 0x03, 0x40, 0x03, 0x88, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x1A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x1C, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x01, 0x1F, 0x1A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x1C, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x41, 0x1F, 0x18, 0x00, 0x02, 0x03, 0x43, 0x00, 0x4A, 0x00, 0x96, 0x00, 0x9C, + 0x00, 0xA2, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, + 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, 0x01, 0x10, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, + 0x01, 0x36, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x60, 0x01, 0x6A, 0x01, 0x72, + 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, 0x01, 0xA0, 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBE, + 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFE, + 0x02, 0x06, 0x02, 0x10, 0x02, 0x18, 0x02, 0x22, 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x46, + 0x02, 0x50, 0x02, 0x5A, 0x02, 0x64, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7C, 0x02, 0x86, 0x02, 0x90, + 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, 0x02, 0xB6, 0x02, 0xC0, 0x02, 0xCA, 0x02, 0xD4, 0x02, 0xDE, + 0x02, 0xE8, 0x02, 0xF0, 0x02, 0xFA, 0x03, 0x04, 0x03, 0x0E, 0x03, 0x18, 0x03, 0x22, 0x03, 0x2A, + 0x1F, 0xCA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x89, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x9C, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, + 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2E, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, + 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9E, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, + 0x1F, 0x28, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, + 0x1F, 0x2B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x2D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x9F, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9D, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0x99, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x29, 0x00, 0x02, 0x03, 0x14, + 0x1F, 0xCA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x89, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9A, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x9C, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, + 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2E, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, + 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9E, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, + 0x1F, 0x28, 0x00, 0x02, 0x03, 0x43, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, + 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x9E, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, + 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x9D, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x42, 0x1F, 0x99, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x9A, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x43, 0x1F, 0xCC, 0x00, 0x02, 0x03, 0x45, 0x00, 0x19, 0x00, 0x34, 0x00, 0x3A, + 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, + 0x00, 0x7A, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xAE, + 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x1F, 0xDA, + 0x00, 0x02, 0x03, 0x00, 0x03, 0x8A, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD9, 0x00, 0x02, 0x03, 0x04, + 0x1F, 0xD8, 0x00, 0x02, 0x03, 0x06, 0x03, 0xAA, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x3A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x00, 0x1F, 0x3C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x3A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x3C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x3E, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x42, 0x1F, 0x38, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x3B, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x00, 0x1F, 0x3D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x3B, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x40, 0x1F, 0x3D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x3F, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x42, 0x1F, 0x39, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xDA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8A, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x3A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x3C, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x01, 0x1F, 0x3A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x3C, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x41, 0x1F, 0x3E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x38, 0x00, 0x02, + 0x03, 0x43, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, + 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, + 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x1F, 0xF8, 0x00, 0x02, 0x03, 0x00, + 0x03, 0x8C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x4A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x4C, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x4A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x4C, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x48, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x4B, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0x4D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x4B, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0x4D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x49, 0x00, 0x02, + 0x03, 0x14, 0x1F, 0xF8, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x4A, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x4C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x4A, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x4C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x48, + 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xEC, 0x00, 0x02, 0x03, 0x14, 0x00, 0x0D, + 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, + 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x1F, 0xEA, 0x00, 0x02, 0x03, 0x00, + 0x03, 0x8E, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xE9, 0x00, 0x02, 0x03, 0x04, 0x1F, 0xE8, 0x00, 0x02, + 0x03, 0x06, 0x03, 0xAB, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x5B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, + 0x1F, 0x5D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x5B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, + 0x1F, 0x5D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x5F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x59, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xEA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8E, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x4A, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA2, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBE, + 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, + 0x01, 0x10, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, + 0x01, 0x58, 0x01, 0x60, 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, + 0x01, 0xA0, 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBE, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, + 0x01, 0xE2, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFE, 0x02, 0x06, 0x02, 0x10, 0x02, 0x18, 0x02, 0x22, + 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x46, 0x02, 0x50, 0x02, 0x5A, 0x02, 0x64, 0x02, 0x6E, + 0x02, 0x76, 0x02, 0x7C, 0x02, 0x86, 0x02, 0x90, 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, 0x02, 0xB6, + 0x02, 0xC0, 0x02, 0xCA, 0x02, 0xD4, 0x02, 0xDE, 0x02, 0xE8, 0x02, 0xF0, 0x02, 0xFA, 0x03, 0x04, + 0x03, 0x0E, 0x03, 0x18, 0x03, 0x22, 0x03, 0x2A, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x8F, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xAB, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, + 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x6D, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6D, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, + 0x1F, 0x6F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, + 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x45, 0x1F, 0x69, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8F, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x43, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, + 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x14, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xFC, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0xC4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x57, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xBE, 0x00, 0xC6, + 0x00, 0xCC, 0x00, 0xD2, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, + 0x01, 0x0E, 0x01, 0x18, 0x01, 0x20, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x50, + 0x01, 0x5A, 0x01, 0x64, 0x01, 0x6C, 0x01, 0x72, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, + 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB2, 0x01, 0xBA, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD6, 0x01, 0xE0, + 0x01, 0xEA, 0x01, 0xF4, 0x01, 0xFE, 0x02, 0x06, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1A, 0x02, 0x22, + 0x02, 0x28, 0x02, 0x30, 0x02, 0x36, 0x02, 0x40, 0x02, 0x48, 0x02, 0x52, 0x02, 0x5A, 0x02, 0x64, + 0x02, 0x6C, 0x02, 0x76, 0x02, 0x7E, 0x02, 0x88, 0x02, 0x90, 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, + 0x02, 0xB8, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD8, 0x02, 0xE0, 0x02, 0xEA, 0x02, 0xF4, + 0x02, 0xFE, 0x03, 0x08, 0x03, 0x12, 0x03, 0x1A, 0x03, 0x24, 0x03, 0x2E, 0x03, 0x38, 0x03, 0x42, + 0x03, 0x4C, 0x03, 0x54, 0x03, 0x5C, 0x03, 0x64, 0x03, 0x6C, 0x03, 0x76, 0x03, 0x80, 0x03, 0x8A, + 0x03, 0x94, 0x03, 0x9E, 0x03, 0xA6, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x70, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0xB4, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x03, 0xAC, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0xB1, 0x00, 0x02, 0x03, 0x04, 0x1F, 0xB0, 0x00, 0x02, 0x03, 0x06, 0x1F, 0x82, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, + 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x04, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, + 0x1F, 0x06, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, + 0x1F, 0x86, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x45, 0x1F, 0x00, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, + 0x03, 0x45, 0x1F, 0x03, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x01, 0x03, 0x45, 0x1F, 0x05, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x03, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x85, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x05, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, + 0x1F, 0x87, 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x07, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x42, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, + 0x1F, 0x85, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x42, 0x1F, 0x81, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x01, 0x00, 0x02, + 0x03, 0x14, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x70, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0xB4, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x03, 0xAC, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xB7, + 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0xB6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x84, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, + 0x1F, 0x82, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x06, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, + 0x1F, 0x84, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x86, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, + 0x1F, 0x00, 0x00, 0x02, 0x03, 0x43, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xB4, + 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, + 0x1F, 0x84, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x86, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, + 0x1F, 0x83, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x85, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x42, 0x1F, 0x81, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0xB4, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xB7, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0x84, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xB3, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, + 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, + 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x1F, 0x72, 0x00, 0x02, 0x03, 0x00, + 0x03, 0xAD, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x12, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x14, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x12, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x14, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x10, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x13, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0x15, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x13, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0x15, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x11, 0x00, 0x02, + 0x03, 0x14, 0x1F, 0x72, 0x00, 0x02, 0x03, 0x40, 0x03, 0xAD, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x12, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x14, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x12, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x14, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x10, + 0x00, 0x02, 0x03, 0x43, 0x00, 0x55, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, + 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x08, 0x01, 0x10, + 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2C, 0x01, 0x36, 0x01, 0x40, 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, + 0x01, 0x62, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7E, 0x01, 0x86, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA2, + 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC6, 0x01, 0xD0, 0x01, 0xDA, 0x01, 0xE4, 0x01, 0xEE, + 0x01, 0xF6, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0A, 0x02, 0x12, 0x02, 0x18, 0x02, 0x20, 0x02, 0x26, + 0x02, 0x30, 0x02, 0x38, 0x02, 0x42, 0x02, 0x4A, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x66, 0x02, 0x6E, + 0x02, 0x78, 0x02, 0x80, 0x02, 0x8A, 0x02, 0x94, 0x02, 0x9E, 0x02, 0xA8, 0x02, 0xB2, 0x02, 0xBA, + 0x02, 0xC0, 0x02, 0xC8, 0x02, 0xD0, 0x02, 0xDA, 0x02, 0xE4, 0x02, 0xEE, 0x02, 0xF8, 0x03, 0x02, + 0x03, 0x0A, 0x03, 0x14, 0x03, 0x1E, 0x03, 0x28, 0x03, 0x32, 0x03, 0x3C, 0x03, 0x44, 0x03, 0x4C, + 0x03, 0x54, 0x03, 0x5C, 0x03, 0x66, 0x03, 0x70, 0x03, 0x7A, 0x03, 0x84, 0x03, 0x8E, 0x03, 0x96, + 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x74, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xC4, + 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x03, 0xAE, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x94, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, + 0x1F, 0x92, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x26, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, + 0x1F, 0x94, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x96, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, + 0x1F, 0x20, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, + 0x1F, 0x23, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x25, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x40, 0x03, 0x45, 0x1F, 0x23, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x25, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x97, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x27, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x95, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0x91, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x21, 0x00, 0x02, 0x03, 0x14, + 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x74, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xC4, + 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x03, 0xAE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xC7, 0x00, 0x03, + 0x03, 0x42, 0x03, 0x45, 0x1F, 0xC6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x92, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0x94, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x26, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x94, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x20, + 0x00, 0x02, 0x03, 0x43, 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xC4, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x94, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0x93, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x01, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x91, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, + 0x1F, 0xC4, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xC7, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x94, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xC3, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x20, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, + 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, + 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, + 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, + 0x01, 0x24, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x00, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD1, + 0x00, 0x02, 0x03, 0x04, 0x1F, 0xD0, 0x00, 0x02, 0x03, 0x06, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x00, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x40, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x1F, 0xD7, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x42, 0x03, 0xCA, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, + 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, + 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, + 0x1F, 0x30, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x35, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x35, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x37, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x31, + 0x00, 0x02, 0x03, 0x14, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x40, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0xD6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x34, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x34, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x30, + 0x00, 0x02, 0x03, 0x43, 0x03, 0x90, 0x00, 0x02, 0x03, 0x44, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, + 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, + 0x00, 0x72, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, + 0x00, 0xAC, 0x1F, 0x78, 0x00, 0x02, 0x03, 0x00, 0x03, 0xCC, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x42, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x44, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x42, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x44, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x40, + 0x00, 0x02, 0x03, 0x13, 0x1F, 0x43, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x45, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x01, 0x1F, 0x43, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x45, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x41, 0x1F, 0x41, 0x00, 0x02, 0x03, 0x14, 0x1F, 0x78, 0x00, 0x02, 0x03, 0x40, + 0x03, 0xCC, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x42, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x44, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x42, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x44, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x40, 0x00, 0x02, 0x03, 0x43, 0x00, 0x03, 0x00, 0x08, + 0x00, 0x0E, 0x00, 0x14, 0x1F, 0xE4, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xE5, 0x00, 0x02, 0x03, 0x14, + 0x1F, 0xE4, 0x00, 0x02, 0x03, 0x43, 0x00, 0x20, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, + 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x88, 0x00, 0x90, + 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xCE, + 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, + 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x24, 0x1F, 0x7A, 0x00, 0x02, 0x03, 0x00, 0x03, 0xCD, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0xE1, 0x00, 0x02, 0x03, 0x04, 0x1F, 0xE0, 0x00, 0x02, 0x03, 0x06, + 0x1F, 0xE2, 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x03, 0xB0, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, + 0x1F, 0xE2, 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x03, 0xB0, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, + 0x1F, 0xE7, 0x00, 0x03, 0x03, 0x08, 0x03, 0x42, 0x03, 0xCB, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x52, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x52, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x56, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x50, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x53, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0x55, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x53, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0x55, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x57, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x42, 0x1F, 0x51, 0x00, 0x02, 0x03, 0x14, 0x1F, 0x7A, 0x00, 0x02, 0x03, 0x40, + 0x03, 0xCD, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xE6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x52, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x00, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x52, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x40, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x56, 0x00, 0x03, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0x50, 0x00, 0x02, 0x03, 0x43, 0x03, 0xB0, 0x00, 0x02, 0x03, 0x44, + 0x00, 0x55, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xD2, 0x00, 0xDA, + 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x08, 0x01, 0x10, 0x01, 0x1A, 0x01, 0x22, + 0x01, 0x2C, 0x01, 0x36, 0x01, 0x40, 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x6C, + 0x01, 0x74, 0x01, 0x7E, 0x01, 0x86, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA2, 0x01, 0xAA, 0x01, 0xB4, + 0x01, 0xBC, 0x01, 0xC6, 0x01, 0xD0, 0x01, 0xDA, 0x01, 0xE4, 0x01, 0xEE, 0x01, 0xF6, 0x01, 0xFC, + 0x02, 0x04, 0x02, 0x0A, 0x02, 0x12, 0x02, 0x18, 0x02, 0x20, 0x02, 0x26, 0x02, 0x30, 0x02, 0x38, + 0x02, 0x42, 0x02, 0x4A, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x78, 0x02, 0x80, + 0x02, 0x8A, 0x02, 0x94, 0x02, 0x9E, 0x02, 0xA8, 0x02, 0xB2, 0x02, 0xBA, 0x02, 0xC0, 0x02, 0xC8, + 0x02, 0xD0, 0x02, 0xDA, 0x02, 0xE4, 0x02, 0xEE, 0x02, 0xF8, 0x03, 0x02, 0x03, 0x0A, 0x03, 0x14, + 0x03, 0x1E, 0x03, 0x28, 0x03, 0x32, 0x03, 0x3C, 0x03, 0x44, 0x03, 0x4C, 0x03, 0x54, 0x03, 0x5C, + 0x03, 0x66, 0x03, 0x70, 0x03, 0x7A, 0x03, 0x84, 0x03, 0x8E, 0x03, 0x96, 0x1F, 0xF2, 0x00, 0x03, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x7C, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xF4, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x45, 0x03, 0xCE, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, + 0x03, 0x45, 0x1F, 0x62, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x01, 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x62, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xA4, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, + 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x66, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, + 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x60, 0x00, 0x02, + 0x03, 0x13, 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x63, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x65, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, + 0x1F, 0x63, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, + 0x03, 0x45, 0x1F, 0x65, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x42, 0x03, 0x45, 0x1F, 0x67, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA3, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, + 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA1, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x61, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xF2, 0x00, 0x03, + 0x03, 0x40, 0x03, 0x45, 0x1F, 0x7C, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xF4, 0x00, 0x03, 0x03, 0x41, + 0x03, 0x45, 0x03, 0xCE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xF7, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, + 0x1F, 0xF6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, + 0x1F, 0x62, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x40, 0x03, 0x45, 0x1F, 0x62, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xA6, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x66, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, + 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xA4, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x60, 0x00, 0x02, 0x03, 0x43, + 0x1F, 0xF2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xF4, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, + 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xA4, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xA3, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA1, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x14, 0x1F, 0xF2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xF4, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x41, 0x1F, 0xF7, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, + 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA0, + 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xF3, 0x00, 0x02, 0x03, 0x45, 0x00, 0x05, 0x00, 0x0C, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xD2, 0x00, 0x02, 0x03, 0x00, 0x03, 0x90, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD2, 0x00, 0x02, 0x03, 0x40, 0x03, 0x90, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0xD7, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1F, 0xE2, 0x00, 0x02, 0x03, 0x00, 0x03, 0xB0, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xE2, + 0x00, 0x02, 0x03, 0x40, 0x03, 0xB0, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xE7, 0x00, 0x02, 0x03, 0x42, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0xF4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, + 0x00, 0x14, 0x03, 0xD3, 0x00, 0x02, 0x03, 0x01, 0x03, 0xD4, 0x00, 0x02, 0x03, 0x08, 0x03, 0xD3, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, + 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, + 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x02, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0x84, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x86, + 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x06, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, + 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, + 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x83, 0x00, 0x03, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x03, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x05, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, + 0x1F, 0x03, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x05, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x07, 0x00, 0x02, + 0x03, 0x42, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x41, 0x1F, 0x87, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x81, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0x82, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x83, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x84, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0x85, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x86, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x87, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, + 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, + 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x8A, + 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x03, + 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, + 0x1F, 0x0C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0E, + 0x00, 0x02, 0x03, 0x42, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, + 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, + 0x00, 0x88, 0x00, 0x90, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0B, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0D, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x0B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x8D, + 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0D, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x03, + 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0F, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0x89, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8A, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8B, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0x8C, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8D, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8E, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8F, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x12, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0x14, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x12, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0x14, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x1F, 0x13, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x15, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x13, 0x00, 0x02, + 0x03, 0x40, 0x1F, 0x15, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, + 0x00, 0x1C, 0x1F, 0x1A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x1C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x1A, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0x1C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x1B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x1D, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x1B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x1D, 0x00, 0x02, 0x03, 0x41, 0x00, 0x10, 0x00, 0x22, + 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, + 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x92, + 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, + 0x03, 0x01, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x03, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x22, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, + 0x1F, 0x24, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x26, + 0x00, 0x02, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, + 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, + 0x00, 0x88, 0x00, 0x90, 0x1F, 0x93, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x23, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x25, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x93, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x23, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x95, + 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x25, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x03, + 0x03, 0x42, 0x03, 0x45, 0x1F, 0x27, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x93, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x93, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0x91, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x92, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x93, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0x94, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x95, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0x96, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x97, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, + 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, + 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2A, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9E, + 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2E, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x9A, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x03, + 0x03, 0x45, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, + 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, + 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x9B, 0x00, 0x03, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x2D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, + 0x1F, 0x2B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2D, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2F, 0x00, 0x02, + 0x03, 0x42, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x99, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9A, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9B, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9C, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0x9D, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9E, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9F, 0x00, 0x02, 0x03, 0x45, 0x00, 0x05, 0x00, 0x0C, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x32, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x34, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x34, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0x36, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1F, 0x33, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x35, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x33, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0x35, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x37, 0x00, 0x02, 0x03, 0x42, + 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x3A, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0x3C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x3A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x3C, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x3E, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x3B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x3D, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0x3B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x3D, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x3F, + 0x00, 0x02, 0x03, 0x42, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x42, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0x44, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x42, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0x44, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x1F, 0x43, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x45, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x43, 0x00, 0x02, + 0x03, 0x40, 0x1F, 0x45, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, + 0x00, 0x1C, 0x1F, 0x4A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x4C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x4A, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0x4C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x4B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x4D, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x4B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x4D, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x52, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x54, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0x52, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x54, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0x56, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1F, 0x53, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x55, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x53, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0x55, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x57, 0x00, 0x02, 0x03, 0x42, + 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x5B, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0x5D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x5B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x5D, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x5F, 0x00, 0x02, 0x03, 0x42, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, + 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, + 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0xA2, 0x00, 0x03, + 0x03, 0x00, 0x03, 0x45, 0x1F, 0x62, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x45, 0x1F, 0x64, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, + 0x1F, 0x62, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x64, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x66, 0x00, 0x02, + 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, + 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, + 0x00, 0x90, 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x63, 0x00, 0x02, 0x03, 0x00, + 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x65, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA3, + 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x63, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x03, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x65, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x03, 0x03, 0x42, + 0x03, 0x45, 0x1F, 0x67, 0x00, 0x02, 0x03, 0x42, 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, + 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, + 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0xA1, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA2, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA3, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA4, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA5, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0xA6, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA7, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, + 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, + 0x00, 0x88, 0x00, 0x90, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xAC, + 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x03, + 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x02, 0x03, 0x42, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, + 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, + 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x00, + 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x6D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6B, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6D, 0x00, 0x02, + 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6F, 0x00, 0x02, 0x03, 0x42, + 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, + 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, + 0x1F, 0xAF, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0xAA, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAB, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAC, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0xAD, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAE, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAF, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB2, + 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0xC2, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xC4, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xF2, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0xF4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1F, 0x82, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x82, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x02, 0x03, 0x42, + 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x83, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0x85, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x85, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x8A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8E, + 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, + 0x1F, 0x8B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x02, + 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, + 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x92, 0x00, 0x02, 0x03, 0x00, + 0x1F, 0x94, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x02, + 0x03, 0x41, 0x1F, 0x96, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x93, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x93, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x02, + 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x9A, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x02, 0x03, 0x40, + 0x1F, 0x9C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x9B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9D, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0x9F, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1F, 0xA2, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA2, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x02, 0x03, 0x42, + 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xA3, 0x00, 0x02, + 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA3, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA5, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xAA, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAE, + 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, + 0x1F, 0xAB, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x02, + 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x02, 0x03, 0x42, 0x00, 0x17, + 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, + 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, + 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x1F, 0xB2, + 0x00, 0x02, 0x03, 0x00, 0x1F, 0xB4, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x00, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x40, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x42, 0x1F, 0x80, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, + 0x1F, 0x85, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, + 0x1F, 0x85, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, + 0x1F, 0x81, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xB2, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xB4, 0x00, 0x02, + 0x03, 0x41, 0x1F, 0xB7, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, + 0x1F, 0x84, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0x84, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, + 0x1F, 0x80, 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB7, 0x00, 0x02, 0x03, 0x45, + 0x00, 0x12, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, + 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, + 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x8C, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x8C, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x88, + 0x00, 0x02, 0x03, 0x13, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x89, 0x00, 0x02, + 0x03, 0x14, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x02, 0x03, 0x43, + 0x00, 0x20, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, + 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, + 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, + 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, + 0x01, 0x24, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x00, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD1, + 0x00, 0x02, 0x03, 0x04, 0x1F, 0xD0, 0x00, 0x02, 0x03, 0x06, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x00, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x40, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x1F, 0xD7, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x42, 0x03, 0xCA, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, + 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, + 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, + 0x1F, 0x30, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x35, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x35, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x37, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x31, + 0x00, 0x02, 0x03, 0x14, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x40, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x41, + 0x1F, 0xD6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x34, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x34, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x30, + 0x00, 0x02, 0x03, 0x43, 0x03, 0x90, 0x00, 0x02, 0x03, 0x44, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xCD, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xCE, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0xCD, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xCE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xCF, + 0x00, 0x02, 0x03, 0x42, 0x00, 0x17, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, + 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, + 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, 0x00, 0xC2, + 0x00, 0xCA, 0x00, 0xD2, 0x1F, 0xC2, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0x92, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, + 0x1F, 0x92, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, + 0x1F, 0x96, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x93, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x93, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x97, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x91, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xC2, 0x00, 0x02, + 0x03, 0x40, 0x1F, 0xC4, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xC7, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x92, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x92, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x96, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, 0x00, 0x04, + 0x1F, 0xC7, 0x00, 0x02, 0x03, 0x45, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x36, 0x00, 0x3E, + 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, + 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x1F, 0x9A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x03, + 0x03, 0x13, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x42, 0x1F, 0x99, 0x00, 0x02, 0x03, 0x14, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, + 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, + 0x1F, 0x98, 0x00, 0x02, 0x03, 0x43, 0x00, 0x17, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, + 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, + 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, + 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x1F, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xF4, 0x00, 0x02, + 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x13, + 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x02, 0x03, 0x13, + 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, + 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, + 0x1F, 0xA7, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA1, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xF2, + 0x00, 0x02, 0x03, 0x40, 0x1F, 0xF4, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xF7, 0x00, 0x02, 0x03, 0x42, + 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, + 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, + 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, + 0x00, 0x04, 0x1F, 0xF7, 0x00, 0x02, 0x03, 0x45, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x36, + 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, + 0x00, 0x7C, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x1F, 0xAA, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xAA, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xAB, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x03, 0x03, 0x43, + 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x02, 0x03, 0x43, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xDD, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xDE, 0x00, 0x02, 0x03, 0x01, + 0x1F, 0xDD, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xDE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xDF, 0x00, 0x02, + 0x03, 0x42, 0x00, 0x4A, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA2, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBE, + 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, + 0x01, 0x10, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, + 0x01, 0x58, 0x01, 0x60, 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, + 0x01, 0xA0, 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBE, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, + 0x01, 0xE2, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFE, 0x02, 0x06, 0x02, 0x10, 0x02, 0x18, 0x02, 0x22, + 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x46, 0x02, 0x50, 0x02, 0x5A, 0x02, 0x64, 0x02, 0x6E, + 0x02, 0x76, 0x02, 0x7C, 0x02, 0x86, 0x02, 0x90, 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, 0x02, 0xB6, + 0x02, 0xC0, 0x02, 0xCA, 0x02, 0xD4, 0x02, 0xDE, 0x02, 0xE8, 0x02, 0xF0, 0x02, 0xFA, 0x03, 0x04, + 0x03, 0x0E, 0x03, 0x18, 0x03, 0x22, 0x03, 0x2A, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x8F, + 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, + 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xAB, + 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, + 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x6D, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, + 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6D, + 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, + 0x1F, 0x6F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, + 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x14, + 0x03, 0x45, 0x1F, 0x69, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8F, + 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, + 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, + 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, + 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, + 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x43, 0x1F, 0xAA, + 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, + 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, + 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x45, + 0x03, 0x14, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, + 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xFC, 0x00, 0x02, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x75, 0x00, 0xA8, 0x03, 0x91, 0x03, 0x95, 0x03, 0x97, 0x03, 0x99, + 0x03, 0x9F, 0x03, 0xA1, 0x03, 0xA5, 0x03, 0xA9, 0x03, 0xAC, 0x03, 0xAE, 0x03, 0xB1, 0x03, 0xB5, + 0x03, 0xB7, 0x03, 0xB9, 0x03, 0xBF, 0x03, 0xC1, 0x03, 0xC5, 0x03, 0xC9, 0x03, 0xCA, 0x03, 0xCB, + 0x03, 0xCE, 0x03, 0xD2, 0x1F, 0x00, 0x1F, 0x01, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, + 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, 0x1F, 0x09, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, + 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x11, 0x1F, 0x18, 0x1F, 0x19, 0x1F, 0x20, 0x1F, 0x21, + 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, 0x1F, 0x29, + 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, + 0x1F, 0x38, 0x1F, 0x39, 0x1F, 0x40, 0x1F, 0x41, 0x1F, 0x48, 0x1F, 0x49, 0x1F, 0x50, 0x1F, 0x51, + 0x1F, 0x59, 0x1F, 0x60, 0x1F, 0x61, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, + 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, + 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x71, 0x1F, 0x74, 0x1F, 0x75, 0x1F, 0x7C, 0x1F, 0x7D, 0x1F, 0x80, + 0x1F, 0x81, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0xA0, + 0x1F, 0xA1, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xB3, 0x1F, 0xB6, 0x1F, 0xBC, 0x1F, 0xBE, 0x1F, 0xBF, + 0x1F, 0xC3, 0x1F, 0xC6, 0x1F, 0xCC, 0x1F, 0xF3, 0x1F, 0xF6, 0x1F, 0xFC, 0x1F, 0xFE, 0x21, 0x26, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4C, 0x09, 0x66, 0x11, 0x1A, 0x17, 0x08, 0x1C, 0xC2, + 0x20, 0xBC, 0x24, 0x9E, 0x27, 0x3C, 0x29, 0x7A, 0x2B, 0x42, 0x2D, 0x22, 0x2E, 0xD2, 0x30, 0x80, + 0x31, 0xE8, 0x33, 0x50, 0x34, 0xB8, 0x35, 0x94, 0x36, 0x70, 0x37, 0x4C, 0x38, 0x1A, 0x38, 0xE8, + 0x39, 0xB6, 0x3A, 0x68, 0x3B, 0x1A, 0x3B, 0x40, 0x3B, 0x66, 0x3B, 0x8C, 0x3B, 0xB2, 0x3B, 0xD8, + 0x3B, 0xFE, 0x3C, 0x24, 0x3C, 0x4A, 0x3C, 0x70, 0x3C, 0x96, 0x3C, 0xBC, 0x00, 0x01, 0x07, 0x46, + 0x00, 0xE8, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xE8, 0x01, 0xEE, 0x01, 0xF4, 0x01, 0xFA, + 0x02, 0x00, 0x02, 0x06, 0x02, 0x0C, 0x02, 0x12, 0x02, 0x18, 0x02, 0x1E, 0x02, 0x24, 0x02, 0x2A, + 0x02, 0x30, 0x02, 0x36, 0x02, 0x3C, 0x02, 0x42, 0x02, 0x48, 0x02, 0x4E, 0x02, 0x54, 0x02, 0x5A, + 0x02, 0x60, 0x02, 0x66, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, 0x02, 0x8A, + 0x02, 0x90, 0x02, 0x96, 0x02, 0x9C, 0x02, 0xA2, 0x02, 0xA8, 0x02, 0xAE, 0x02, 0xB4, 0x02, 0xBA, + 0x02, 0xC0, 0x02, 0xC6, 0x02, 0xCC, 0x02, 0xD2, 0x02, 0xD8, 0x02, 0xDE, 0x02, 0xE4, 0x02, 0xEA, + 0x02, 0xF0, 0x02, 0xF6, 0x02, 0xFC, 0x03, 0x02, 0x03, 0x08, 0x03, 0x0E, 0x03, 0x14, 0x03, 0x1A, + 0x03, 0x20, 0x03, 0x26, 0x03, 0x2C, 0x03, 0x32, 0x03, 0x38, 0x03, 0x3E, 0x03, 0x44, 0x03, 0x4A, + 0x03, 0x50, 0x03, 0x56, 0x03, 0x5C, 0x03, 0x62, 0x03, 0x68, 0x03, 0x6E, 0x03, 0x74, 0x03, 0x7A, + 0x03, 0x80, 0x03, 0x86, 0x03, 0x8C, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA4, 0x03, 0xAA, + 0x03, 0xB0, 0x03, 0xB6, 0x03, 0xBC, 0x03, 0xC2, 0x03, 0xC8, 0x03, 0xCE, 0x03, 0xD4, 0x03, 0xDA, + 0x03, 0xE0, 0x03, 0xE6, 0x03, 0xEC, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x04, 0x04, 0x0A, + 0x04, 0x10, 0x04, 0x16, 0x04, 0x1C, 0x04, 0x22, 0x04, 0x28, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, + 0x04, 0x40, 0x04, 0x46, 0x04, 0x4C, 0x04, 0x52, 0x04, 0x58, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, + 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82, 0x04, 0x88, 0x04, 0x8E, 0x04, 0x94, 0x04, 0x9A, + 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAC, 0x04, 0xB2, 0x04, 0xB8, 0x04, 0xBE, 0x04, 0xC4, 0x04, 0xCA, + 0x04, 0xD0, 0x04, 0xD6, 0x04, 0xDC, 0x04, 0xE2, 0x04, 0xE8, 0x04, 0xEE, 0x04, 0xF4, 0x04, 0xFA, + 0x05, 0x00, 0x05, 0x06, 0x05, 0x0C, 0x05, 0x12, 0x05, 0x18, 0x05, 0x1E, 0x05, 0x24, 0x05, 0x2A, + 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A, + 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A, + 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x05, 0xBA, + 0x05, 0xC0, 0x05, 0xC6, 0x05, 0xCC, 0x05, 0xD2, 0x05, 0xD8, 0x05, 0xDE, 0x05, 0xE4, 0x05, 0xEA, + 0x05, 0xF0, 0x05, 0xF6, 0x05, 0xFC, 0x06, 0x02, 0x06, 0x08, 0x06, 0x0E, 0x06, 0x14, 0x06, 0x1A, + 0x06, 0x20, 0x06, 0x26, 0x06, 0x2C, 0x06, 0x32, 0x06, 0x38, 0x06, 0x3E, 0x06, 0x44, 0x06, 0x4A, + 0x06, 0x50, 0x06, 0x56, 0x06, 0x5C, 0x06, 0x62, 0x06, 0x68, 0x06, 0x6E, 0x06, 0x74, 0x06, 0x7A, + 0x06, 0x80, 0x06, 0x86, 0x06, 0x8C, 0x06, 0x92, 0x06, 0x98, 0x06, 0x9E, 0x06, 0xA4, 0x06, 0xAA, + 0x06, 0xB0, 0x06, 0xB6, 0x06, 0xBC, 0x06, 0xC2, 0x06, 0xC8, 0x06, 0xCE, 0x06, 0xD4, 0x06, 0xDA, + 0x06, 0xE0, 0x06, 0xE6, 0x06, 0xEC, 0x06, 0xF2, 0x06, 0xF8, 0x06, 0xFE, 0x07, 0x04, 0x07, 0x0A, + 0x07, 0x10, 0x07, 0x16, 0x07, 0x1C, 0x07, 0x22, 0x07, 0x28, 0x07, 0x2E, 0x07, 0x34, 0x07, 0x3A, + 0x07, 0x40, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x01, 0x00, 0x02, 0x03, 0x91, 0x03, 0x01, 0x00, 0x02, + 0x03, 0x95, 0x03, 0x01, 0x00, 0x02, 0x03, 0x97, 0x03, 0x01, 0x00, 0x02, 0x03, 0x99, 0x03, 0x01, + 0x00, 0x02, 0x03, 0x9F, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA9, + 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x44, 0x00, 0x02, 0x03, 0x99, 0x03, 0x08, 0x00, 0x02, + 0x03, 0xA5, 0x03, 0x08, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x01, + 0x00, 0x02, 0x03, 0xB7, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, + 0x03, 0x44, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x08, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x08, 0x00, 0x02, + 0x03, 0xBF, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x01, + 0x00, 0x02, 0x03, 0xD2, 0x03, 0x01, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x08, 0x00, 0x02, 0x03, 0xB1, + 0x03, 0x13, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x01, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x01, + 0x00, 0x02, 0x1F, 0x00, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, + 0x03, 0x13, 0x00, 0x02, 0x03, 0x91, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x09, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x01, + 0x00, 0x02, 0x1F, 0x08, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB5, + 0x03, 0x13, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x11, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x01, + 0x00, 0x02, 0x03, 0x95, 0x03, 0x13, 0x00, 0x02, 0x03, 0x95, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x18, + 0x03, 0x00, 0x00, 0x02, 0x1F, 0x19, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x01, 0x00, 0x02, + 0x1F, 0x19, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0x20, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x20, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0x21, 0x03, 0x42, 0x00, 0x02, 0x03, 0x97, 0x03, 0x13, 0x00, 0x02, 0x03, 0x97, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0x28, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x28, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0x29, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0x30, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x30, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0x31, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x13, 0x00, 0x02, 0x03, 0x99, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0x38, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x38, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0x39, 0x03, 0x42, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x13, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0x40, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x40, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x01, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x13, 0x00, 0x02, + 0x03, 0x9F, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0x48, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, + 0x03, 0x13, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x51, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x01, + 0x00, 0x02, 0x1F, 0x50, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, + 0x03, 0x14, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x01, 0x00, 0x02, + 0x1F, 0x59, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0x60, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x60, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0x61, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x14, + 0x00, 0x02, 0x1F, 0x68, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x68, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0x69, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x00, + 0x00, 0x02, 0x03, 0xB7, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x00, 0x00, 0x02, 0x03, 0xBF, + 0x03, 0x00, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x02, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x03, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x04, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x05, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x06, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x07, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x08, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0A, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x0B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0D, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0F, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x20, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x22, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x23, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x24, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x25, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x26, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x27, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x28, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2A, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x2B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2D, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2F, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x60, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x62, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x63, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x64, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x65, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x66, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x67, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0x68, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6A, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x6B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6D, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6F, 0x03, 0x45, 0x00, 0x02, + 0x03, 0xB1, 0x03, 0x06, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x04, 0x00, 0x02, 0x1F, 0x70, 0x03, 0x45, + 0x00, 0x02, 0x03, 0xB1, 0x03, 0x45, 0x00, 0x02, 0x03, 0xAC, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1, + 0x03, 0x42, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, 0x03, 0x06, 0x00, 0x02, + 0x03, 0x91, 0x03, 0x04, 0x00, 0x02, 0x03, 0x91, 0x03, 0x00, 0x00, 0x02, 0x03, 0x91, 0x03, 0x45, + 0x00, 0x02, 0x00, 0xA8, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x74, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB7, + 0x03, 0x45, 0x00, 0x02, 0x03, 0xAE, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xC3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x95, 0x03, 0x00, 0x00, 0x02, 0x03, 0x97, 0x03, 0x00, + 0x00, 0x02, 0x03, 0x97, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xBF, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x06, 0x00, 0x02, + 0x03, 0xB9, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x42, + 0x00, 0x02, 0x03, 0xCA, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x06, 0x00, 0x02, 0x03, 0x99, + 0x03, 0x04, 0x00, 0x02, 0x03, 0x99, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x00, 0x00, 0x02, + 0x1F, 0xFE, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x06, + 0x00, 0x02, 0x03, 0xC5, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC1, + 0x03, 0x13, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x14, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x42, 0x00, 0x02, + 0x03, 0xCB, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x06, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x04, + 0x00, 0x02, 0x03, 0xA5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA1, 0x03, 0x14, 0x00, 0x02, 0x00, 0xA8, + 0x03, 0x00, 0x00, 0x02, 0x1F, 0x7C, 0x03, 0x45, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x45, 0x00, 0x02, + 0x03, 0xCE, 0x03, 0x45, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x42, + 0x00, 0x02, 0x03, 0x9F, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA9, + 0x03, 0x45, 0x00, 0x01, 0x00, 0xE8, 0x03, 0x85, 0x03, 0x86, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8A, + 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAA, 0x03, 0xAB, 0x03, 0xAC, 0x03, 0xAD, + 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, 0x03, 0xCB, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, + 0x03, 0xD3, 0x03, 0xD4, 0x1F, 0x00, 0x1F, 0x01, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, + 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, 0x1F, 0x09, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, + 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x11, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, + 0x1F, 0x18, 0x1F, 0x19, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x20, 0x1F, 0x21, + 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, 0x1F, 0x29, + 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, + 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, 0x1F, 0x39, + 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x41, + 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x48, 0x1F, 0x49, 0x1F, 0x4A, 0x1F, 0x4B, + 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x50, 0x1F, 0x51, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, + 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x59, 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x61, + 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, + 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x72, + 0x1F, 0x74, 0x1F, 0x76, 0x1F, 0x78, 0x1F, 0x7A, 0x1F, 0x7C, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, + 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, + 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, + 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, + 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, + 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, + 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB0, 0x1F, 0xB1, 0x1F, 0xB2, + 0x1F, 0xB3, 0x1F, 0xB4, 0x1F, 0xB6, 0x1F, 0xB7, 0x1F, 0xB8, 0x1F, 0xB9, 0x1F, 0xBA, 0x1F, 0xBC, + 0x1F, 0xC1, 0x1F, 0xC2, 0x1F, 0xC3, 0x1F, 0xC4, 0x1F, 0xC6, 0x1F, 0xC7, 0x1F, 0xC8, 0x1F, 0xCA, + 0x1F, 0xCC, 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xCF, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, 0x1F, 0xD6, + 0x1F, 0xD7, 0x1F, 0xD8, 0x1F, 0xD9, 0x1F, 0xDA, 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xDF, 0x1F, 0xE0, + 0x1F, 0xE1, 0x1F, 0xE2, 0x1F, 0xE4, 0x1F, 0xE5, 0x1F, 0xE6, 0x1F, 0xE7, 0x1F, 0xE8, 0x1F, 0xE9, + 0x1F, 0xEA, 0x1F, 0xEC, 0x1F, 0xED, 0x1F, 0xF2, 0x1F, 0xF3, 0x1F, 0xF4, 0x1F, 0xF6, 0x1F, 0xF7, + 0x1F, 0xF8, 0x1F, 0xFA, 0x1F, 0xFC, 0x00, 0x01, 0x06, 0x30, 0x00, 0xC0, 0x01, 0x86, 0x01, 0x8C, + 0x01, 0x92, 0x01, 0x98, 0x01, 0x9E, 0x01, 0xA4, 0x01, 0xAA, 0x01, 0xB0, 0x01, 0xB6, 0x01, 0xBC, + 0x01, 0xC2, 0x01, 0xC8, 0x01, 0xCE, 0x01, 0xD4, 0x01, 0xDA, 0x01, 0xE0, 0x01, 0xE6, 0x01, 0xEC, + 0x01, 0xF2, 0x01, 0xF8, 0x01, 0xFE, 0x02, 0x04, 0x02, 0x0A, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1E, + 0x02, 0x26, 0x02, 0x2C, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3E, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, + 0x02, 0x5A, 0x02, 0x60, 0x02, 0x66, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, + 0x02, 0x8A, 0x02, 0x90, 0x02, 0x96, 0x02, 0x9C, 0x02, 0xA2, 0x02, 0xA8, 0x02, 0xAE, 0x02, 0xB6, + 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD6, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, + 0x02, 0xF2, 0x02, 0xF8, 0x02, 0xFE, 0x03, 0x04, 0x03, 0x0A, 0x03, 0x10, 0x03, 0x18, 0x03, 0x20, + 0x03, 0x26, 0x03, 0x2C, 0x03, 0x32, 0x03, 0x38, 0x03, 0x3E, 0x03, 0x46, 0x03, 0x4E, 0x03, 0x54, + 0x03, 0x5A, 0x03, 0x60, 0x03, 0x66, 0x03, 0x6C, 0x03, 0x72, 0x03, 0x78, 0x03, 0x7E, 0x03, 0x84, + 0x03, 0x8A, 0x03, 0x90, 0x03, 0x96, 0x03, 0x9C, 0x03, 0xA2, 0x03, 0xA8, 0x03, 0xB0, 0x03, 0xB8, + 0x03, 0xBE, 0x03, 0xC4, 0x03, 0xCC, 0x03, 0xD2, 0x03, 0xD8, 0x03, 0xDE, 0x03, 0xE4, 0x03, 0xEA, + 0x03, 0xF2, 0x03, 0xFA, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, 0x04, 0x12, 0x04, 0x18, 0x04, 0x1E, + 0x04, 0x26, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, 0x04, 0x40, 0x04, 0x46, 0x04, 0x4C, 0x04, 0x52, + 0x04, 0x58, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82, + 0x04, 0x88, 0x04, 0x8E, 0x04, 0x94, 0x04, 0x9A, 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAC, 0x04, 0xB2, + 0x04, 0xB8, 0x04, 0xBE, 0x04, 0xC4, 0x04, 0xCA, 0x04, 0xD0, 0x04, 0xD6, 0x04, 0xDC, 0x04, 0xE2, + 0x04, 0xE8, 0x04, 0xEE, 0x04, 0xF4, 0x04, 0xFA, 0x05, 0x00, 0x05, 0x06, 0x05, 0x0C, 0x05, 0x12, + 0x05, 0x18, 0x05, 0x1E, 0x05, 0x24, 0x05, 0x2A, 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, + 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A, 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, + 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A, 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, + 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x05, 0xBA, 0x05, 0xC0, 0x05, 0xC6, 0x05, 0xCC, 0x05, 0xD2, + 0x05, 0xDA, 0x05, 0xE0, 0x05, 0xE6, 0x05, 0xEC, 0x05, 0xF2, 0x05, 0xF8, 0x06, 0x00, 0x06, 0x06, + 0x06, 0x0C, 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x00, 0x02, 0x00, 0xA8, + 0x03, 0x41, 0x00, 0x02, 0x03, 0x91, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x41, 0x00, 0x02, + 0x03, 0x97, 0x03, 0x41, 0x00, 0x02, 0x03, 0x99, 0x03, 0x41, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x41, + 0x00, 0x02, 0x03, 0xA5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCA, + 0x03, 0x01, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x41, 0x00, 0x02, + 0x03, 0xB7, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x01, + 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x08, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5, + 0x03, 0x41, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x41, 0x00, 0x02, + 0x03, 0xB1, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0x00, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, + 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, + 0x03, 0x43, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0x08, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, + 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x43, + 0x00, 0x02, 0x1F, 0x10, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x10, + 0x03, 0x41, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x43, 0x00, 0x02, + 0x1F, 0x18, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x19, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x41, + 0x00, 0x02, 0x1F, 0x19, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x20, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x41, 0x00, 0x02, + 0x1F, 0x21, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, + 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x97, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0x29, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x29, + 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, + 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x14, 0x00, 0x02, + 0x1F, 0x30, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x41, + 0x00, 0x02, 0x1F, 0x31, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, + 0x03, 0xB9, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x38, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x41, 0x00, 0x02, + 0x1F, 0x39, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, + 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0x41, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x41, + 0x03, 0x41, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0x49, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x41, + 0x00, 0x02, 0x03, 0xC5, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x51, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x41, 0x00, 0x03, + 0x03, 0xC5, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0x59, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, + 0x03, 0x42, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0x61, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x41, + 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x42, + 0x00, 0x02, 0x03, 0xA9, 0x03, 0x43, 0x00, 0x02, 0x21, 0x26, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x68, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x41, 0x00, 0x02, + 0x1F, 0x69, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, + 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x40, + 0x00, 0x02, 0x03, 0xB7, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x40, 0x00, 0x02, 0x03, 0xBF, + 0x03, 0x40, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x40, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0xB3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0x81, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x81, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xBC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0x89, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x89, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xC3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0x91, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x91, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xCC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0x99, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x99, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xF3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA1, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xFC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA9, + 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x42, 0x00, 0x02, + 0x1F, 0xB3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x71, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB6, 0x03, 0x45, + 0x00, 0x02, 0x03, 0x91, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x75, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x95, 0x03, 0x40, 0x00, 0x02, + 0x03, 0x97, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x41, + 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x06, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x42, + 0x00, 0x02, 0x03, 0x99, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xFE, + 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x40, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x43, 0x00, 0x03, + 0x03, 0xC5, 0x03, 0x08, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x40, 0x00, 0x02, 0x00, 0xA8, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x7D, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0xF6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x40, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x40, + 0x00, 0x02, 0x21, 0x26, 0x03, 0x45, 0x00, 0x01, 0x00, 0xC0, 0x03, 0x85, 0x03, 0x86, 0x03, 0x88, + 0x03, 0x89, 0x03, 0x8A, 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAC, 0x03, 0xAD, + 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, 0x03, 0xD3, + 0x1F, 0x00, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, + 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x12, + 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x18, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, + 0x1F, 0x20, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, + 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, + 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, 0x1F, 0x3A, + 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x42, 0x1F, 0x43, + 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x48, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x50, + 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x5B, 0x1F, 0x5D, + 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x67, + 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, + 0x1F, 0x70, 0x1F, 0x72, 0x1F, 0x74, 0x1F, 0x76, 0x1F, 0x78, 0x1F, 0x7A, 0x1F, 0x7C, 0x1F, 0x80, + 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, + 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, + 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, + 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, + 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, + 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, + 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xBA, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xC8, 0x1F, 0xCA, + 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, 0x1F, 0xD6, 0x1F, 0xD7, 0x1F, 0xDA, + 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xE2, 0x1F, 0xE4, 0x1F, 0xE7, 0x1F, 0xEA, 0x1F, 0xED, 0x1F, 0xF2, + 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xF8, 0x1F, 0xFA, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0xE0, 0x00, 0x85, + 0x01, 0x10, 0x01, 0x16, 0x01, 0x1C, 0x01, 0x22, 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x40, + 0x01, 0x48, 0x01, 0x50, 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, + 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB0, 0x01, 0xB8, 0x01, 0xC0, + 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD8, 0x01, 0xE0, 0x01, 0xE8, 0x01, 0xF0, 0x01, 0xF8, 0x02, 0x00, + 0x02, 0x08, 0x02, 0x0E, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, 0x02, 0x2E, 0x02, 0x36, 0x02, 0x3E, + 0x02, 0x46, 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E, + 0x02, 0x86, 0x02, 0x8E, 0x02, 0x96, 0x02, 0x9E, 0x02, 0xA6, 0x02, 0xAE, 0x02, 0xB6, 0x02, 0xBE, + 0x02, 0xC6, 0x02, 0xCE, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, + 0x03, 0x06, 0x03, 0x0C, 0x03, 0x14, 0x03, 0x1C, 0x03, 0x24, 0x03, 0x2C, 0x03, 0x34, 0x03, 0x3C, + 0x03, 0x42, 0x03, 0x48, 0x03, 0x50, 0x03, 0x56, 0x03, 0x5C, 0x03, 0x62, 0x03, 0x68, 0x03, 0x70, + 0x03, 0x78, 0x03, 0x7E, 0x03, 0x86, 0x03, 0x8C, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA6, + 0x03, 0xAE, 0x03, 0xB4, 0x03, 0xBC, 0x03, 0xC2, 0x03, 0xC8, 0x03, 0xCE, 0x03, 0xD4, 0x03, 0xDC, + 0x03, 0xE4, 0x03, 0xEA, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x04, 0x04, 0x0A, 0x04, 0x12, + 0x04, 0x1A, 0x04, 0x20, 0x04, 0x28, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, 0x04, 0x40, 0x04, 0x48, + 0x04, 0x50, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7E, + 0x04, 0x86, 0x04, 0x8C, 0x04, 0x92, 0x04, 0x9A, 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAE, 0x04, 0xB6, + 0x04, 0xBE, 0x04, 0xC6, 0x04, 0xCC, 0x04, 0xD2, 0x04, 0xDA, 0x00, 0x02, 0x21, 0x26, 0x03, 0x01, + 0x00, 0x02, 0x03, 0xCA, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x01, 0x00, 0x02, 0x03, 0xCB, + 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, + 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, + 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, + 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, + 0x03, 0x42, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, + 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, + 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, + 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, + 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, + 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, + 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, + 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, + 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x13, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x00, + 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x01, + 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x42, + 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x00, + 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x01, + 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x42, + 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x00, + 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x01, + 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x00, + 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x01, + 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x00, + 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x01, + 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x00, + 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x00, + 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, + 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, + 0x00, 0x02, 0x21, 0x26, 0x03, 0x13, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, + 0x03, 0xA9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, + 0x03, 0xA9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, + 0x21, 0x26, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xB3, + 0x03, 0x43, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x40, + 0x00, 0x02, 0x1F, 0x81, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x81, + 0x03, 0x41, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x42, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0x88, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x88, + 0x03, 0x41, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x09, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x43, 0x00, 0x03, + 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x91, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x41, 0x00, 0x03, + 0x1F, 0x20, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0xCC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x98, + 0x03, 0x40, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x41, 0x00, 0x02, + 0x1F, 0x99, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x43, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, + 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x42, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x43, + 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x40, 0x00, 0x02, + 0x1F, 0xA9, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x41, + 0x00, 0x03, 0x1F, 0x68, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x01, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x00, + 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x00, + 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x21, 0x26, 0x03, 0x00, 0x00, 0x01, 0x00, 0x85, 0x03, 0x8F, + 0x03, 0x90, 0x03, 0xAF, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, + 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, + 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, + 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x30, + 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x3A, 0x1F, 0x3B, + 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x4A, + 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, + 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x68, + 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, 0x76, 0x1F, 0x80, + 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, + 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, + 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, + 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, + 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, + 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, + 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xD2, 0x1F, 0xD7, 0x1F, 0xE2, + 0x1F, 0xF2, 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xFA, 0x00, 0x01, 0x04, 0xC0, 0x00, 0x7B, 0x00, 0xFC, + 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, + 0x01, 0x3E, 0x01, 0x46, 0x01, 0x4E, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, + 0x01, 0x7E, 0x01, 0x86, 0x01, 0x8E, 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, + 0x01, 0xBE, 0x01, 0xC6, 0x01, 0xCE, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, + 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, + 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x74, + 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, + 0x02, 0xBA, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, 0x02, 0xE8, 0x02, 0xF0, + 0x02, 0xF8, 0x03, 0x00, 0x03, 0x08, 0x03, 0x10, 0x03, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x30, + 0x03, 0x38, 0x03, 0x40, 0x03, 0x48, 0x03, 0x50, 0x03, 0x58, 0x03, 0x60, 0x03, 0x68, 0x03, 0x70, + 0x03, 0x78, 0x03, 0x80, 0x03, 0x88, 0x03, 0x90, 0x03, 0x98, 0x03, 0xA0, 0x03, 0xA8, 0x03, 0xB0, + 0x03, 0xB8, 0x03, 0xC0, 0x03, 0xC8, 0x03, 0xD0, 0x03, 0xD8, 0x03, 0xE0, 0x03, 0xE8, 0x03, 0xF0, + 0x03, 0xF8, 0x04, 0x00, 0x04, 0x08, 0x04, 0x10, 0x04, 0x18, 0x04, 0x20, 0x04, 0x28, 0x04, 0x30, + 0x04, 0x38, 0x04, 0x40, 0x04, 0x48, 0x04, 0x50, 0x04, 0x58, 0x04, 0x60, 0x04, 0x68, 0x04, 0x70, + 0x04, 0x76, 0x04, 0x7E, 0x04, 0x86, 0x04, 0x8C, 0x04, 0x94, 0x04, 0x9C, 0x04, 0xA4, 0x04, 0xAC, + 0x04, 0xB2, 0x04, 0xBA, 0x00, 0x02, 0x21, 0x26, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x44, + 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, + 0x03, 0xB1, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, + 0x03, 0xB1, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, + 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, + 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, + 0x03, 0xB5, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, + 0x03, 0xB5, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, + 0x03, 0x95, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, + 0x03, 0x95, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, + 0x03, 0xB7, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, + 0x03, 0xB7, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, + 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, + 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x41, 0x00, 0x02, + 0x1F, 0xBE, 0x03, 0x43, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, + 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, + 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, + 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, + 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, + 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, + 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, + 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, + 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, + 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, + 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA5, + 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, + 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, + 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x41, 0x00, 0x02, 0x21, 0x26, + 0x03, 0x43, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, + 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x40, + 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, + 0x00, 0x03, 0x1F, 0x00, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x00, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x42, + 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, + 0x00, 0x03, 0x1F, 0x08, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x08, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x42, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, + 0x00, 0x03, 0x1F, 0x20, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x20, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x42, + 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, + 0x00, 0x03, 0x1F, 0x28, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x28, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x42, + 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, + 0x00, 0x03, 0x1F, 0x60, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x60, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x42, + 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, + 0x00, 0x03, 0x1F, 0x68, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x68, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x42, + 0x00, 0x03, 0x03, 0xB1, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x41, 0x00, 0x03, + 0x03, 0xB1, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, + 0x1F, 0xC3, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, + 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, + 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x02, 0x21, 0x26, 0x03, 0x40, 0x00, 0x01, 0x00, 0x7B, 0x03, 0x8F, 0x03, 0x90, + 0x03, 0xAF, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x0A, 0x1F, 0x0B, + 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, + 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x2A, 0x1F, 0x2B, + 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x30, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, + 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, + 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, + 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x68, 0x1F, 0x6A, + 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x76, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, + 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, + 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, + 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, + 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, + 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, + 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xB7, + 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xD2, 0x1F, 0xE2, 0x1F, 0xF2, 0x1F, 0xF4, 0x1F, 0xF7, + 0x1F, 0xFA, 0x00, 0x01, 0x03, 0x4E, 0x00, 0x54, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, + 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, + 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3E, 0x01, 0x46, + 0x01, 0x4E, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x86, + 0x01, 0x8E, 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBE, 0x01, 0xC6, + 0x01, 0xCE, 0x01, 0xD6, 0x01, 0xDE, 0x01, 0xE6, 0x01, 0xEE, 0x01, 0xF6, 0x01, 0xFE, 0x02, 0x06, + 0x02, 0x0E, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, 0x02, 0x2E, 0x02, 0x36, 0x02, 0x3E, 0x02, 0x46, + 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E, 0x02, 0x86, + 0x02, 0x8E, 0x02, 0x96, 0x02, 0x9E, 0x02, 0xA6, 0x02, 0xAE, 0x02, 0xB6, 0x02, 0xBE, 0x02, 0xC6, + 0x02, 0xCE, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06, + 0x03, 0x0E, 0x03, 0x16, 0x03, 0x1E, 0x03, 0x26, 0x03, 0x2E, 0x03, 0x36, 0x03, 0x3E, 0x03, 0x46, + 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x41, + 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, + 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x01, + 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x01, + 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x01, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, + 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, + 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x00, + 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x01, + 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x00, + 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x00, + 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x00, + 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x00, + 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x00, + 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, + 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, + 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x42, + 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x40, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x01, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x01, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x42, + 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x08, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x40, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x08, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x42, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x40, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x21, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x21, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x42, + 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x28, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x40, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x28, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x42, + 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x40, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x61, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x61, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x42, + 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, + 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x40, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x69, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0x69, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x42, + 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x40, 0x03, 0x45, + 0x00, 0x03, 0x03, 0xB1, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x40, 0x03, 0x45, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x00, + 0x00, 0x03, 0x03, 0xC9, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x54, 0x03, 0x90, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, + 0x1F, 0x12, 0x1F, 0x14, 0x1F, 0x1A, 0x1F, 0x1C, 0x1F, 0x22, 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, + 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x3A, 0x1F, 0x3C, 0x1F, 0x42, + 0x1F, 0x44, 0x1F, 0x4A, 0x1F, 0x4C, 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, 0x1F, 0x64, 0x1F, 0x6A, + 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, + 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, + 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, + 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, + 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, + 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, + 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xD2, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x03, 0x3C, + 0x00, 0x51, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8, + 0x00, 0xE0, 0x00, 0xE8, 0x00, 0xF0, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x08, 0x01, 0x10, 0x01, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x40, 0x01, 0x48, 0x01, 0x50, 0x01, 0x58, + 0x01, 0x60, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, + 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB0, 0x01, 0xB8, 0x01, 0xC0, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xDA, + 0x01, 0xE2, 0x01, 0xEA, 0x01, 0xF2, 0x01, 0xFA, 0x02, 0x02, 0x02, 0x0A, 0x02, 0x14, 0x02, 0x1C, + 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, + 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E, 0x02, 0x88, 0x02, 0x90, 0x02, 0x98, 0x02, 0xA0, + 0x02, 0xA8, 0x02, 0xB0, 0x02, 0xB8, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, + 0x02, 0xEA, 0x02, 0xF2, 0x02, 0xFA, 0x03, 0x04, 0x03, 0x0C, 0x03, 0x14, 0x03, 0x1C, 0x03, 0x24, + 0x03, 0x2C, 0x03, 0x34, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, + 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA9, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, + 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, + 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x01, + 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x01, + 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, + 0x1F, 0x08, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, + 0x1F, 0x08, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, + 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x00, + 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x01, + 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x42, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, + 0x03, 0x13, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, + 0x03, 0x00, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, + 0x03, 0x01, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x1F, 0x60, + 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x60, + 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xF3, + 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, + 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, + 0x1F, 0x68, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, + 0x1F, 0x68, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, + 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x00, + 0x00, 0x03, 0x03, 0xC9, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, 0x00, 0x51, 0x03, 0x90, 0x1F, 0x02, + 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, 0x1F, 0x12, 0x1F, 0x14, 0x1F, 0x1A, 0x1F, 0x1C, 0x1F, 0x22, + 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x3A, + 0x1F, 0x3C, 0x1F, 0x42, 0x1F, 0x44, 0x1F, 0x4A, 0x1F, 0x4C, 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, + 0x1F, 0x64, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, + 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, + 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, + 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, + 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, + 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, + 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xD2, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, + 0x02, 0x30, 0x00, 0x35, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, + 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xCA, 0x00, 0xD4, 0x00, 0xDC, + 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, 0x01, 0x10, 0x01, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x42, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, + 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7E, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA8, + 0x01, 0xB0, 0x01, 0xBA, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, + 0x01, 0xF6, 0x02, 0x00, 0x02, 0x08, 0x02, 0x10, 0x02, 0x18, 0x02, 0x20, 0x02, 0x28, 0x00, 0x03, + 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, + 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, + 0x21, 0x26, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, + 0x1F, 0x00, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, + 0x1F, 0x00, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, + 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, + 0x1F, 0x21, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, + 0x1F, 0x21, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, + 0x03, 0x43, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, + 0x1F, 0x60, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, + 0x1F, 0x60, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, + 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, + 0x03, 0xB1, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, + 0x03, 0xB7, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, + 0x03, 0xC9, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, + 0x00, 0x35, 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x80, 0x1F, 0x82, + 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, + 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, + 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, + 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, + 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, + 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x01, 0xE0, + 0x00, 0x2D, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, + 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, + 0x00, 0xDC, 0x00, 0xE6, 0x00, 0xF0, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x08, 0x01, 0x10, 0x01, 0x1A, + 0x01, 0x24, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x60, + 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x82, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA4, + 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBE, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD8, 0x00, 0x03, 0x1F, 0xBE, + 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, + 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, + 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, + 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, + 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x00, + 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x01, + 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, + 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, + 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, + 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x00, + 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x01, + 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, + 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xF3, + 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x00, + 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x01, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, + 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x2D, + 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, + 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, + 0x1F, 0x8F, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x9A, + 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, + 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, + 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB4, 0x1F, 0xC4, 0x1F, 0xF4, 0x00, 0x01, 0x01, 0x7C, 0x00, 0x24, + 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, 0x00, 0x66, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86, + 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC2, 0x00, 0xCA, + 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x04, 0x01, 0x0C, + 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x40, 0x01, 0x48, 0x01, 0x50, + 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x72, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x00, + 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x00, + 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x40, + 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x41, + 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x42, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, + 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, + 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xC3, + 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, + 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, + 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x40, + 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x41, + 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, + 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, + 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, + 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B, + 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, + 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, + 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, + 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x94, 0x00, 0x24, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, 0x00, 0x66, + 0x00, 0x6E, 0x00, 0x76, 0x00, 0x80, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAE, + 0x00, 0xB6, 0x00, 0xC0, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEE, 0x00, 0xF8, + 0x01, 0x00, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x38, 0x01, 0x40, + 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x80, 0x01, 0x8A, + 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x41, + 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x41, + 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, + 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, + 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, + 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, + 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, + 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, + 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x00, + 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, + 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, + 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, + 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B, + 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, + 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, + 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, + 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6C, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x60, + 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA2, 0x00, 0xAA, + 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, + 0x00, 0xFE, 0x01, 0x06, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, + 0x01, 0x46, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x62, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x40, + 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, + 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, + 0x03, 0x91, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x41, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, + 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, + 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, + 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, + 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, + 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, + 0x03, 0xA9, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x41, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x42, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x01, + 0x00, 0x20, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B, + 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, + 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, + 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, + 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6E, 0x00, 0x1E, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, + 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, + 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, + 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x01, 0x32, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x50, + 0x01, 0x5A, 0x01, 0x64, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x01, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, + 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, + 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, + 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, + 0x03, 0x97, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xC9, + 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, + 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, + 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, + 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, + 0x00, 0x01, 0x00, 0x1E, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, + 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, + 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, + 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, + 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, + 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, + 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, + 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, + 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, + 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, + 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, + 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, + 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, + 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x42, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, + 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, + 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, + 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, + 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, + 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, + 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, + 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, + 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, + 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, + 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, + 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, + 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, + 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, + 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, + 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, + 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, + 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, + 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, + 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, + 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, + 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x42, + 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, + 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, + 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, + 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, + 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, + 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, + 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x00, + 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, + 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, + 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, + 0x21, 0x26, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, + 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, + 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, + 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, + 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, + 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, + 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, + 0x03, 0x97, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x40, + 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, + 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, + 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x01, + 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, + 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, + 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, + 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, + 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, + 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, + 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, + 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xAE, + 0x00, 0x0E, 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, + 0x00, 0x68, 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, + 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, + 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, + 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, + 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, + 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE, 0x00, 0x0E, + 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, 0x00, 0x68, + 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, 0x03, 0xB1, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, + 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, + 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, + 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, + 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, 0x1F, 0x84, + 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, + 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE, 0x00, 0x0E, 0x00, 0x22, + 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, 0x00, 0x68, 0x00, 0x72, + 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, + 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, + 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, + 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, + 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, + 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, + 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, + 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x28, + 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x78, + 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, + 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, + 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, + 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, 0x00, 0x0C, + 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, + 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, 0x00, 0x1E, + 0x00, 0x28, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, + 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, + 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, + 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, + 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, + 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, + 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x01, + 0x00, 0x0C, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, + 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, + 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, + 0x21, 0x26, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, + 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, + 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, + 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, + 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, + 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, + 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, + 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, + 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, + 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, + 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, + 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, + 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, + 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, + 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, + 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, + 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, + 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x01, + 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, + 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, + 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, + 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, + 0x1F, 0xAC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x36, 0x00, 0x16, + 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x78, + 0x00, 0x82, 0x00, 0x8C, 0x00, 0x96, 0x00, 0xA0, 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBE, 0x00, 0xC8, + 0x00, 0xD2, 0x00, 0xE4, 0x00, 0xF6, 0x01, 0x08, 0x01, 0x1A, 0x01, 0x2C, 0x00, 0x01, 0x00, 0x04, + 0x30, 0x94, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x4C, 0x00, 0x02, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x04, 0x30, 0x4E, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x50, + 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x52, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, + 0x00, 0x04, 0x30, 0x54, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x56, 0x00, 0x02, + 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x58, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, + 0x30, 0x5A, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x5C, 0x00, 0x02, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x04, 0x30, 0x5E, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x60, + 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x62, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, + 0x00, 0x04, 0x30, 0x65, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x67, 0x00, 0x02, + 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x69, 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0C, 0x30, 0x70, 0x00, 0x02, 0x30, 0x99, 0x30, 0x71, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0C, 0x30, 0x73, 0x00, 0x02, 0x30, 0x99, 0x30, 0x74, 0x00, 0x02, 0x30, 0x9A, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x76, 0x00, 0x02, 0x30, 0x99, 0x30, 0x77, 0x00, 0x02, + 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x79, 0x00, 0x02, 0x30, 0x99, 0x30, 0x7A, + 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x7C, 0x00, 0x02, 0x30, 0x99, + 0x30, 0x7D, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x01, 0x00, 0x04, 0x30, 0x9E, 0x00, 0x02, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x16, 0x30, 0x46, 0x30, 0x4B, 0x30, 0x4D, 0x30, 0x4F, 0x30, 0x51, 0x30, 0x53, + 0x30, 0x55, 0x30, 0x57, 0x30, 0x59, 0x30, 0x5B, 0x30, 0x5D, 0x30, 0x5F, 0x30, 0x61, 0x30, 0x64, + 0x30, 0x66, 0x30, 0x68, 0x30, 0x6F, 0x30, 0x72, 0x30, 0x75, 0x30, 0x78, 0x30, 0x7B, 0x30, 0x9D, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0xDE, 0x00, 0x1B, 0x00, 0x3C, + 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, + 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x84, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, 0x00, 0x9C, + 0x00, 0xA2, 0x00, 0xA8, 0x00, 0xAE, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC0, 0x00, 0xC6, 0x00, 0xCC, + 0x00, 0xD2, 0x00, 0xD8, 0x00, 0x02, 0x30, 0x4B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x4D, 0x30, 0x99, + 0x00, 0x02, 0x30, 0x4F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x51, 0x30, 0x99, 0x00, 0x02, 0x30, 0x53, + 0x30, 0x99, 0x00, 0x02, 0x30, 0x55, 0x30, 0x99, 0x00, 0x02, 0x30, 0x57, 0x30, 0x99, 0x00, 0x02, + 0x30, 0x59, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5D, 0x30, 0x99, + 0x00, 0x02, 0x30, 0x5F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x61, 0x30, 0x99, 0x00, 0x02, 0x30, 0x64, + 0x30, 0x99, 0x00, 0x02, 0x30, 0x66, 0x30, 0x99, 0x00, 0x02, 0x30, 0x68, 0x30, 0x99, 0x00, 0x02, + 0x30, 0x6F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x6F, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x72, 0x30, 0x99, + 0x00, 0x02, 0x30, 0x72, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x75, 0x30, 0x99, 0x00, 0x02, 0x30, 0x75, + 0x30, 0x9A, 0x00, 0x02, 0x30, 0x78, 0x30, 0x99, 0x00, 0x02, 0x30, 0x78, 0x30, 0x9A, 0x00, 0x02, + 0x30, 0x7B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x7B, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x46, 0x30, 0x99, + 0x00, 0x02, 0x30, 0x9D, 0x30, 0x99, 0x00, 0x01, 0x00, 0x1B, 0x30, 0x4C, 0x30, 0x4E, 0x30, 0x50, + 0x30, 0x52, 0x30, 0x54, 0x30, 0x56, 0x30, 0x58, 0x30, 0x5A, 0x30, 0x5C, 0x30, 0x5E, 0x30, 0x60, + 0x30, 0x62, 0x30, 0x65, 0x30, 0x67, 0x30, 0x69, 0x30, 0x70, 0x30, 0x71, 0x30, 0x73, 0x30, 0x74, + 0x30, 0x76, 0x30, 0x77, 0x30, 0x79, 0x30, 0x7A, 0x30, 0x7C, 0x30, 0x7D, 0x30, 0x94, 0x30, 0x9E, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x00, 0x0C, + 0x00, 0x16, 0x00, 0x3A, 0x00, 0x01, 0x00, 0x04, 0x0C, 0xC0, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x04, + 0x00, 0x0A, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x0C, 0xCB, 0x00, 0x03, 0x0C, 0xC2, 0x0C, 0xD5, + 0x0C, 0xCA, 0x00, 0x02, 0x0C, 0xC2, 0x0C, 0xC7, 0x00, 0x02, 0x0C, 0xD5, 0x0C, 0xC8, 0x00, 0x02, + 0x0C, 0xD6, 0x00, 0x01, 0x00, 0x04, 0x0C, 0xCB, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x03, + 0x0C, 0xBF, 0x0C, 0xC6, 0x0C, 0xCA, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x46, + 0x00, 0x01, 0x00, 0x2E, 0x00, 0x05, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, + 0x00, 0x02, 0x0C, 0xBF, 0x0C, 0xD5, 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xD5, 0x00, 0x02, 0x0C, 0xC6, + 0x0C, 0xD6, 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xC2, 0x00, 0x02, 0x0C, 0xCA, 0x0C, 0xD5, 0x00, 0x01, + 0x00, 0x05, 0x0C, 0xC0, 0x0C, 0xC7, 0x0C, 0xC8, 0x0C, 0xCA, 0x0C, 0xCB, 0x00, 0x01, 0x00, 0x10, + 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x0C, 0xC6, 0x0C, 0xC2, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x01, + 0x0C, 0xCB, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x66, 0x00, 0x1A, + 0x00, 0x3A, 0x00, 0x44, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, + 0x00, 0x8A, 0x00, 0x94, 0x00, 0x9E, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, + 0x00, 0xDA, 0x00, 0xEC, 0x00, 0xFE, 0x01, 0x10, 0x01, 0x22, 0x01, 0x34, 0x01, 0x3E, 0x01, 0x48, + 0x01, 0x52, 0x01, 0x5C, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF4, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, + 0x00, 0x04, 0x30, 0xAC, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xAE, 0x00, 0x02, + 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, + 0x30, 0xB2, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB4, 0x00, 0x02, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x04, 0x30, 0xB6, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB8, + 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBA, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, + 0x00, 0x04, 0x30, 0xBC, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBE, 0x00, 0x02, + 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, + 0x30, 0xC2, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC5, 0x00, 0x02, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x04, 0x30, 0xC7, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC9, + 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD0, 0x00, 0x02, 0x30, 0x99, + 0x30, 0xD1, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD3, 0x00, 0x02, + 0x30, 0x99, 0x30, 0xD4, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD6, + 0x00, 0x02, 0x30, 0x99, 0x30, 0xD7, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, + 0x30, 0xD9, 0x00, 0x02, 0x30, 0x99, 0x30, 0xDA, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0C, 0x30, 0xDC, 0x00, 0x02, 0x30, 0x99, 0x30, 0xDD, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x01, + 0x00, 0x04, 0x30, 0xF7, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF8, 0x00, 0x02, + 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF9, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, + 0x30, 0xFA, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xFE, 0x00, 0x02, 0x30, 0x99, + 0x00, 0x01, 0x00, 0x1A, 0x30, 0xA6, 0x30, 0xAB, 0x30, 0xAD, 0x30, 0xAF, 0x30, 0xB1, 0x30, 0xB3, + 0x30, 0xB5, 0x30, 0xB7, 0x30, 0xB9, 0x30, 0xBB, 0x30, 0xBD, 0x30, 0xBF, 0x30, 0xC1, 0x30, 0xC4, + 0x30, 0xC6, 0x30, 0xC8, 0x30, 0xCF, 0x30, 0xD2, 0x30, 0xD5, 0x30, 0xD8, 0x30, 0xDB, 0x30, 0xEF, + 0x30, 0xF0, 0x30, 0xF1, 0x30, 0xF2, 0x30, 0xFD, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, + 0x00, 0x01, 0x00, 0xFE, 0x00, 0x1F, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, + 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, + 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, + 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, + 0x00, 0xF2, 0x00, 0xF8, 0x00, 0x02, 0x30, 0xAB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xAD, 0x30, 0x99, + 0x00, 0x02, 0x30, 0xAF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB3, + 0x30, 0x99, 0x00, 0x02, 0x30, 0xB5, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB7, 0x30, 0x99, 0x00, 0x02, + 0x30, 0xB9, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBD, 0x30, 0x99, + 0x00, 0x02, 0x30, 0xBF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC4, + 0x30, 0x99, 0x00, 0x02, 0x30, 0xC6, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC8, 0x30, 0x99, 0x00, 0x02, + 0x30, 0xCF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xCF, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD2, 0x30, 0x99, + 0x00, 0x02, 0x30, 0xD2, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD5, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD5, + 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD8, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD8, 0x30, 0x9A, 0x00, 0x02, + 0x30, 0xDB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xDB, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xA6, 0x30, 0x99, + 0x00, 0x02, 0x30, 0xEF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF0, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF1, + 0x30, 0x99, 0x00, 0x02, 0x30, 0xF2, 0x30, 0x99, 0x00, 0x02, 0x30, 0xFD, 0x30, 0x99, 0x00, 0x01, + 0x00, 0x1F, 0x30, 0xAC, 0x30, 0xAE, 0x30, 0xB0, 0x30, 0xB2, 0x30, 0xB4, 0x30, 0xB6, 0x30, 0xB8, + 0x30, 0xBA, 0x30, 0xBC, 0x30, 0xBE, 0x30, 0xC0, 0x30, 0xC2, 0x30, 0xC5, 0x30, 0xC7, 0x30, 0xC9, + 0x30, 0xD0, 0x30, 0xD1, 0x30, 0xD3, 0x30, 0xD4, 0x30, 0xD6, 0x30, 0xD7, 0x30, 0xD9, 0x30, 0xDA, + 0x30, 0xDC, 0x30, 0xDD, 0x30, 0xF4, 0x30, 0xF7, 0x30, 0xF8, 0x30, 0xF9, 0x30, 0xFA, 0x30, 0xFE, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x1E, 0x9A, 0x00, 0x89, 0x01, 0x18, + 0x02, 0x72, 0x02, 0x8C, 0x02, 0xE6, 0x03, 0x18, 0x04, 0x3E, 0x04, 0x48, 0x04, 0x8A, 0x04, 0xC4, + 0x05, 0x6A, 0x05, 0x74, 0x05, 0xA6, 0x05, 0xF4, 0x06, 0x16, 0x06, 0x70, 0x08, 0x56, 0x08, 0x70, + 0x08, 0xCE, 0x09, 0x42, 0x09, 0x7C, 0x0B, 0x14, 0x0B, 0x26, 0x0B, 0x68, 0x0B, 0x7A, 0x0B, 0xD4, + 0x0C, 0x0E, 0x0D, 0x68, 0x0D, 0x82, 0x0D, 0xDC, 0x0E, 0x0E, 0x0F, 0x34, 0x0F, 0x3E, 0x0F, 0x80, + 0x0F, 0xC2, 0x10, 0x60, 0x10, 0x72, 0x10, 0xA4, 0x10, 0xF2, 0x11, 0x14, 0x11, 0x6E, 0x13, 0x54, + 0x13, 0x6E, 0x13, 0xCC, 0x14, 0x40, 0x14, 0x82, 0x16, 0x1A, 0x16, 0x2C, 0x16, 0x76, 0x16, 0x88, + 0x16, 0xEA, 0x17, 0x24, 0x17, 0x5E, 0x17, 0x68, 0x17, 0x7A, 0x17, 0x94, 0x17, 0xA6, 0x17, 0xE0, + 0x17, 0xF2, 0x17, 0xFC, 0x18, 0x06, 0x18, 0x40, 0x18, 0x6A, 0x18, 0x74, 0x18, 0x86, 0x18, 0x90, + 0x18, 0x9A, 0x18, 0xCC, 0x19, 0x06, 0x19, 0x10, 0x19, 0x22, 0x19, 0x3C, 0x19, 0x4E, 0x19, 0x88, + 0x19, 0x9A, 0x19, 0xA4, 0x19, 0xAE, 0x19, 0xE8, 0x1A, 0x12, 0x1A, 0x1C, 0x1A, 0x2E, 0x1A, 0x38, + 0x1A, 0x42, 0x1A, 0x74, 0x1A, 0xAE, 0x1A, 0xE8, 0x1A, 0xF2, 0x1A, 0xFC, 0x1B, 0x1E, 0x1B, 0x40, + 0x1B, 0x4A, 0x1B, 0x54, 0x1B, 0x7E, 0x1B, 0xA8, 0x1B, 0xB2, 0x1B, 0xBC, 0x1B, 0xC6, 0x1B, 0xD0, + 0x1B, 0xEA, 0x1C, 0x04, 0x1C, 0x0E, 0x1C, 0x18, 0x1C, 0x22, 0x1C, 0x5C, 0x1C, 0x96, 0x1C, 0xD0, + 0x1D, 0x0A, 0x1D, 0x14, 0x1D, 0x1E, 0x1D, 0x28, 0x1D, 0x32, 0x1D, 0x3C, 0x1D, 0x46, 0x1D, 0x50, + 0x1D, 0x5A, 0x1D, 0x64, 0x1D, 0x6E, 0x1D, 0x78, 0x1D, 0x82, 0x1D, 0x8C, 0x1D, 0x96, 0x1D, 0xA0, + 0x1D, 0xAA, 0x1D, 0xB4, 0x1D, 0xBE, 0x1D, 0xD0, 0x1D, 0xE2, 0x1D, 0xEC, 0x1D, 0xF6, 0x1E, 0x08, + 0x1E, 0x1A, 0x1E, 0x24, 0x1E, 0x2E, 0x1E, 0x38, 0x1E, 0x42, 0x1E, 0x4C, 0x1E, 0x56, 0x1E, 0x88, + 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, + 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, + 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0, + 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, + 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4E, 0x01, 0x54, 0x00, 0xC0, + 0x00, 0x02, 0x03, 0x00, 0x00, 0xC1, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xA6, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x03, 0x1E, 0xA8, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xAC, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xA4, 0x00, 0x03, 0x03, 0x02, + 0x03, 0x41, 0x00, 0xC2, 0x00, 0x02, 0x03, 0x02, 0x00, 0xC3, 0x00, 0x02, 0x03, 0x03, 0x01, 0x00, + 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB0, 0x00, 0x03, 0x03, 0x06, 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x03, + 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB4, 0x00, 0x03, 0x03, 0x06, 0x03, 0x03, 0x1E, 0xB2, 0x00, 0x03, + 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB6, 0x00, 0x03, 0x03, 0x06, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x03, + 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAE, 0x00, 0x03, 0x03, 0x06, 0x03, 0x41, 0x01, 0x02, 0x00, 0x02, + 0x03, 0x06, 0x01, 0xE0, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x26, 0x00, 0x02, 0x03, 0x07, + 0x01, 0xDE, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xC4, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA2, + 0x00, 0x02, 0x03, 0x09, 0x01, 0xFA, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x03, + 0x03, 0x0A, 0x03, 0x41, 0x00, 0xC5, 0x00, 0x02, 0x03, 0x0A, 0x01, 0xCD, 0x00, 0x02, 0x03, 0x0C, + 0x02, 0x00, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x02, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xAC, 0x00, 0x03, + 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB6, 0x00, 0x03, 0x03, 0x23, 0x03, 0x06, 0x1E, 0xA0, 0x00, 0x02, + 0x03, 0x23, 0x1E, 0x00, 0x00, 0x02, 0x03, 0x25, 0x01, 0x04, 0x00, 0x02, 0x03, 0x28, 0x00, 0xC0, + 0x00, 0x02, 0x03, 0x40, 0x00, 0xC1, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, + 0x00, 0x14, 0x1E, 0x02, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x04, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x06, + 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, + 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x01, + 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, 0x03, 0x01, 0x01, 0x08, 0x00, 0x02, 0x03, 0x02, 0x01, 0x0A, + 0x00, 0x02, 0x03, 0x07, 0x01, 0x0C, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x27, + 0x03, 0x01, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x27, 0x03, 0x41, 0x00, 0xC7, 0x00, 0x02, 0x03, 0x27, + 0x1E, 0x08, 0x00, 0x03, 0x03, 0x41, 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, + 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x0A, 0x00, 0x02, + 0x03, 0x07, 0x01, 0x0E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x0C, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x10, + 0x00, 0x02, 0x03, 0x27, 0x1E, 0x12, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x0E, 0x00, 0x02, 0x03, 0x31, + 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, + 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, + 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, + 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14, + 0x01, 0x1A, 0x01, 0x20, 0x00, 0xC8, 0x00, 0x02, 0x03, 0x00, 0x00, 0xC9, 0x00, 0x02, 0x03, 0x01, + 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, + 0x1E, 0xC4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xC2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, + 0x1E, 0xC6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, + 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xCA, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBC, + 0x00, 0x02, 0x03, 0x03, 0x1E, 0x14, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x16, 0x00, 0x03, + 0x03, 0x04, 0x03, 0x01, 0x1E, 0x14, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x16, 0x00, 0x03, + 0x03, 0x04, 0x03, 0x41, 0x01, 0x12, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x06, + 0x03, 0x27, 0x01, 0x14, 0x00, 0x02, 0x03, 0x06, 0x01, 0x16, 0x00, 0x02, 0x03, 0x07, 0x00, 0xCB, + 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBA, 0x00, 0x02, 0x03, 0x09, 0x01, 0x1A, 0x00, 0x02, 0x03, 0x0C, + 0x02, 0x04, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x06, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xC6, 0x00, 0x03, + 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB8, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x27, + 0x03, 0x06, 0x02, 0x28, 0x00, 0x02, 0x03, 0x27, 0x01, 0x18, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x18, + 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1A, 0x00, 0x02, 0x03, 0x30, 0x00, 0xC8, 0x00, 0x02, 0x03, 0x40, + 0x00, 0xC9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1E, 0x00, 0x02, 0x03, 0x07, + 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, + 0x00, 0x3C, 0x01, 0xF4, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1C, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x20, + 0x00, 0x02, 0x03, 0x04, 0x01, 0x1E, 0x00, 0x02, 0x03, 0x06, 0x01, 0x20, 0x00, 0x02, 0x03, 0x07, + 0x01, 0xE6, 0x00, 0x02, 0x03, 0x0C, 0x01, 0x22, 0x00, 0x02, 0x03, 0x27, 0x01, 0xF4, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, + 0x00, 0x34, 0x01, 0x24, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x22, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x26, + 0x00, 0x02, 0x03, 0x08, 0x02, 0x1E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x24, 0x00, 0x02, 0x03, 0x23, + 0x1E, 0x28, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x2A, 0x00, 0x02, 0x03, 0x2E, 0x00, 0x14, 0x00, 0x2A, + 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, + 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, + 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xCC, 0x00, 0x02, 0x03, 0x00, 0x00, 0xCD, 0x00, 0x02, + 0x03, 0x01, 0x00, 0xCE, 0x00, 0x02, 0x03, 0x02, 0x01, 0x28, 0x00, 0x02, 0x03, 0x03, 0x01, 0x2A, + 0x00, 0x02, 0x03, 0x04, 0x01, 0x2C, 0x00, 0x02, 0x03, 0x06, 0x01, 0x30, 0x00, 0x02, 0x03, 0x07, + 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, + 0x00, 0xCF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xC8, 0x00, 0x02, 0x03, 0x09, 0x01, 0xCF, 0x00, 0x02, + 0x03, 0x0C, 0x02, 0x08, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0A, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCA, + 0x00, 0x02, 0x03, 0x23, 0x01, 0x2E, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x2C, 0x00, 0x02, 0x03, 0x30, + 0x00, 0xCC, 0x00, 0x02, 0x03, 0x40, 0x00, 0xCD, 0x00, 0x02, 0x03, 0x41, 0x1E, 0x2E, 0x00, 0x02, + 0x03, 0x44, 0x00, 0x01, 0x00, 0x04, 0x01, 0x34, 0x00, 0x02, 0x03, 0x02, 0x00, 0x06, 0x00, 0x0E, + 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x01, + 0x01, 0xE8, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, 0x00, 0x02, + 0x03, 0x27, 0x1E, 0x34, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, + 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, + 0x00, 0x48, 0x01, 0x39, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x38, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, + 0x01, 0x3D, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x38, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x36, + 0x00, 0x02, 0x03, 0x23, 0x01, 0x3B, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x3C, 0x00, 0x02, 0x03, 0x2D, + 0x1E, 0x3A, 0x00, 0x02, 0x03, 0x31, 0x01, 0x39, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, + 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x40, 0x00, 0x02, + 0x03, 0x07, 0x1E, 0x42, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, + 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, + 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x01, 0xF8, 0x00, 0x02, 0x03, 0x00, 0x01, 0x43, 0x00, 0x02, + 0x03, 0x01, 0x00, 0xD1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x44, 0x00, 0x02, 0x03, 0x07, 0x01, 0x47, + 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x46, 0x00, 0x02, 0x03, 0x23, 0x01, 0x45, 0x00, 0x02, 0x03, 0x27, + 0x1E, 0x4A, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x48, 0x00, 0x02, 0x03, 0x31, 0x01, 0xF8, 0x00, 0x02, + 0x03, 0x40, 0x01, 0x43, 0x00, 0x02, 0x03, 0x41, 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, + 0x00, 0x80, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, + 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, + 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, + 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, + 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, + 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, + 0x01, 0xE0, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x00, + 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD2, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xD0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD6, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xD4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD8, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xD2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD0, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xD4, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4C, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x01, 0x02, 0x2C, 0x00, 0x03, 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4E, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x08, 0x1E, 0xE0, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x41, 0x00, 0xD5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x50, 0x00, 0x03, 0x03, 0x04, + 0x03, 0x00, 0x1E, 0x52, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0xEC, 0x00, 0x03, 0x03, 0x04, + 0x03, 0x28, 0x1E, 0x50, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x52, 0x00, 0x03, 0x03, 0x04, + 0x03, 0x41, 0x01, 0x4C, 0x00, 0x02, 0x03, 0x04, 0x01, 0x4E, 0x00, 0x02, 0x03, 0x06, 0x02, 0x30, + 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x2E, 0x00, 0x02, 0x03, 0x07, 0x02, 0x2A, 0x00, 0x03, + 0x03, 0x08, 0x03, 0x04, 0x00, 0xD6, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x09, + 0x03, 0x1B, 0x1E, 0xCE, 0x00, 0x02, 0x03, 0x09, 0x01, 0x50, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD1, + 0x00, 0x02, 0x03, 0x0C, 0x02, 0x0C, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0E, 0x00, 0x02, 0x03, 0x11, + 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, + 0x1E, 0xE0, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, + 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, + 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xA0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD8, + 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCC, + 0x00, 0x02, 0x03, 0x23, 0x01, 0xEC, 0x00, 0x03, 0x03, 0x28, 0x03, 0x04, 0x01, 0xEA, 0x00, 0x02, + 0x03, 0x28, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x40, + 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, + 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x54, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x56, 0x00, 0x02, + 0x03, 0x07, 0x1E, 0x54, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, + 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, + 0x01, 0x54, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x58, + 0x00, 0x02, 0x03, 0x07, 0x01, 0x58, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x10, 0x00, 0x02, 0x03, 0x0F, + 0x02, 0x12, 0x00, 0x02, 0x03, 0x11, 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5A, + 0x00, 0x02, 0x03, 0x23, 0x01, 0x56, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x5E, 0x00, 0x02, 0x03, 0x31, + 0x01, 0x54, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, + 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, + 0x00, 0x6E, 0x1E, 0x64, 0x00, 0x03, 0x03, 0x01, 0x03, 0x07, 0x01, 0x5A, 0x00, 0x02, 0x03, 0x01, + 0x01, 0x5C, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x68, 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x60, + 0x00, 0x02, 0x03, 0x07, 0x1E, 0x66, 0x00, 0x03, 0x03, 0x0C, 0x03, 0x07, 0x01, 0x60, 0x00, 0x02, + 0x03, 0x0C, 0x1E, 0x68, 0x00, 0x03, 0x03, 0x23, 0x03, 0x07, 0x1E, 0x62, 0x00, 0x02, 0x03, 0x23, + 0x02, 0x18, 0x00, 0x02, 0x03, 0x26, 0x01, 0x5E, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x64, 0x00, 0x03, + 0x03, 0x41, 0x03, 0x07, 0x01, 0x5A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, + 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0x6A, 0x00, 0x02, 0x03, 0x07, + 0x01, 0x64, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x6C, 0x00, 0x02, 0x03, 0x23, 0x02, 0x1A, 0x00, 0x02, + 0x03, 0x26, 0x01, 0x62, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x70, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6E, + 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, + 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, + 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE, + 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0C, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, + 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E, + 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92, + 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, + 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xDA, 0x00, 0x02, 0x03, 0x01, 0x00, 0xDB, 0x00, 0x02, + 0x03, 0x02, 0x1E, 0x78, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x03, + 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x01, 0x68, 0x00, 0x02, 0x03, 0x03, + 0x1E, 0x7A, 0x00, 0x03, 0x03, 0x04, 0x03, 0x08, 0x01, 0x6A, 0x00, 0x02, 0x03, 0x04, 0x01, 0x6C, + 0x00, 0x02, 0x03, 0x06, 0x01, 0xDB, 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x01, 0xD7, 0x00, 0x03, + 0x03, 0x08, 0x03, 0x01, 0x01, 0xD5, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x01, 0xD9, 0x00, 0x03, + 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDB, 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x01, 0xD7, 0x00, 0x03, + 0x03, 0x08, 0x03, 0x41, 0x00, 0xDC, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xEC, 0x00, 0x03, 0x03, 0x09, + 0x03, 0x1B, 0x1E, 0xE6, 0x00, 0x02, 0x03, 0x09, 0x01, 0x6E, 0x00, 0x02, 0x03, 0x0A, 0x01, 0x70, + 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD3, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x14, 0x00, 0x02, 0x03, 0x0F, + 0x02, 0x16, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE8, + 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xEC, + 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xF0, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEA, + 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xAF, + 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF0, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xE4, 0x00, 0x02, + 0x03, 0x23, 0x1E, 0x72, 0x00, 0x02, 0x03, 0x24, 0x01, 0x72, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x76, + 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x74, 0x00, 0x02, 0x03, 0x30, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x40, + 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, + 0x00, 0xDA, 0x00, 0x02, 0x03, 0x41, 0x01, 0xD7, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0C, 0x1E, 0x7C, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7E, 0x00, 0x02, 0x03, 0x23, 0x00, 0x08, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, + 0x1E, 0x80, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x82, 0x00, 0x02, 0x03, 0x01, 0x01, 0x74, 0x00, 0x02, + 0x03, 0x02, 0x1E, 0x86, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x84, 0x00, 0x02, 0x03, 0x08, 0x1E, 0x88, + 0x00, 0x02, 0x03, 0x23, 0x1E, 0x80, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x82, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x8A, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8C, 0x00, 0x02, + 0x03, 0x08, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, + 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x00, + 0x00, 0xDD, 0x00, 0x02, 0x03, 0x01, 0x01, 0x76, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF8, 0x00, 0x02, + 0x03, 0x03, 0x02, 0x32, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x8E, 0x00, 0x02, 0x03, 0x07, 0x01, 0x78, + 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF6, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF4, 0x00, 0x02, 0x03, 0x23, + 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x40, 0x00, 0xDD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x79, 0x00, 0x02, + 0x03, 0x01, 0x1E, 0x90, 0x00, 0x02, 0x03, 0x02, 0x01, 0x7B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x7D, + 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x92, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x94, 0x00, 0x02, 0x03, 0x31, + 0x01, 0x79, 0x00, 0x02, 0x03, 0x41, 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, + 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, + 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, + 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x14, + 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x48, + 0x01, 0x4E, 0x01, 0x54, 0x00, 0xE0, 0x00, 0x02, 0x03, 0x00, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x01, + 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, + 0x1E, 0xAB, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xA9, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, + 0x1E, 0xAD, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, + 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xE2, 0x00, 0x02, 0x03, 0x02, 0x00, 0xE3, + 0x00, 0x02, 0x03, 0x03, 0x01, 0x01, 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB1, 0x00, 0x03, 0x03, 0x06, + 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x03, 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x03, 0x03, 0x06, + 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x03, 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x06, + 0x03, 0x23, 0x1E, 0xB1, 0x00, 0x03, 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x03, 0x03, 0x06, + 0x03, 0x41, 0x01, 0x03, 0x00, 0x02, 0x03, 0x06, 0x01, 0xE1, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, + 0x02, 0x27, 0x00, 0x02, 0x03, 0x07, 0x01, 0xDF, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xE4, + 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA3, 0x00, 0x02, 0x03, 0x09, 0x01, 0xFB, 0x00, 0x03, 0x03, 0x0A, + 0x03, 0x01, 0x01, 0xFB, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x41, 0x00, 0xE5, 0x00, 0x02, 0x03, 0x0A, + 0x01, 0xCE, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x01, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x03, 0x00, 0x02, + 0x03, 0x11, 0x1E, 0xAD, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x23, + 0x03, 0x06, 0x1E, 0xA1, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x01, 0x00, 0x02, 0x03, 0x25, 0x01, 0x05, + 0x00, 0x02, 0x03, 0x28, 0x00, 0xE0, 0x00, 0x02, 0x03, 0x40, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x03, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x05, + 0x00, 0x02, 0x03, 0x23, 0x1E, 0x07, 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, + 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, + 0x1E, 0x09, 0x00, 0x03, 0x03, 0x01, 0x03, 0x27, 0x01, 0x07, 0x00, 0x02, 0x03, 0x01, 0x01, 0x09, + 0x00, 0x02, 0x03, 0x02, 0x01, 0x0B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0D, 0x00, 0x02, 0x03, 0x0C, + 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, 0x03, 0x01, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, 0x03, 0x41, + 0x00, 0xE7, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x41, 0x03, 0x27, 0x01, 0x07, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, + 0x00, 0x2C, 0x1E, 0x0B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0F, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x0D, + 0x00, 0x02, 0x03, 0x23, 0x1E, 0x11, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x13, 0x00, 0x02, 0x03, 0x2D, + 0x1E, 0x0F, 0x00, 0x02, 0x03, 0x31, 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, + 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, + 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, + 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x02, + 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x00, 0xE8, 0x00, 0x02, 0x03, 0x00, + 0x00, 0xE9, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xBF, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xC5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xC3, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xC7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xC1, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xBF, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xEA, + 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBD, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, + 0x03, 0x00, 0x1E, 0x17, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, + 0x03, 0x40, 0x1E, 0x17, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x13, 0x00, 0x02, 0x03, 0x04, + 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x06, 0x03, 0x27, 0x01, 0x15, 0x00, 0x02, 0x03, 0x06, 0x01, 0x17, + 0x00, 0x02, 0x03, 0x07, 0x00, 0xEB, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBB, 0x00, 0x02, 0x03, 0x09, + 0x01, 0x1B, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x05, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x07, 0x00, 0x02, + 0x03, 0x11, 0x1E, 0xC7, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB9, 0x00, 0x02, 0x03, 0x23, + 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x27, 0x03, 0x06, 0x02, 0x29, 0x00, 0x02, 0x03, 0x27, 0x01, 0x19, + 0x00, 0x02, 0x03, 0x28, 0x1E, 0x19, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1B, 0x00, 0x02, 0x03, 0x30, + 0x00, 0xE8, 0x00, 0x02, 0x03, 0x40, 0x00, 0xE9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, + 0x1E, 0x1F, 0x00, 0x02, 0x03, 0x07, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, + 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x01, 0xF5, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1D, + 0x00, 0x02, 0x03, 0x02, 0x1E, 0x21, 0x00, 0x02, 0x03, 0x04, 0x01, 0x1F, 0x00, 0x02, 0x03, 0x06, + 0x01, 0x21, 0x00, 0x02, 0x03, 0x07, 0x01, 0xE7, 0x00, 0x02, 0x03, 0x0C, 0x01, 0x23, 0x00, 0x02, + 0x03, 0x27, 0x01, 0xF5, 0x00, 0x02, 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x01, 0x25, 0x00, 0x02, 0x03, 0x02, + 0x1E, 0x23, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x27, 0x00, 0x02, 0x03, 0x08, 0x02, 0x1F, 0x00, 0x02, + 0x03, 0x0C, 0x1E, 0x25, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x29, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x2B, + 0x00, 0x02, 0x03, 0x2E, 0x1E, 0x96, 0x00, 0x02, 0x03, 0x31, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, + 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, + 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, + 0x00, 0x98, 0x00, 0xEC, 0x00, 0x02, 0x03, 0x00, 0x00, 0xED, 0x00, 0x02, 0x03, 0x01, 0x00, 0xEE, + 0x00, 0x02, 0x03, 0x02, 0x01, 0x29, 0x00, 0x02, 0x03, 0x03, 0x01, 0x2B, 0x00, 0x02, 0x03, 0x04, + 0x01, 0x2D, 0x00, 0x02, 0x03, 0x06, 0x1E, 0x2F, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1E, 0x2F, + 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xEF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xC9, 0x00, 0x02, + 0x03, 0x09, 0x01, 0xD0, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x09, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0B, + 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCB, 0x00, 0x02, 0x03, 0x23, 0x01, 0x2F, 0x00, 0x02, 0x03, 0x28, + 0x1E, 0x2D, 0x00, 0x02, 0x03, 0x30, 0x00, 0xEC, 0x00, 0x02, 0x03, 0x40, 0x00, 0xED, 0x00, 0x02, + 0x03, 0x41, 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0x35, + 0x00, 0x02, 0x03, 0x02, 0x01, 0xF0, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, + 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x31, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE9, + 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x33, 0x00, 0x02, 0x03, 0x23, 0x01, 0x37, 0x00, 0x02, 0x03, 0x27, + 0x1E, 0x35, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x31, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, 0x00, 0x14, + 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, + 0x01, 0x3A, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x39, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x01, 0x3E, + 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x39, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x37, 0x00, 0x02, + 0x03, 0x23, 0x01, 0x3C, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x3D, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x3B, + 0x00, 0x02, 0x03, 0x31, 0x01, 0x3A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x3F, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x41, 0x00, 0x02, 0x03, 0x07, + 0x1E, 0x43, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x3F, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, + 0x00, 0x4E, 0x00, 0x54, 0x01, 0xF9, 0x00, 0x02, 0x03, 0x00, 0x01, 0x44, 0x00, 0x02, 0x03, 0x01, + 0x00, 0xF1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x45, 0x00, 0x02, 0x03, 0x07, 0x01, 0x48, 0x00, 0x02, + 0x03, 0x0C, 0x1E, 0x47, 0x00, 0x02, 0x03, 0x23, 0x01, 0x46, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x4B, + 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x49, 0x00, 0x02, 0x03, 0x31, 0x01, 0xF9, 0x00, 0x02, 0x03, 0x40, + 0x01, 0x44, 0x00, 0x02, 0x03, 0x41, 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, + 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, + 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xFA, + 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x34, + 0x01, 0x3C, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x68, + 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA6, + 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xE0, + 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, + 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xF3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD3, 0x00, 0x03, + 0x03, 0x02, 0x03, 0x00, 0x1E, 0xD1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x03, + 0x03, 0x02, 0x03, 0x03, 0x1E, 0xD5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD9, 0x00, 0x03, + 0x03, 0x02, 0x03, 0x23, 0x1E, 0xD3, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x03, + 0x03, 0x02, 0x03, 0x41, 0x00, 0xF4, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, + 0x03, 0x01, 0x02, 0x2D, 0x00, 0x03, 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x03, 0x03, 0x03, + 0x03, 0x08, 0x1E, 0xE1, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, + 0x03, 0x41, 0x00, 0xF5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, + 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0xED, 0x00, 0x03, 0x03, 0x04, 0x03, 0x28, + 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, + 0x01, 0x4D, 0x00, 0x02, 0x03, 0x04, 0x01, 0x4F, 0x00, 0x02, 0x03, 0x06, 0x02, 0x31, 0x00, 0x03, + 0x03, 0x07, 0x03, 0x04, 0x02, 0x2F, 0x00, 0x02, 0x03, 0x07, 0x02, 0x2B, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x04, 0x00, 0xF6, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, + 0x1E, 0xCF, 0x00, 0x02, 0x03, 0x09, 0x01, 0x51, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD2, 0x00, 0x02, + 0x03, 0x0C, 0x02, 0x0D, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0F, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xDD, + 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xE1, + 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xE3, + 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xDB, + 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xA1, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD9, 0x00, 0x03, + 0x03, 0x23, 0x03, 0x02, 0x1E, 0xE3, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCD, 0x00, 0x02, + 0x03, 0x23, 0x01, 0xED, 0x00, 0x03, 0x03, 0x28, 0x03, 0x04, 0x01, 0xEB, 0x00, 0x02, 0x03, 0x28, + 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDB, + 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xF3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, + 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x55, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x57, 0x00, 0x02, 0x03, 0x07, + 0x1E, 0x55, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, + 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x01, 0x55, + 0x00, 0x02, 0x03, 0x01, 0x1E, 0x5D, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x59, 0x00, 0x02, + 0x03, 0x07, 0x01, 0x59, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x11, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x13, + 0x00, 0x02, 0x03, 0x11, 0x1E, 0x5D, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5B, 0x00, 0x02, + 0x03, 0x23, 0x01, 0x57, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x5F, 0x00, 0x02, 0x03, 0x31, 0x01, 0x55, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, + 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6E, + 0x1E, 0x65, 0x00, 0x03, 0x03, 0x01, 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, 0x03, 0x01, 0x01, 0x5D, + 0x00, 0x02, 0x03, 0x02, 0x1E, 0x69, 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x61, 0x00, 0x02, + 0x03, 0x07, 0x1E, 0x67, 0x00, 0x03, 0x03, 0x0C, 0x03, 0x07, 0x01, 0x61, 0x00, 0x02, 0x03, 0x0C, + 0x1E, 0x69, 0x00, 0x03, 0x03, 0x23, 0x03, 0x07, 0x1E, 0x63, 0x00, 0x02, 0x03, 0x23, 0x02, 0x19, + 0x00, 0x02, 0x03, 0x26, 0x01, 0x5F, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x65, 0x00, 0x03, 0x03, 0x41, + 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x1E, 0x6B, 0x00, 0x02, 0x03, 0x07, + 0x1E, 0x97, 0x00, 0x02, 0x03, 0x08, 0x01, 0x65, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x6D, 0x00, 0x02, + 0x03, 0x23, 0x02, 0x1B, 0x00, 0x02, 0x03, 0x26, 0x01, 0x63, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x71, + 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6F, 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D, 0x00, 0x5C, 0x00, 0x64, + 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9C, + 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8, + 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0C, + 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, + 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7E, + 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xF9, + 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xFA, 0x00, 0x02, + 0x03, 0x01, 0x00, 0xFB, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, + 0x1E, 0xEF, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, + 0x01, 0x69, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7B, 0x00, 0x03, 0x03, 0x04, 0x03, 0x08, 0x01, 0x6B, + 0x00, 0x02, 0x03, 0x04, 0x01, 0x6D, 0x00, 0x02, 0x03, 0x06, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x00, 0x01, 0xD8, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x01, 0xD6, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x04, 0x01, 0xDA, 0x00, 0x03, 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, + 0x03, 0x40, 0x01, 0xD8, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xFC, 0x00, 0x02, 0x03, 0x08, + 0x1E, 0xED, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xE7, 0x00, 0x02, 0x03, 0x09, 0x01, 0x6F, + 0x00, 0x02, 0x03, 0x0A, 0x01, 0x71, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD4, 0x00, 0x02, 0x03, 0x0C, + 0x02, 0x15, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x17, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xEB, 0x00, 0x03, + 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x03, + 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xED, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xF1, 0x00, 0x03, + 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x03, + 0x03, 0x1B, 0x03, 0x41, 0x01, 0xB0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF1, 0x00, 0x03, 0x03, 0x23, + 0x03, 0x1B, 0x1E, 0xE5, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x73, 0x00, 0x02, 0x03, 0x24, 0x01, 0x73, + 0x00, 0x02, 0x03, 0x28, 0x1E, 0x77, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x75, 0x00, 0x02, 0x03, 0x30, + 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xF9, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, + 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x01, 0xD8, 0x00, 0x02, + 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x7D, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7F, + 0x00, 0x02, 0x03, 0x23, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, + 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x1E, 0x81, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x83, + 0x00, 0x02, 0x03, 0x01, 0x01, 0x75, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x87, 0x00, 0x02, 0x03, 0x07, + 0x1E, 0x85, 0x00, 0x02, 0x03, 0x08, 0x1E, 0x98, 0x00, 0x02, 0x03, 0x0A, 0x1E, 0x89, 0x00, 0x02, + 0x03, 0x23, 0x1E, 0x81, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x83, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x8B, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8D, 0x00, 0x02, 0x03, 0x08, + 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, + 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x00, + 0x00, 0xFD, 0x00, 0x02, 0x03, 0x01, 0x01, 0x77, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF9, 0x00, 0x02, + 0x03, 0x03, 0x02, 0x33, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x8F, 0x00, 0x02, 0x03, 0x07, 0x00, 0xFF, + 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF7, 0x00, 0x02, 0x03, 0x09, 0x1E, 0x99, 0x00, 0x02, 0x03, 0x0A, + 0x1E, 0xF5, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x40, 0x00, 0xFD, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, + 0x00, 0x34, 0x01, 0x7A, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x91, 0x00, 0x02, 0x03, 0x02, 0x01, 0x7C, + 0x00, 0x02, 0x03, 0x07, 0x01, 0x7E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x93, 0x00, 0x02, 0x03, 0x23, + 0x1E, 0x95, 0x00, 0x02, 0x03, 0x31, 0x01, 0x7A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA6, 0x00, 0x02, + 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xA8, + 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAC, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x02, 0x03, 0x40, + 0x1E, 0xA4, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x01, 0xDE, 0x00, 0x02, 0x03, 0x04, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x01, 0xFC, 0x00, 0x02, 0x03, 0x01, + 0x01, 0xE2, 0x00, 0x02, 0x03, 0x04, 0x01, 0xFC, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0C, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, + 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xC0, + 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBE, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC4, 0x00, 0x02, 0x03, 0x03, + 0x1E, 0xC2, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xC6, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x02, + 0x03, 0x40, 0x1E, 0xBE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x2E, + 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2E, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDC, + 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x07, + 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xD2, + 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD0, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD6, 0x00, 0x02, 0x03, 0x03, + 0x1E, 0xD4, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xD8, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD2, 0x00, 0x02, + 0x03, 0x40, 0x1E, 0xD0, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, + 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4C, 0x00, 0x02, 0x03, 0x01, 0x02, 0x2C, 0x00, 0x02, 0x03, 0x04, + 0x1E, 0x4E, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x02, 0x2A, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, + 0x00, 0x0C, 0x01, 0xFE, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, + 0x00, 0x04, 0x1E, 0xEA, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE8, 0x00, 0x02, + 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, + 0x01, 0xDB, 0x00, 0x02, 0x03, 0x00, 0x01, 0xD7, 0x00, 0x02, 0x03, 0x01, 0x01, 0xD5, 0x00, 0x02, + 0x03, 0x04, 0x01, 0xD9, 0x00, 0x02, 0x03, 0x0C, 0x01, 0xDB, 0x00, 0x02, 0x03, 0x40, 0x01, 0xD7, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, + 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA7, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x01, + 0x1E, 0xAB, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xA9, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAD, 0x00, 0x02, + 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, + 0x00, 0x04, 0x01, 0xDF, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFB, + 0x00, 0x02, 0x03, 0x01, 0x01, 0xFB, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, + 0x00, 0x14, 0x01, 0xFD, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE3, 0x00, 0x02, 0x03, 0x04, 0x01, 0xFD, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x01, + 0x1E, 0x09, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, + 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xC1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBF, 0x00, 0x02, + 0x03, 0x01, 0x1E, 0xC5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xC3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xC7, + 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC1, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xBF, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2F, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, + 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, + 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xD3, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD1, 0x00, 0x02, + 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xD5, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xD9, + 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD3, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4D, 0x00, 0x02, + 0x03, 0x01, 0x02, 0x2D, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xE1, + 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4D, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x02, 0x2B, + 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFF, 0x00, 0x02, 0x03, 0x01, + 0x01, 0xFF, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x1B, + 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE9, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, + 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x01, 0xDC, 0x00, 0x02, 0x03, 0x00, 0x01, 0xD8, + 0x00, 0x02, 0x03, 0x01, 0x01, 0xD6, 0x00, 0x02, 0x03, 0x04, 0x01, 0xDA, 0x00, 0x02, 0x03, 0x0C, + 0x01, 0xDC, 0x00, 0x02, 0x03, 0x40, 0x01, 0xD8, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, + 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xB0, 0x00, 0x02, + 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xB4, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xB2, + 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB6, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x02, 0x03, 0x40, + 0x1E, 0xAE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, + 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xB1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x02, + 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB7, + 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB1, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x01, 0x00, 0x04, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x09, + 0x00, 0x02, 0x03, 0x27, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x14, + 0x00, 0x02, 0x03, 0x00, 0x1E, 0x16, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x14, 0x00, 0x02, 0x03, 0x40, + 0x1E, 0x16, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x1E, 0x15, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x17, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x02, + 0x03, 0x40, 0x1E, 0x17, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, + 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1D, 0x00, 0x02, 0x03, 0x27, 0x00, 0x05, 0x00, 0x0C, + 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x52, + 0x00, 0x02, 0x03, 0x01, 0x01, 0xEC, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x40, + 0x1E, 0x52, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, + 0x00, 0x24, 0x1E, 0x51, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x01, 0x01, 0xED, + 0x00, 0x02, 0x03, 0x28, 0x1E, 0x51, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x01, 0x00, 0x04, 0x1E, 0x64, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x65, + 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x66, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, + 0x00, 0x04, 0x1E, 0x67, 0x00, 0x02, 0x03, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, + 0x1E, 0x78, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x79, 0x00, 0x02, 0x03, 0x01, + 0x1E, 0xEF, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x79, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, + 0x1E, 0x7A, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x7B, 0x00, 0x02, 0x03, 0x08, + 0x00, 0x01, 0x00, 0x04, 0x1E, 0x9B, 0x00, 0x02, 0x03, 0x07, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, + 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x00, + 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x02, + 0x03, 0x09, 0x1E, 0xE2, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDA, + 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, + 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x01, + 0x1E, 0xE1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xE3, 0x00, 0x02, + 0x03, 0x23, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, + 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xEA, + 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x03, + 0x1E, 0xEC, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xEA, 0x00, 0x02, + 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, + 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, + 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x09, + 0x1E, 0xF1, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x01, 0xEE, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x01, 0x00, 0x04, + 0x01, 0xEC, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xED, 0x00, 0x02, 0x03, 0x04, + 0x00, 0x01, 0x00, 0x04, 0x01, 0xE0, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xE1, + 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, + 0x00, 0x04, 0x1E, 0x1D, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x02, 0x30, 0x00, 0x02, + 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x02, 0x31, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, + 0x01, 0xEF, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x38, 0x00, 0x02, 0x03, 0x04, + 0x00, 0x01, 0x00, 0x04, 0x1E, 0x39, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x5C, + 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x5D, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, + 0x00, 0x04, 0x1E, 0x68, 0x00, 0x02, 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x69, 0x00, 0x02, + 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x68, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, + 0x1E, 0x69, 0x00, 0x02, 0x03, 0x07, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAC, 0x00, 0x02, + 0x03, 0x02, 0x1E, 0xB6, 0x00, 0x02, 0x03, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAD, + 0x00, 0x02, 0x03, 0x02, 0x1E, 0xB7, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xC6, + 0x00, 0x02, 0x03, 0x02, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xC7, 0x00, 0x02, 0x03, 0x02, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xD8, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE2, 0x00, 0x02, 0x03, 0x1B, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xD9, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE3, 0x00, 0x02, + 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDE, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, + 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x1B, + 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF1, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEC, + 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, + 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, + 0x03, 0x01, 0x01, 0xE8, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, + 0x00, 0x02, 0x03, 0x27, 0x1E, 0x34, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, + 0x03, 0x41, 0x00, 0x01, 0x00, 0x89, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, + 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x4D, + 0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, + 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5A, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, + 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6A, 0x00, 0x6B, 0x00, 0x6C, + 0x00, 0x6D, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, + 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7A, 0x00, 0xC2, 0x00, 0xC4, 0x00, 0xC5, + 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xCA, 0x00, 0xCF, 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, + 0x00, 0xD6, 0x00, 0xD8, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xE4, 0x00, 0xE5, + 0x00, 0xE6, 0x00, 0xE7, 0x00, 0xEA, 0x00, 0xEF, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, + 0x00, 0xF6, 0x00, 0xF8, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFC, 0x01, 0x02, 0x01, 0x03, 0x01, 0x06, + 0x01, 0x07, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x5A, + 0x01, 0x5B, 0x01, 0x60, 0x01, 0x61, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x7F, + 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, 0x01, 0xB0, 0x01, 0xB7, 0x01, 0xEA, 0x01, 0xEB, 0x02, 0x26, + 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2E, 0x02, 0x2F, 0x02, 0x92, 0x1E, 0x36, 0x1E, 0x37, + 0x1E, 0x5A, 0x1E, 0x5B, 0x1E, 0x60, 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, 0x1E, 0xA0, 0x1E, 0xA1, + 0x1E, 0xB8, 0x1E, 0xB9, 0x1E, 0xCC, 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xE4, 0x1E, 0xE5, + 0x1E, 0xE6, 0x1E, 0xE7, 0x21, 0x2A, 0x21, 0x2B, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x14, + 0x13, 0x88, 0x1A, 0x9E, 0x1E, 0x3C, 0x21, 0xAE, 0x22, 0x6C, 0x22, 0xFA, 0x00, 0x01, 0x0F, 0x8E, + 0x01, 0xF1, 0x03, 0xE8, 0x03, 0xEE, 0x03, 0xF4, 0x03, 0xFA, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, + 0x04, 0x12, 0x04, 0x18, 0x04, 0x1E, 0x04, 0x24, 0x04, 0x2A, 0x04, 0x30, 0x04, 0x36, 0x04, 0x3C, + 0x04, 0x42, 0x04, 0x48, 0x04, 0x4E, 0x04, 0x54, 0x04, 0x5A, 0x04, 0x60, 0x04, 0x66, 0x04, 0x6C, + 0x04, 0x72, 0x04, 0x78, 0x04, 0x7E, 0x04, 0x84, 0x04, 0x8A, 0x04, 0x90, 0x04, 0x96, 0x04, 0x9C, + 0x04, 0xA2, 0x04, 0xA8, 0x04, 0xAE, 0x04, 0xB4, 0x04, 0xBA, 0x04, 0xC0, 0x04, 0xC6, 0x04, 0xCC, + 0x04, 0xD2, 0x04, 0xD8, 0x04, 0xDE, 0x04, 0xE4, 0x04, 0xEA, 0x04, 0xF0, 0x04, 0xF6, 0x04, 0xFC, + 0x05, 0x02, 0x05, 0x08, 0x05, 0x0E, 0x05, 0x14, 0x05, 0x1A, 0x05, 0x20, 0x05, 0x26, 0x05, 0x2C, + 0x05, 0x32, 0x05, 0x38, 0x05, 0x3E, 0x05, 0x44, 0x05, 0x4A, 0x05, 0x50, 0x05, 0x56, 0x05, 0x5C, + 0x05, 0x62, 0x05, 0x68, 0x05, 0x6E, 0x05, 0x74, 0x05, 0x7A, 0x05, 0x80, 0x05, 0x86, 0x05, 0x8C, + 0x05, 0x92, 0x05, 0x98, 0x05, 0x9E, 0x05, 0xA4, 0x05, 0xAA, 0x05, 0xB0, 0x05, 0xB6, 0x05, 0xBC, + 0x05, 0xC2, 0x05, 0xC8, 0x05, 0xCE, 0x05, 0xD4, 0x05, 0xDA, 0x05, 0xE0, 0x05, 0xE6, 0x05, 0xEC, + 0x05, 0xF2, 0x05, 0xF8, 0x05, 0xFE, 0x06, 0x04, 0x06, 0x0A, 0x06, 0x10, 0x06, 0x16, 0x06, 0x1C, + 0x06, 0x22, 0x06, 0x28, 0x06, 0x2E, 0x06, 0x34, 0x06, 0x3A, 0x06, 0x40, 0x06, 0x46, 0x06, 0x4C, + 0x06, 0x52, 0x06, 0x58, 0x06, 0x5E, 0x06, 0x64, 0x06, 0x6A, 0x06, 0x70, 0x06, 0x76, 0x06, 0x7C, + 0x06, 0x82, 0x06, 0x88, 0x06, 0x8E, 0x06, 0x94, 0x06, 0x9A, 0x06, 0xA0, 0x06, 0xA6, 0x06, 0xAC, + 0x06, 0xB2, 0x06, 0xB8, 0x06, 0xBE, 0x06, 0xC4, 0x06, 0xCA, 0x06, 0xD0, 0x06, 0xD6, 0x06, 0xDC, + 0x06, 0xE2, 0x06, 0xE8, 0x06, 0xEE, 0x06, 0xF4, 0x06, 0xFA, 0x07, 0x00, 0x07, 0x06, 0x07, 0x0C, + 0x07, 0x12, 0x07, 0x18, 0x07, 0x1E, 0x07, 0x24, 0x07, 0x2A, 0x07, 0x30, 0x07, 0x36, 0x07, 0x3C, + 0x07, 0x42, 0x07, 0x48, 0x07, 0x4E, 0x07, 0x54, 0x07, 0x5A, 0x07, 0x60, 0x07, 0x66, 0x07, 0x6C, + 0x07, 0x72, 0x07, 0x78, 0x07, 0x7E, 0x07, 0x84, 0x07, 0x8A, 0x07, 0x90, 0x07, 0x96, 0x07, 0x9C, + 0x07, 0xA2, 0x07, 0xA8, 0x07, 0xAE, 0x07, 0xB4, 0x07, 0xBA, 0x07, 0xC0, 0x07, 0xC6, 0x07, 0xCC, + 0x07, 0xD2, 0x07, 0xD8, 0x07, 0xDE, 0x07, 0xE4, 0x07, 0xEA, 0x07, 0xF0, 0x07, 0xF6, 0x07, 0xFC, + 0x08, 0x02, 0x08, 0x08, 0x08, 0x0E, 0x08, 0x14, 0x08, 0x1A, 0x08, 0x20, 0x08, 0x26, 0x08, 0x2C, + 0x08, 0x32, 0x08, 0x38, 0x08, 0x3E, 0x08, 0x44, 0x08, 0x4A, 0x08, 0x50, 0x08, 0x56, 0x08, 0x5C, + 0x08, 0x62, 0x08, 0x68, 0x08, 0x6E, 0x08, 0x74, 0x08, 0x7A, 0x08, 0x80, 0x08, 0x86, 0x08, 0x8C, + 0x08, 0x92, 0x08, 0x98, 0x08, 0x9E, 0x08, 0xA4, 0x08, 0xAA, 0x08, 0xB0, 0x08, 0xB6, 0x08, 0xBC, + 0x08, 0xC2, 0x08, 0xC8, 0x08, 0xCE, 0x08, 0xD4, 0x08, 0xDA, 0x08, 0xE0, 0x08, 0xE6, 0x08, 0xEC, + 0x08, 0xF2, 0x08, 0xF8, 0x08, 0xFE, 0x09, 0x04, 0x09, 0x0A, 0x09, 0x10, 0x09, 0x16, 0x09, 0x1C, + 0x09, 0x22, 0x09, 0x28, 0x09, 0x2E, 0x09, 0x34, 0x09, 0x3A, 0x09, 0x40, 0x09, 0x46, 0x09, 0x4C, + 0x09, 0x52, 0x09, 0x58, 0x09, 0x5E, 0x09, 0x64, 0x09, 0x6A, 0x09, 0x70, 0x09, 0x76, 0x09, 0x7C, + 0x09, 0x82, 0x09, 0x88, 0x09, 0x8E, 0x09, 0x94, 0x09, 0x9A, 0x09, 0xA0, 0x09, 0xA6, 0x09, 0xAC, + 0x09, 0xB2, 0x09, 0xB8, 0x09, 0xBE, 0x09, 0xC4, 0x09, 0xCA, 0x09, 0xD0, 0x09, 0xD6, 0x09, 0xDC, + 0x09, 0xE2, 0x09, 0xE8, 0x09, 0xEE, 0x09, 0xF4, 0x09, 0xFA, 0x0A, 0x00, 0x0A, 0x06, 0x0A, 0x0C, + 0x0A, 0x12, 0x0A, 0x18, 0x0A, 0x1E, 0x0A, 0x24, 0x0A, 0x2A, 0x0A, 0x30, 0x0A, 0x36, 0x0A, 0x3C, + 0x0A, 0x42, 0x0A, 0x48, 0x0A, 0x4E, 0x0A, 0x54, 0x0A, 0x5A, 0x0A, 0x60, 0x0A, 0x66, 0x0A, 0x6C, + 0x0A, 0x72, 0x0A, 0x78, 0x0A, 0x7E, 0x0A, 0x84, 0x0A, 0x8A, 0x0A, 0x90, 0x0A, 0x96, 0x0A, 0x9C, + 0x0A, 0xA2, 0x0A, 0xA8, 0x0A, 0xAE, 0x0A, 0xB4, 0x0A, 0xBA, 0x0A, 0xC0, 0x0A, 0xC6, 0x0A, 0xCC, + 0x0A, 0xD2, 0x0A, 0xD8, 0x0A, 0xDE, 0x0A, 0xE4, 0x0A, 0xEA, 0x0A, 0xF0, 0x0A, 0xF6, 0x0A, 0xFC, + 0x0B, 0x02, 0x0B, 0x08, 0x0B, 0x0E, 0x0B, 0x14, 0x0B, 0x1A, 0x0B, 0x20, 0x0B, 0x26, 0x0B, 0x2C, + 0x0B, 0x32, 0x0B, 0x38, 0x0B, 0x3E, 0x0B, 0x44, 0x0B, 0x4A, 0x0B, 0x50, 0x0B, 0x56, 0x0B, 0x5C, + 0x0B, 0x62, 0x0B, 0x68, 0x0B, 0x6E, 0x0B, 0x74, 0x0B, 0x7A, 0x0B, 0x80, 0x0B, 0x86, 0x0B, 0x8C, + 0x0B, 0x92, 0x0B, 0x98, 0x0B, 0x9E, 0x0B, 0xA4, 0x0B, 0xAA, 0x0B, 0xB0, 0x0B, 0xB6, 0x0B, 0xBC, + 0x0B, 0xC2, 0x0B, 0xC8, 0x0B, 0xCE, 0x0B, 0xD4, 0x0B, 0xDA, 0x0B, 0xE0, 0x0B, 0xE6, 0x0B, 0xEC, + 0x0B, 0xF2, 0x0B, 0xF8, 0x0B, 0xFE, 0x0C, 0x04, 0x0C, 0x0A, 0x0C, 0x10, 0x0C, 0x16, 0x0C, 0x1C, + 0x0C, 0x22, 0x0C, 0x28, 0x0C, 0x2E, 0x0C, 0x34, 0x0C, 0x3A, 0x0C, 0x40, 0x0C, 0x46, 0x0C, 0x4C, + 0x0C, 0x52, 0x0C, 0x58, 0x0C, 0x5E, 0x0C, 0x64, 0x0C, 0x6A, 0x0C, 0x70, 0x0C, 0x76, 0x0C, 0x7C, + 0x0C, 0x82, 0x0C, 0x88, 0x0C, 0x8E, 0x0C, 0x94, 0x0C, 0x9A, 0x0C, 0xA0, 0x0C, 0xA6, 0x0C, 0xAC, + 0x0C, 0xB2, 0x0C, 0xB8, 0x0C, 0xBE, 0x0C, 0xC4, 0x0C, 0xCA, 0x0C, 0xD0, 0x0C, 0xD6, 0x0C, 0xDC, + 0x0C, 0xE2, 0x0C, 0xE8, 0x0C, 0xEE, 0x0C, 0xF4, 0x0C, 0xFA, 0x0D, 0x00, 0x0D, 0x06, 0x0D, 0x0C, + 0x0D, 0x12, 0x0D, 0x18, 0x0D, 0x1E, 0x0D, 0x24, 0x0D, 0x2A, 0x0D, 0x30, 0x0D, 0x36, 0x0D, 0x3C, + 0x0D, 0x42, 0x0D, 0x48, 0x0D, 0x4E, 0x0D, 0x54, 0x0D, 0x5A, 0x0D, 0x60, 0x0D, 0x66, 0x0D, 0x6C, + 0x0D, 0x72, 0x0D, 0x78, 0x0D, 0x7E, 0x0D, 0x84, 0x0D, 0x8A, 0x0D, 0x90, 0x0D, 0x96, 0x0D, 0x9C, + 0x0D, 0xA2, 0x0D, 0xA8, 0x0D, 0xAE, 0x0D, 0xB4, 0x0D, 0xBA, 0x0D, 0xC0, 0x0D, 0xC6, 0x0D, 0xCC, + 0x0D, 0xD2, 0x0D, 0xD8, 0x0D, 0xDE, 0x0D, 0xE4, 0x0D, 0xEA, 0x0D, 0xF0, 0x0D, 0xF6, 0x0D, 0xFC, + 0x0E, 0x02, 0x0E, 0x08, 0x0E, 0x0E, 0x0E, 0x14, 0x0E, 0x1A, 0x0E, 0x20, 0x0E, 0x26, 0x0E, 0x2C, + 0x0E, 0x32, 0x0E, 0x38, 0x0E, 0x3E, 0x0E, 0x44, 0x0E, 0x4A, 0x0E, 0x50, 0x0E, 0x56, 0x0E, 0x5C, + 0x0E, 0x62, 0x0E, 0x68, 0x0E, 0x6E, 0x0E, 0x74, 0x0E, 0x7A, 0x0E, 0x80, 0x0E, 0x86, 0x0E, 0x8C, + 0x0E, 0x92, 0x0E, 0x98, 0x0E, 0x9E, 0x0E, 0xA4, 0x0E, 0xAA, 0x0E, 0xB0, 0x0E, 0xB6, 0x0E, 0xBC, + 0x0E, 0xC2, 0x0E, 0xC8, 0x0E, 0xCE, 0x0E, 0xD4, 0x0E, 0xDA, 0x0E, 0xE0, 0x0E, 0xE6, 0x0E, 0xEC, + 0x0E, 0xF2, 0x0E, 0xF8, 0x0E, 0xFE, 0x0F, 0x04, 0x0F, 0x0A, 0x0F, 0x10, 0x0F, 0x16, 0x0F, 0x1C, + 0x0F, 0x22, 0x0F, 0x28, 0x0F, 0x2E, 0x0F, 0x34, 0x0F, 0x3A, 0x0F, 0x40, 0x0F, 0x46, 0x0F, 0x4C, + 0x0F, 0x52, 0x0F, 0x58, 0x0F, 0x5E, 0x0F, 0x64, 0x0F, 0x6A, 0x0F, 0x70, 0x0F, 0x76, 0x0F, 0x7C, + 0x0F, 0x82, 0x0F, 0x88, 0x00, 0x02, 0x00, 0x41, 0x03, 0x00, 0x00, 0x02, 0x00, 0x41, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x41, 0x03, 0x02, 0x00, 0x02, 0x00, 0x41, 0x03, 0x03, 0x00, 0x02, 0x00, 0x41, + 0x03, 0x08, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x43, 0x03, 0x27, 0x00, 0x02, + 0x00, 0x45, 0x03, 0x00, 0x00, 0x02, 0x00, 0x45, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, 0x03, 0x02, + 0x00, 0x02, 0x00, 0x45, 0x03, 0x08, 0x00, 0x02, 0x00, 0x49, 0x03, 0x00, 0x00, 0x02, 0x00, 0x49, + 0x03, 0x01, 0x00, 0x02, 0x00, 0x49, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x08, 0x00, 0x02, + 0x00, 0x4E, 0x03, 0x03, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x00, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x4F, 0x03, 0x02, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x4F, + 0x03, 0x08, 0x00, 0x02, 0x00, 0x55, 0x03, 0x00, 0x00, 0x02, 0x00, 0x55, 0x03, 0x01, 0x00, 0x02, + 0x00, 0x55, 0x03, 0x02, 0x00, 0x02, 0x00, 0x55, 0x03, 0x08, 0x00, 0x02, 0x00, 0x59, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x61, 0x03, 0x00, 0x00, 0x02, 0x00, 0x61, 0x03, 0x01, 0x00, 0x02, 0x00, 0x61, + 0x03, 0x02, 0x00, 0x02, 0x00, 0x61, 0x03, 0x03, 0x00, 0x02, 0x00, 0x61, 0x03, 0x08, 0x00, 0x02, + 0x00, 0x61, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x63, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x00, + 0x00, 0x02, 0x00, 0x65, 0x03, 0x01, 0x00, 0x02, 0x00, 0x65, 0x03, 0x02, 0x00, 0x02, 0x00, 0x65, + 0x03, 0x08, 0x00, 0x02, 0x00, 0x69, 0x03, 0x00, 0x00, 0x02, 0x00, 0x69, 0x03, 0x01, 0x00, 0x02, + 0x00, 0x69, 0x03, 0x02, 0x00, 0x02, 0x00, 0x69, 0x03, 0x08, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x03, + 0x00, 0x02, 0x00, 0x6F, 0x03, 0x00, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6F, + 0x03, 0x02, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x08, 0x00, 0x02, + 0x00, 0x75, 0x03, 0x00, 0x00, 0x02, 0x00, 0x75, 0x03, 0x01, 0x00, 0x02, 0x00, 0x75, 0x03, 0x02, + 0x00, 0x02, 0x00, 0x75, 0x03, 0x08, 0x00, 0x02, 0x00, 0x79, 0x03, 0x01, 0x00, 0x02, 0x00, 0x79, + 0x03, 0x08, 0x00, 0x02, 0x00, 0x41, 0x03, 0x04, 0x00, 0x02, 0x00, 0x61, 0x03, 0x04, 0x00, 0x02, + 0x00, 0x41, 0x03, 0x06, 0x00, 0x02, 0x00, 0x61, 0x03, 0x06, 0x00, 0x02, 0x00, 0x41, 0x03, 0x28, + 0x00, 0x02, 0x00, 0x61, 0x03, 0x28, 0x00, 0x02, 0x00, 0x43, 0x03, 0x01, 0x00, 0x02, 0x00, 0x63, + 0x03, 0x01, 0x00, 0x02, 0x00, 0x43, 0x03, 0x02, 0x00, 0x02, 0x00, 0x63, 0x03, 0x02, 0x00, 0x02, + 0x00, 0x43, 0x03, 0x07, 0x00, 0x02, 0x00, 0x63, 0x03, 0x07, 0x00, 0x02, 0x00, 0x43, 0x03, 0x0C, + 0x00, 0x02, 0x00, 0x63, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x44, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x64, + 0x03, 0x0C, 0x00, 0x02, 0x00, 0x45, 0x03, 0x04, 0x00, 0x02, 0x00, 0x65, 0x03, 0x04, 0x00, 0x02, + 0x00, 0x45, 0x03, 0x06, 0x00, 0x02, 0x00, 0x65, 0x03, 0x06, 0x00, 0x02, 0x00, 0x45, 0x03, 0x07, + 0x00, 0x02, 0x00, 0x65, 0x03, 0x07, 0x00, 0x02, 0x00, 0x45, 0x03, 0x28, 0x00, 0x02, 0x00, 0x65, + 0x03, 0x28, 0x00, 0x02, 0x00, 0x45, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x65, 0x03, 0x0C, 0x00, 0x02, + 0x00, 0x47, 0x03, 0x02, 0x00, 0x02, 0x00, 0x67, 0x03, 0x02, 0x00, 0x02, 0x00, 0x47, 0x03, 0x06, + 0x00, 0x02, 0x00, 0x67, 0x03, 0x06, 0x00, 0x02, 0x00, 0x47, 0x03, 0x07, 0x00, 0x02, 0x00, 0x67, + 0x03, 0x07, 0x00, 0x02, 0x00, 0x47, 0x03, 0x27, 0x00, 0x02, 0x00, 0x67, 0x03, 0x27, 0x00, 0x02, + 0x00, 0x48, 0x03, 0x02, 0x00, 0x02, 0x00, 0x68, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x03, + 0x00, 0x02, 0x00, 0x69, 0x03, 0x03, 0x00, 0x02, 0x00, 0x49, 0x03, 0x04, 0x00, 0x02, 0x00, 0x69, + 0x03, 0x04, 0x00, 0x02, 0x00, 0x49, 0x03, 0x06, 0x00, 0x02, 0x00, 0x69, 0x03, 0x06, 0x00, 0x02, + 0x00, 0x49, 0x03, 0x28, 0x00, 0x02, 0x00, 0x69, 0x03, 0x28, 0x00, 0x02, 0x00, 0x49, 0x03, 0x07, + 0x00, 0x02, 0x00, 0x4A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x6A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x4B, + 0x03, 0x27, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x01, 0x00, 0x02, + 0x00, 0x6C, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x27, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x27, + 0x00, 0x02, 0x00, 0x4C, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4E, + 0x03, 0x01, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x27, 0x00, 0x02, + 0x00, 0x6E, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x0C, + 0x00, 0x02, 0x00, 0x4F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, + 0x03, 0x06, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x06, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0B, 0x00, 0x02, + 0x00, 0x6F, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x52, 0x03, 0x01, 0x00, 0x02, 0x00, 0x72, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x52, 0x03, 0x27, 0x00, 0x02, 0x00, 0x72, 0x03, 0x27, 0x00, 0x02, 0x00, 0x52, + 0x03, 0x0C, 0x00, 0x02, 0x00, 0x72, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x53, 0x03, 0x01, 0x00, 0x02, + 0x00, 0x73, 0x03, 0x01, 0x00, 0x02, 0x00, 0x53, 0x03, 0x02, 0x00, 0x02, 0x00, 0x73, 0x03, 0x02, + 0x00, 0x02, 0x00, 0x53, 0x03, 0x27, 0x00, 0x02, 0x00, 0x73, 0x03, 0x27, 0x00, 0x02, 0x00, 0x53, + 0x03, 0x0C, 0x00, 0x02, 0x00, 0x73, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x54, 0x03, 0x27, 0x00, 0x02, + 0x00, 0x74, 0x03, 0x27, 0x00, 0x02, 0x00, 0x54, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x74, 0x03, 0x0C, + 0x00, 0x02, 0x00, 0x55, 0x03, 0x03, 0x00, 0x02, 0x00, 0x75, 0x03, 0x03, 0x00, 0x02, 0x00, 0x55, + 0x03, 0x04, 0x00, 0x02, 0x00, 0x75, 0x03, 0x04, 0x00, 0x02, 0x00, 0x55, 0x03, 0x06, 0x00, 0x02, + 0x00, 0x75, 0x03, 0x06, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0A, + 0x00, 0x02, 0x00, 0x55, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x55, + 0x03, 0x28, 0x00, 0x02, 0x00, 0x75, 0x03, 0x28, 0x00, 0x02, 0x00, 0x57, 0x03, 0x02, 0x00, 0x02, + 0x00, 0x77, 0x03, 0x02, 0x00, 0x02, 0x00, 0x59, 0x03, 0x02, 0x00, 0x02, 0x00, 0x79, 0x03, 0x02, + 0x00, 0x02, 0x00, 0x59, 0x03, 0x08, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x01, 0x00, 0x02, 0x00, 0x7A, + 0x03, 0x01, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x5A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x1B, + 0x00, 0x02, 0x00, 0x6F, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x55, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x75, + 0x03, 0x1B, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0C, 0x00, 0x02, + 0x00, 0x49, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x69, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0C, + 0x00, 0x02, 0x00, 0x6F, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x75, + 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x04, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x04, 0x00, 0x02, + 0x00, 0x55, 0x03, 0x44, 0x00, 0x02, 0x00, 0x75, 0x03, 0x44, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x0C, + 0x00, 0x02, 0x00, 0xFC, 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x00, 0x00, 0x02, 0x00, 0xFC, + 0x03, 0x00, 0x00, 0x02, 0x00, 0xC4, 0x03, 0x04, 0x00, 0x02, 0x00, 0xE4, 0x03, 0x04, 0x00, 0x02, + 0x02, 0x26, 0x03, 0x04, 0x00, 0x02, 0x02, 0x27, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x04, + 0x00, 0x02, 0x00, 0xE6, 0x03, 0x04, 0x00, 0x02, 0x00, 0x47, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x67, + 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x0C, 0x00, 0x02, + 0x00, 0x4F, 0x03, 0x28, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x28, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x28, + 0x00, 0x02, 0x01, 0x4D, 0x03, 0x28, 0x00, 0x02, 0x01, 0xB7, 0x03, 0x0C, 0x00, 0x02, 0x02, 0x92, + 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x47, 0x03, 0x01, 0x00, 0x02, + 0x00, 0x67, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x00, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x00, + 0x00, 0x02, 0x00, 0xC5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xE5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xC6, + 0x03, 0x01, 0x00, 0x02, 0x00, 0xE6, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD8, 0x03, 0x01, 0x00, 0x02, + 0x00, 0xF8, 0x03, 0x01, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0F, + 0x00, 0x02, 0x00, 0x41, 0x03, 0x11, 0x00, 0x02, 0x00, 0x61, 0x03, 0x11, 0x00, 0x02, 0x00, 0x45, + 0x03, 0x0F, 0x00, 0x02, 0x00, 0x65, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x45, 0x03, 0x11, 0x00, 0x02, + 0x00, 0x65, 0x03, 0x11, 0x00, 0x02, 0x00, 0x49, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x69, 0x03, 0x0F, + 0x00, 0x02, 0x00, 0x49, 0x03, 0x11, 0x00, 0x02, 0x00, 0x69, 0x03, 0x11, 0x00, 0x02, 0x00, 0x4F, + 0x03, 0x0F, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x11, 0x00, 0x02, + 0x00, 0x6F, 0x03, 0x11, 0x00, 0x02, 0x00, 0x52, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x72, 0x03, 0x0F, + 0x00, 0x02, 0x00, 0x52, 0x03, 0x11, 0x00, 0x02, 0x00, 0x72, 0x03, 0x11, 0x00, 0x02, 0x00, 0x55, + 0x03, 0x0F, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x55, 0x03, 0x11, 0x00, 0x02, + 0x00, 0x75, 0x03, 0x11, 0x00, 0x02, 0x00, 0x53, 0x03, 0x26, 0x00, 0x02, 0x00, 0x73, 0x03, 0x26, + 0x00, 0x02, 0x00, 0x54, 0x03, 0x26, 0x00, 0x02, 0x00, 0x74, 0x03, 0x26, 0x00, 0x02, 0x00, 0x48, + 0x03, 0x0C, 0x00, 0x02, 0x00, 0x68, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x41, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x61, 0x03, 0x07, 0x00, 0x02, 0x00, 0x45, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x27, + 0x00, 0x02, 0x00, 0xD6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xF6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xD5, + 0x03, 0x04, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x6F, 0x03, 0x07, 0x00, 0x02, 0x02, 0x2E, 0x03, 0x04, 0x00, 0x02, 0x02, 0x2F, 0x03, 0x04, + 0x00, 0x02, 0x00, 0x59, 0x03, 0x04, 0x00, 0x02, 0x00, 0x79, 0x03, 0x04, 0x00, 0x02, 0x00, 0x41, + 0x03, 0x25, 0x00, 0x02, 0x00, 0x61, 0x03, 0x25, 0x00, 0x02, 0x00, 0x42, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x62, 0x03, 0x07, 0x00, 0x02, 0x00, 0x42, 0x03, 0x23, 0x00, 0x02, 0x00, 0x62, 0x03, 0x23, + 0x00, 0x02, 0x00, 0x42, 0x03, 0x31, 0x00, 0x02, 0x00, 0x62, 0x03, 0x31, 0x00, 0x02, 0x00, 0xC7, + 0x03, 0x01, 0x00, 0x02, 0x00, 0xE7, 0x03, 0x01, 0x00, 0x02, 0x00, 0x44, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x64, 0x03, 0x07, 0x00, 0x02, 0x00, 0x44, 0x03, 0x23, 0x00, 0x02, 0x00, 0x64, 0x03, 0x23, + 0x00, 0x02, 0x00, 0x44, 0x03, 0x31, 0x00, 0x02, 0x00, 0x64, 0x03, 0x31, 0x00, 0x02, 0x00, 0x44, + 0x03, 0x27, 0x00, 0x02, 0x00, 0x64, 0x03, 0x27, 0x00, 0x02, 0x00, 0x44, 0x03, 0x2D, 0x00, 0x02, + 0x00, 0x64, 0x03, 0x2D, 0x00, 0x02, 0x01, 0x12, 0x03, 0x00, 0x00, 0x02, 0x01, 0x13, 0x03, 0x00, + 0x00, 0x02, 0x01, 0x12, 0x03, 0x01, 0x00, 0x02, 0x01, 0x13, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, + 0x03, 0x2D, 0x00, 0x02, 0x00, 0x65, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x45, 0x03, 0x30, 0x00, 0x02, + 0x00, 0x65, 0x03, 0x30, 0x00, 0x02, 0x01, 0x14, 0x03, 0x27, 0x00, 0x02, 0x01, 0x15, 0x03, 0x27, + 0x00, 0x02, 0x00, 0x46, 0x03, 0x07, 0x00, 0x02, 0x00, 0x66, 0x03, 0x07, 0x00, 0x02, 0x00, 0x47, + 0x03, 0x04, 0x00, 0x02, 0x00, 0x67, 0x03, 0x04, 0x00, 0x02, 0x00, 0x48, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x68, 0x03, 0x07, 0x00, 0x02, 0x00, 0x48, 0x03, 0x23, 0x00, 0x02, 0x00, 0x68, 0x03, 0x23, + 0x00, 0x02, 0x00, 0x48, 0x03, 0x08, 0x00, 0x02, 0x00, 0x68, 0x03, 0x08, 0x00, 0x02, 0x00, 0x48, + 0x03, 0x27, 0x00, 0x02, 0x00, 0x68, 0x03, 0x27, 0x00, 0x02, 0x00, 0x48, 0x03, 0x2E, 0x00, 0x02, + 0x00, 0x68, 0x03, 0x2E, 0x00, 0x02, 0x00, 0x49, 0x03, 0x30, 0x00, 0x02, 0x00, 0x69, 0x03, 0x30, + 0x00, 0x02, 0x00, 0x49, 0x03, 0x44, 0x00, 0x02, 0x00, 0x69, 0x03, 0x44, 0x00, 0x02, 0x00, 0x4B, + 0x03, 0x01, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x6B, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x31, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x31, + 0x00, 0x02, 0x00, 0x4C, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x23, 0x00, 0x02, 0x1E, 0x36, + 0x03, 0x04, 0x00, 0x02, 0x1E, 0x37, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x31, 0x00, 0x02, + 0x00, 0x6C, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x2D, + 0x00, 0x02, 0x00, 0x4D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4D, + 0x03, 0x07, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x6D, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x07, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x07, + 0x00, 0x02, 0x00, 0x4E, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4E, + 0x03, 0x31, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x2D, 0x00, 0x02, + 0x00, 0x6E, 0x03, 0x2D, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x01, + 0x00, 0x02, 0x00, 0xD5, 0x03, 0x08, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, + 0x03, 0x00, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x00, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x01, 0x00, 0x02, + 0x01, 0x4D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x50, 0x03, 0x01, 0x00, 0x02, 0x00, 0x70, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x50, 0x03, 0x07, 0x00, 0x02, 0x00, 0x70, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, + 0x03, 0x07, 0x00, 0x02, 0x00, 0x72, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x72, 0x03, 0x23, 0x00, 0x02, 0x1E, 0x5A, 0x03, 0x04, 0x00, 0x02, 0x1E, 0x5B, 0x03, 0x04, + 0x00, 0x02, 0x00, 0x52, 0x03, 0x31, 0x00, 0x02, 0x00, 0x72, 0x03, 0x31, 0x00, 0x02, 0x00, 0x53, + 0x03, 0x07, 0x00, 0x02, 0x00, 0x73, 0x03, 0x07, 0x00, 0x02, 0x00, 0x53, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x73, 0x03, 0x23, 0x00, 0x02, 0x01, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x01, 0x5B, 0x03, 0x07, + 0x00, 0x02, 0x01, 0x60, 0x03, 0x07, 0x00, 0x02, 0x01, 0x61, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x60, + 0x03, 0x23, 0x00, 0x02, 0x1E, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x54, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x74, 0x03, 0x07, 0x00, 0x02, 0x00, 0x54, 0x03, 0x23, 0x00, 0x02, 0x00, 0x74, 0x03, 0x23, + 0x00, 0x02, 0x00, 0x54, 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x31, 0x00, 0x02, 0x00, 0x54, + 0x03, 0x2D, 0x00, 0x02, 0x00, 0x74, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x55, 0x03, 0x24, 0x00, 0x02, + 0x00, 0x75, 0x03, 0x24, 0x00, 0x02, 0x00, 0x55, 0x03, 0x30, 0x00, 0x02, 0x00, 0x75, 0x03, 0x30, + 0x00, 0x02, 0x00, 0x55, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x75, 0x03, 0x2D, 0x00, 0x02, 0x01, 0x68, + 0x03, 0x01, 0x00, 0x02, 0x01, 0x69, 0x03, 0x01, 0x00, 0x02, 0x01, 0x6A, 0x03, 0x08, 0x00, 0x02, + 0x01, 0x6B, 0x03, 0x08, 0x00, 0x02, 0x00, 0x56, 0x03, 0x03, 0x00, 0x02, 0x00, 0x76, 0x03, 0x03, + 0x00, 0x02, 0x00, 0x56, 0x03, 0x23, 0x00, 0x02, 0x00, 0x76, 0x03, 0x23, 0x00, 0x02, 0x00, 0x57, + 0x03, 0x00, 0x00, 0x02, 0x00, 0x77, 0x03, 0x00, 0x00, 0x02, 0x00, 0x57, 0x03, 0x01, 0x00, 0x02, + 0x00, 0x77, 0x03, 0x01, 0x00, 0x02, 0x00, 0x57, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, 0x03, 0x08, + 0x00, 0x02, 0x00, 0x57, 0x03, 0x07, 0x00, 0x02, 0x00, 0x77, 0x03, 0x07, 0x00, 0x02, 0x00, 0x57, + 0x03, 0x23, 0x00, 0x02, 0x00, 0x77, 0x03, 0x23, 0x00, 0x02, 0x00, 0x58, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x78, 0x03, 0x07, 0x00, 0x02, 0x00, 0x58, 0x03, 0x08, 0x00, 0x02, 0x00, 0x78, 0x03, 0x08, + 0x00, 0x02, 0x00, 0x59, 0x03, 0x07, 0x00, 0x02, 0x00, 0x79, 0x03, 0x07, 0x00, 0x02, 0x00, 0x5A, + 0x03, 0x02, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x7A, 0x03, 0x23, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x31, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x31, + 0x00, 0x02, 0x00, 0x68, 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, + 0x03, 0x0A, 0x00, 0x02, 0x00, 0x79, 0x03, 0x0A, 0x00, 0x02, 0x01, 0x7F, 0x03, 0x07, 0x00, 0x02, + 0x00, 0x41, 0x03, 0x23, 0x00, 0x02, 0x00, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x41, 0x03, 0x09, + 0x00, 0x02, 0x00, 0x61, 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x01, 0x00, 0x02, 0x00, 0xE2, + 0x03, 0x01, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x00, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x00, 0x00, 0x02, + 0x00, 0xC2, 0x03, 0x09, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x03, + 0x00, 0x02, 0x00, 0xE2, 0x03, 0x03, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x23, 0x00, 0x02, 0x00, 0xE2, + 0x03, 0x23, 0x00, 0x02, 0x01, 0x02, 0x03, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x01, 0x00, 0x02, + 0x01, 0x02, 0x03, 0x00, 0x00, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, 0x02, 0x01, 0x02, 0x03, 0x09, + 0x00, 0x02, 0x01, 0x03, 0x03, 0x09, 0x00, 0x02, 0x01, 0x02, 0x03, 0x03, 0x00, 0x02, 0x01, 0x03, + 0x03, 0x03, 0x00, 0x02, 0x01, 0x02, 0x03, 0x23, 0x00, 0x02, 0x01, 0x03, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x45, 0x03, 0x23, 0x00, 0x02, 0x00, 0x65, 0x03, 0x23, 0x00, 0x02, 0x00, 0x45, 0x03, 0x09, + 0x00, 0x02, 0x00, 0x65, 0x03, 0x09, 0x00, 0x02, 0x00, 0x45, 0x03, 0x03, 0x00, 0x02, 0x00, 0x65, + 0x03, 0x03, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x01, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x01, 0x00, 0x02, + 0x00, 0xCA, 0x03, 0x00, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x00, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x09, + 0x00, 0x02, 0x00, 0xEA, 0x03, 0x09, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x03, 0x00, 0x02, 0x00, 0xEA, + 0x03, 0x03, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x23, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x23, 0x00, 0x02, + 0x00, 0x49, 0x03, 0x09, 0x00, 0x02, 0x00, 0x69, 0x03, 0x09, 0x00, 0x02, 0x00, 0x49, 0x03, 0x23, + 0x00, 0x02, 0x00, 0x69, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6F, + 0x03, 0x23, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x09, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x09, 0x00, 0x02, + 0x00, 0xD4, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x00, + 0x00, 0x02, 0x00, 0xF4, 0x03, 0x00, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x09, 0x00, 0x02, 0x00, 0xF4, + 0x03, 0x09, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x03, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x03, 0x00, 0x02, + 0x00, 0xD4, 0x03, 0x23, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x23, 0x00, 0x02, 0x00, 0xD3, 0x03, 0x1B, + 0x00, 0x02, 0x00, 0xF3, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD2, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF2, + 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x09, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x09, 0x00, 0x02, + 0x00, 0xD5, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x23, + 0x00, 0x02, 0x01, 0xA1, 0x03, 0x23, 0x00, 0x02, 0x00, 0x55, 0x03, 0x23, 0x00, 0x02, 0x00, 0x75, + 0x03, 0x23, 0x00, 0x02, 0x00, 0x55, 0x03, 0x09, 0x00, 0x02, 0x00, 0x75, 0x03, 0x09, 0x00, 0x02, + 0x00, 0xDA, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xFA, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD9, 0x03, 0x1B, + 0x00, 0x02, 0x00, 0xF9, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x09, 0x00, 0x02, 0x01, 0xB0, + 0x03, 0x09, 0x00, 0x02, 0x01, 0x68, 0x03, 0x1B, 0x00, 0x02, 0x01, 0x69, 0x03, 0x1B, 0x00, 0x02, + 0x01, 0xAF, 0x03, 0x23, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x23, 0x00, 0x02, 0x00, 0x59, 0x03, 0x00, + 0x00, 0x02, 0x00, 0x79, 0x03, 0x00, 0x00, 0x02, 0x00, 0x59, 0x03, 0x23, 0x00, 0x02, 0x00, 0x79, + 0x03, 0x23, 0x00, 0x02, 0x00, 0x59, 0x03, 0x09, 0x00, 0x02, 0x00, 0x79, 0x03, 0x09, 0x00, 0x02, + 0x00, 0x59, 0x03, 0x03, 0x00, 0x02, 0x00, 0x79, 0x03, 0x03, 0x00, 0x01, 0x01, 0xF1, 0x00, 0xC0, + 0x00, 0xC1, 0x00, 0xC2, 0x00, 0xC3, 0x00, 0xC4, 0x00, 0xC5, 0x00, 0xC7, 0x00, 0xC8, 0x00, 0xC9, + 0x00, 0xCA, 0x00, 0xCB, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xCE, 0x00, 0xCF, 0x00, 0xD1, 0x00, 0xD2, + 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDB, 0x00, 0xDC, + 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE2, 0x00, 0xE3, 0x00, 0xE4, 0x00, 0xE5, 0x00, 0xE7, + 0x00, 0xE8, 0x00, 0xE9, 0x00, 0xEA, 0x00, 0xEB, 0x00, 0xEC, 0x00, 0xED, 0x00, 0xEE, 0x00, 0xEF, + 0x00, 0xF1, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, 0x00, 0xF6, 0x00, 0xF9, 0x00, 0xFA, + 0x00, 0xFB, 0x00, 0xFC, 0x00, 0xFD, 0x00, 0xFF, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03, + 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0A, 0x01, 0x0B, + 0x01, 0x0C, 0x01, 0x0D, 0x01, 0x0E, 0x01, 0x0F, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, + 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1A, 0x01, 0x1B, 0x01, 0x1C, 0x01, 0x1D, + 0x01, 0x1E, 0x01, 0x1F, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, + 0x01, 0x28, 0x01, 0x29, 0x01, 0x2A, 0x01, 0x2B, 0x01, 0x2C, 0x01, 0x2D, 0x01, 0x2E, 0x01, 0x2F, + 0x01, 0x30, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x39, 0x01, 0x3A, 0x01, 0x3B, + 0x01, 0x3C, 0x01, 0x3D, 0x01, 0x3E, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, + 0x01, 0x48, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x4E, 0x01, 0x4F, 0x01, 0x50, 0x01, 0x51, 0x01, 0x54, + 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5A, 0x01, 0x5B, 0x01, 0x5C, + 0x01, 0x5D, 0x01, 0x5E, 0x01, 0x5F, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, + 0x01, 0x65, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x6C, 0x01, 0x6D, 0x01, 0x6E, + 0x01, 0x6F, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, + 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7A, 0x01, 0x7B, 0x01, 0x7C, 0x01, 0x7D, 0x01, 0x7E, + 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, 0x01, 0xB0, 0x01, 0xCD, 0x01, 0xCE, 0x01, 0xCF, 0x01, 0xD0, + 0x01, 0xD1, 0x01, 0xD2, 0x01, 0xD3, 0x01, 0xD4, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, 0x01, 0xD8, + 0x01, 0xD9, 0x01, 0xDA, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, 0x01, 0xE1, + 0x01, 0xE2, 0x01, 0xE3, 0x01, 0xE6, 0x01, 0xE7, 0x01, 0xE8, 0x01, 0xE9, 0x01, 0xEA, 0x01, 0xEB, + 0x01, 0xEC, 0x01, 0xED, 0x01, 0xEE, 0x01, 0xEF, 0x01, 0xF0, 0x01, 0xF4, 0x01, 0xF5, 0x01, 0xF8, + 0x01, 0xF9, 0x01, 0xFA, 0x01, 0xFB, 0x01, 0xFC, 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, 0x02, 0x00, + 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, + 0x02, 0x09, 0x02, 0x0A, 0x02, 0x0B, 0x02, 0x0C, 0x02, 0x0D, 0x02, 0x0E, 0x02, 0x0F, 0x02, 0x10, + 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, + 0x02, 0x19, 0x02, 0x1A, 0x02, 0x1B, 0x02, 0x1E, 0x02, 0x1F, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, + 0x02, 0x29, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, 0x02, 0x2D, 0x02, 0x2E, 0x02, 0x2F, 0x02, 0x30, + 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x1E, 0x00, 0x1E, 0x01, 0x1E, 0x02, 0x1E, 0x03, 0x1E, 0x04, + 0x1E, 0x05, 0x1E, 0x06, 0x1E, 0x07, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x0A, 0x1E, 0x0B, 0x1E, 0x0C, + 0x1E, 0x0D, 0x1E, 0x0E, 0x1E, 0x0F, 0x1E, 0x10, 0x1E, 0x11, 0x1E, 0x12, 0x1E, 0x13, 0x1E, 0x14, + 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x18, 0x1E, 0x19, 0x1E, 0x1A, 0x1E, 0x1B, 0x1E, 0x1C, + 0x1E, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1E, 0x20, 0x1E, 0x21, 0x1E, 0x22, 0x1E, 0x23, 0x1E, 0x24, + 0x1E, 0x25, 0x1E, 0x26, 0x1E, 0x27, 0x1E, 0x28, 0x1E, 0x29, 0x1E, 0x2A, 0x1E, 0x2B, 0x1E, 0x2C, + 0x1E, 0x2D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x1E, 0x33, 0x1E, 0x34, + 0x1E, 0x35, 0x1E, 0x36, 0x1E, 0x37, 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x3A, 0x1E, 0x3B, 0x1E, 0x3C, + 0x1E, 0x3D, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x40, 0x1E, 0x41, 0x1E, 0x42, 0x1E, 0x43, 0x1E, 0x44, + 0x1E, 0x45, 0x1E, 0x46, 0x1E, 0x47, 0x1E, 0x48, 0x1E, 0x49, 0x1E, 0x4A, 0x1E, 0x4B, 0x1E, 0x4C, + 0x1E, 0x4D, 0x1E, 0x4E, 0x1E, 0x4F, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x54, + 0x1E, 0x55, 0x1E, 0x56, 0x1E, 0x57, 0x1E, 0x58, 0x1E, 0x59, 0x1E, 0x5A, 0x1E, 0x5B, 0x1E, 0x5C, + 0x1E, 0x5D, 0x1E, 0x5E, 0x1E, 0x5F, 0x1E, 0x60, 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, 0x1E, 0x64, + 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x6A, 0x1E, 0x6B, 0x1E, 0x6C, + 0x1E, 0x6D, 0x1E, 0x6E, 0x1E, 0x6F, 0x1E, 0x70, 0x1E, 0x71, 0x1E, 0x72, 0x1E, 0x73, 0x1E, 0x74, + 0x1E, 0x75, 0x1E, 0x76, 0x1E, 0x77, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0x7A, 0x1E, 0x7B, 0x1E, 0x7C, + 0x1E, 0x7D, 0x1E, 0x7E, 0x1E, 0x7F, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, 0x1E, 0x84, + 0x1E, 0x85, 0x1E, 0x86, 0x1E, 0x87, 0x1E, 0x88, 0x1E, 0x89, 0x1E, 0x8A, 0x1E, 0x8B, 0x1E, 0x8C, + 0x1E, 0x8D, 0x1E, 0x8E, 0x1E, 0x8F, 0x1E, 0x90, 0x1E, 0x91, 0x1E, 0x92, 0x1E, 0x93, 0x1E, 0x94, + 0x1E, 0x95, 0x1E, 0x96, 0x1E, 0x97, 0x1E, 0x98, 0x1E, 0x99, 0x1E, 0x9B, 0x1E, 0xA0, 0x1E, 0xA1, + 0x1E, 0xA2, 0x1E, 0xA3, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xA8, 0x1E, 0xA9, + 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, + 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, 0x1E, 0xB5, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xB8, 0x1E, 0xB9, + 0x1E, 0xBA, 0x1E, 0xBB, 0x1E, 0xBC, 0x1E, 0xBD, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, + 0x1E, 0xC2, 0x1E, 0xC3, 0x1E, 0xC4, 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xC8, 0x1E, 0xC9, + 0x1E, 0xCA, 0x1E, 0xCB, 0x1E, 0xCC, 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xD0, 0x1E, 0xD1, + 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD4, 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, 0x1E, 0xD9, + 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, + 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE4, 0x1E, 0xE5, 0x1E, 0xE6, 0x1E, 0xE7, 0x1E, 0xE8, 0x1E, 0xE9, + 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, + 0x1E, 0xF2, 0x1E, 0xF3, 0x1E, 0xF4, 0x1E, 0xF5, 0x1E, 0xF6, 0x1E, 0xF7, 0x1E, 0xF8, 0x1E, 0xF9, + 0x00, 0x01, 0x05, 0xBA, 0x00, 0xAC, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, + 0x01, 0x7C, 0x01, 0x82, 0x01, 0x88, 0x01, 0x8E, 0x01, 0x94, 0x01, 0x9A, 0x01, 0xA0, 0x01, 0xA6, + 0x01, 0xAC, 0x01, 0xB2, 0x01, 0xB8, 0x01, 0xBE, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD0, 0x01, 0xD6, + 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xE8, 0x01, 0xEE, 0x01, 0xF4, 0x01, 0xFA, 0x02, 0x00, 0x02, 0x06, + 0x02, 0x0C, 0x02, 0x12, 0x02, 0x18, 0x02, 0x1E, 0x02, 0x24, 0x02, 0x2A, 0x02, 0x30, 0x02, 0x38, + 0x02, 0x40, 0x02, 0x46, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x62, 0x02, 0x68, 0x02, 0x70, + 0x02, 0x78, 0x02, 0x80, 0x02, 0x88, 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, 0x02, 0xA0, 0x02, 0xA6, + 0x02, 0xAC, 0x02, 0xB2, 0x02, 0xB8, 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD6, + 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06, 0x03, 0x0C, 0x03, 0x12, + 0x03, 0x18, 0x03, 0x1E, 0x03, 0x24, 0x03, 0x2A, 0x03, 0x30, 0x03, 0x36, 0x03, 0x3C, 0x03, 0x42, + 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, 0x03, 0x5A, 0x03, 0x62, 0x03, 0x6A, 0x03, 0x70, 0x03, 0x76, + 0x03, 0x7C, 0x03, 0x82, 0x03, 0x8A, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA4, 0x03, 0xAA, + 0x03, 0xB0, 0x03, 0xB6, 0x03, 0xBE, 0x03, 0xC6, 0x03, 0xCE, 0x03, 0xD6, 0x03, 0xDE, 0x03, 0xE6, + 0x03, 0xEC, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x06, 0x04, 0x0E, 0x04, 0x14, 0x04, 0x1A, + 0x04, 0x20, 0x04, 0x26, 0x04, 0x2C, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, 0x04, 0x46, 0x04, 0x4E, + 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82, + 0x04, 0x8A, 0x04, 0x92, 0x04, 0x9A, 0x04, 0xA2, 0x04, 0xA8, 0x04, 0xAE, 0x04, 0xB4, 0x04, 0xBA, + 0x04, 0xC0, 0x04, 0xC6, 0x04, 0xCE, 0x04, 0xD6, 0x04, 0xDE, 0x04, 0xE6, 0x04, 0xEC, 0x04, 0xF2, + 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x12, 0x05, 0x1A, 0x05, 0x22, 0x05, 0x2A, + 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A, + 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A, + 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x00, 0x02, + 0x00, 0x41, 0x03, 0x40, 0x00, 0x02, 0x00, 0x41, 0x03, 0x41, 0x00, 0x02, 0x00, 0x45, 0x03, 0x40, + 0x00, 0x02, 0x00, 0x45, 0x03, 0x41, 0x00, 0x02, 0x00, 0x49, 0x03, 0x40, 0x00, 0x02, 0x00, 0x49, + 0x03, 0x41, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x40, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x41, 0x00, 0x02, + 0x00, 0x55, 0x03, 0x40, 0x00, 0x02, 0x00, 0x55, 0x03, 0x41, 0x00, 0x02, 0x00, 0x59, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x61, 0x03, 0x40, 0x00, 0x02, 0x00, 0x61, 0x03, 0x41, 0x00, 0x02, 0x00, 0x65, + 0x03, 0x40, 0x00, 0x02, 0x00, 0x65, 0x03, 0x41, 0x00, 0x02, 0x00, 0x69, 0x03, 0x40, 0x00, 0x02, + 0x00, 0x69, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x40, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x75, 0x03, 0x40, 0x00, 0x02, 0x00, 0x75, 0x03, 0x41, 0x00, 0x02, 0x00, 0x79, + 0x03, 0x41, 0x00, 0x02, 0x00, 0x43, 0x03, 0x41, 0x00, 0x02, 0x00, 0x63, 0x03, 0x41, 0x00, 0x02, + 0x21, 0x2A, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x4E, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x41, 0x00, 0x02, 0x00, 0x52, + 0x03, 0x41, 0x00, 0x02, 0x00, 0x72, 0x03, 0x41, 0x00, 0x02, 0x00, 0x53, 0x03, 0x41, 0x00, 0x02, + 0x00, 0x73, 0x03, 0x41, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x41, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x04, + 0x00, 0x02, 0x00, 0xDC, 0x03, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, + 0x03, 0x08, 0x03, 0x0C, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, + 0x03, 0x40, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x08, 0x03, 0x04, + 0x00, 0x03, 0x00, 0x61, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x41, 0x03, 0x07, 0x03, 0x04, + 0x00, 0x03, 0x00, 0x61, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x0C, 0x00, 0x02, + 0x01, 0xEA, 0x03, 0x04, 0x00, 0x02, 0x01, 0xEB, 0x03, 0x04, 0x00, 0x02, 0x00, 0x47, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x67, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x40, 0x00, 0x02, 0x00, 0x6E, + 0x03, 0x40, 0x00, 0x02, 0x00, 0xC5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE5, 0x03, 0x41, 0x00, 0x02, + 0x00, 0xC6, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE6, 0x03, 0x41, 0x00, 0x02, 0x00, 0xD8, 0x03, 0x41, + 0x00, 0x02, 0x00, 0xF8, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x04, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x03, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x07, 0x03, 0x04, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC7, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE7, + 0x03, 0x41, 0x00, 0x02, 0x01, 0x12, 0x03, 0x40, 0x00, 0x02, 0x01, 0x13, 0x03, 0x40, 0x00, 0x02, + 0x01, 0x12, 0x03, 0x41, 0x00, 0x02, 0x01, 0x13, 0x03, 0x41, 0x00, 0x02, 0x02, 0x28, 0x03, 0x06, + 0x00, 0x02, 0x02, 0x29, 0x03, 0x06, 0x00, 0x02, 0x00, 0xCF, 0x03, 0x01, 0x00, 0x02, 0x00, 0xEF, + 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x41, 0x00, 0x02, + 0x21, 0x2A, 0x03, 0x23, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x31, 0x00, 0x03, 0x00, 0x4C, 0x03, 0x04, + 0x03, 0x23, 0x00, 0x03, 0x00, 0x6C, 0x03, 0x04, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x6D, 0x03, 0x41, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF5, + 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x08, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, + 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x40, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x40, 0x00, 0x02, + 0x01, 0x4C, 0x03, 0x41, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x41, 0x00, 0x02, 0x00, 0x50, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x70, 0x03, 0x41, 0x00, 0x03, 0x00, 0x52, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, + 0x00, 0x72, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, 0x00, 0x53, 0x03, 0x01, 0x03, 0x07, 0x00, 0x03, + 0x00, 0x73, 0x03, 0x01, 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x0C, 0x03, 0x07, 0x00, 0x03, + 0x00, 0x73, 0x03, 0x0C, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x62, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x63, + 0x03, 0x07, 0x00, 0x02, 0x01, 0x68, 0x03, 0x41, 0x00, 0x02, 0x01, 0x69, 0x03, 0x41, 0x00, 0x03, + 0x00, 0x55, 0x03, 0x04, 0x03, 0x08, 0x00, 0x03, 0x00, 0x75, 0x03, 0x04, 0x03, 0x08, 0x00, 0x02, + 0x00, 0x57, 0x03, 0x40, 0x00, 0x02, 0x00, 0x77, 0x03, 0x40, 0x00, 0x02, 0x00, 0x57, 0x03, 0x41, + 0x00, 0x02, 0x00, 0x77, 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE2, + 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x40, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x40, 0x00, 0x03, + 0x00, 0x41, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, + 0x00, 0x41, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, + 0x1E, 0xA0, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xA1, 0x03, 0x02, 0x00, 0x02, 0x01, 0x02, 0x03, 0x41, + 0x00, 0x02, 0x01, 0x03, 0x03, 0x41, 0x00, 0x02, 0x01, 0x02, 0x03, 0x40, 0x00, 0x02, 0x01, 0x03, + 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x09, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, + 0x03, 0x09, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x03, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, + 0x03, 0x03, 0x00, 0x02, 0x1E, 0xA0, 0x03, 0x06, 0x00, 0x02, 0x1E, 0xA1, 0x03, 0x06, 0x00, 0x02, + 0x00, 0xCA, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x41, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x40, + 0x00, 0x02, 0x00, 0xEA, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, + 0x00, 0x65, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, + 0x00, 0x65, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xB8, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xB9, + 0x03, 0x02, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x41, 0x00, 0x02, + 0x00, 0xD4, 0x03, 0x40, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, + 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, + 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xCC, 0x03, 0x02, + 0x00, 0x02, 0x1E, 0xCD, 0x03, 0x02, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x01, 0x00, 0x02, 0x01, 0xA1, + 0x03, 0x01, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x00, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x00, 0x00, 0x02, + 0x1E, 0xCE, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xCF, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x03, + 0x00, 0x02, 0x01, 0xA1, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xCC, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xCD, + 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x01, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x01, 0x00, 0x02, + 0x01, 0xAF, 0x03, 0x00, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x00, 0x00, 0x02, 0x1E, 0xE6, 0x03, 0x1B, + 0x00, 0x02, 0x1E, 0xE7, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x03, 0x00, 0x02, 0x01, 0xB0, + 0x03, 0x03, 0x00, 0x02, 0x1E, 0xE4, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xE5, 0x03, 0x1B, 0x00, 0x02, + 0x00, 0x59, 0x03, 0x40, 0x00, 0x02, 0x00, 0x79, 0x03, 0x40, 0x00, 0x01, 0x00, 0xAC, 0x00, 0xC0, + 0x00, 0xC1, 0x00, 0xC8, 0x00, 0xC9, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD9, + 0x00, 0xDA, 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE8, 0x00, 0xE9, 0x00, 0xEC, 0x00, 0xED, + 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFD, 0x01, 0x06, 0x01, 0x07, 0x01, 0x36, + 0x01, 0x39, 0x01, 0x3A, 0x01, 0x43, 0x01, 0x44, 0x01, 0x54, 0x01, 0x55, 0x01, 0x5A, 0x01, 0x5B, + 0x01, 0x79, 0x01, 0x7A, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xD9, 0x01, 0xDA, + 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, 0x01, 0xE1, 0x01, 0xE8, 0x01, 0xEC, + 0x01, 0xED, 0x01, 0xF4, 0x01, 0xF5, 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFA, 0x01, 0xFB, 0x01, 0xFC, + 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, 0x02, 0x2D, 0x02, 0x30, + 0x02, 0x31, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x1C, + 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x1E, 0x34, 0x1E, 0x38, + 0x1E, 0x39, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x4E, 0x1E, 0x4F, 0x1E, 0x50, + 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x54, 0x1E, 0x55, 0x1E, 0x5C, 0x1E, 0x5D, 0x1E, 0x64, + 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0x7A, + 0x1E, 0x7B, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, + 0x1E, 0xA7, 0x1E, 0xA8, 0x1E, 0xA9, 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, + 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, 0x1E, 0xB5, 0x1E, 0xB6, + 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC2, 0x1E, 0xC3, 0x1E, 0xC4, + 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD4, + 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, + 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE8, + 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, + 0x1E, 0xF1, 0x1E, 0xF2, 0x1E, 0xF3, 0x00, 0x01, 0x02, 0xFC, 0x00, 0x4F, 0x00, 0xA4, 0x00, 0xAA, + 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, + 0x00, 0xEA, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, + 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C, + 0x01, 0x64, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, + 0x01, 0xA4, 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC, + 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C, + 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, + 0x02, 0x64, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, + 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBA, 0x02, 0xC0, 0x02, 0xC6, 0x02, 0xCC, + 0x02, 0xD4, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, 0x02, 0xF4, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x41, + 0x00, 0x02, 0x00, 0xFC, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, + 0x00, 0x75, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x28, 0x00, 0x03, + 0x00, 0x6F, 0x03, 0x04, 0x03, 0x28, 0x00, 0x02, 0x21, 0x2B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61, + 0x03, 0x0A, 0x03, 0x01, 0x00, 0x02, 0x01, 0x06, 0x03, 0x27, 0x00, 0x02, 0x01, 0x07, 0x03, 0x27, + 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x01, + 0x00, 0x03, 0x00, 0x45, 0x03, 0x06, 0x03, 0x27, 0x00, 0x03, 0x00, 0x65, 0x03, 0x06, 0x03, 0x27, + 0x00, 0x02, 0x00, 0xCF, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEF, 0x03, 0x41, 0x00, 0x02, 0x21, 0x2A, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x4C, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x6C, 0x03, 0x23, + 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x52, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x72, 0x03, 0x23, + 0x03, 0x04, 0x00, 0x03, 0x00, 0x53, 0x03, 0x41, 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x41, + 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x07, 0x03, 0x23, 0x00, 0x03, 0x00, 0x73, 0x03, 0x07, + 0x03, 0x23, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, + 0x03, 0x23, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x00, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x23, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, + 0x03, 0x23, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, + 0x03, 0x23, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, + 0x03, 0x23, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x41, 0x00, 0x02, + 0x01, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x09, + 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, + 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, + 0x03, 0x23, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x41, + 0x00, 0x02, 0x01, 0xB0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x40, 0x00, 0x02, 0x01, 0xB0, + 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x09, + 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03, + 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, + 0x03, 0x23, 0x00, 0x01, 0x00, 0x4F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xEC, + 0x01, 0xED, 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, + 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x38, 0x1E, 0x39, + 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x5C, 0x1E, 0x5D, + 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0xA4, 0x1E, 0xA5, + 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, + 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC6, 0x1E, 0xC7, + 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, + 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, + 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, + 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x02, 0xDC, 0x00, 0x49, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, + 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE6, + 0x00, 0xEE, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, + 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, + 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA4, + 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC, 0x01, 0xE4, + 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, + 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, + 0x02, 0x6C, 0x02, 0x74, 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, + 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBC, 0x02, 0xC4, 0x02, 0xCC, 0x02, 0xD4, 0x00, 0x03, 0x00, 0x55, + 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, + 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, + 0x03, 0x28, 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x28, 0x03, 0x04, 0x00, 0x02, 0x21, 0x2B, + 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x43, 0x03, 0x01, + 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x01, 0x03, 0x27, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, + 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, + 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x45, 0x03, 0x27, + 0x03, 0x06, 0x00, 0x03, 0x00, 0x65, 0x03, 0x27, 0x03, 0x06, 0x00, 0x03, 0x00, 0x49, 0x03, 0x08, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x69, 0x03, 0x08, 0x03, 0x01, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, 0x03, 0x40, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x53, 0x03, 0x23, 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x23, 0x03, 0x07, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x40, + 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x61, 0x03, 0x23, 0x03, 0x02, + 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, 0x03, 0x40, + 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x06, 0x00, 0x03, 0x00, 0x61, 0x03, 0x23, 0x03, 0x06, + 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x40, + 0x00, 0x03, 0x00, 0x45, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x65, 0x03, 0x23, 0x03, 0x02, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x40, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x23, 0x03, 0x02, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x01, 0x03, 0x1B, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x00, 0x03, 0x1B, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x09, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x03, + 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x23, 0x03, 0x1B, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x01, 0x03, 0x1B, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x00, 0x03, 0x1B, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x09, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x03, + 0x00, 0x03, 0x00, 0x55, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x23, 0x03, 0x1B, + 0x00, 0x01, 0x00, 0x49, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xEC, 0x01, 0xED, + 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, + 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x50, + 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0xA4, + 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, + 0x1E, 0xB1, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC6, + 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, + 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, + 0x1E, 0xE3, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, + 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x00, 0x9C, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2C, + 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, + 0x00, 0x74, 0x00, 0x7C, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, + 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x0A, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x43, 0x03, 0x27, 0x03, 0x01, 0x00, 0x03, 0x00, 0x63, 0x03, 0x27, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x49, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x69, 0x03, 0x08, + 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, + 0x03, 0x00, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, + 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, + 0x03, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xFA, 0x1E, 0x08, 0x1E, 0x09, + 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9, + 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x74, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C, + 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, + 0x00, 0x03, 0x00, 0x41, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x43, 0x03, 0x27, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x63, 0x03, 0x27, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x40, + 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x41, + 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x40, + 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x01, 0x00, 0x0B, 0x01, 0xFA, 0x1E, 0x08, + 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, + 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x6A, 0x00, 0x0A, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32, + 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x03, 0x00, 0x43, + 0x03, 0x41, 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x41, 0x03, 0x27, 0x00, 0x03, 0x00, 0x4F, + 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, + 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, + 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, + 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x0A, + 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9, + 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x26, + 0x00, 0x02, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x0D, 0x4A, 0x00, 0x02, + 0x0D, 0x3E, 0x0D, 0x4C, 0x00, 0x02, 0x0D, 0x57, 0x00, 0x01, 0x00, 0x04, 0x0D, 0x4B, 0x00, 0x02, + 0x0D, 0x3E, 0x00, 0x01, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x47, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, + 0x0D, 0x46, 0x0D, 0x3E, 0x00, 0x02, 0x0D, 0x47, 0x0D, 0x3E, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x57, + 0x00, 0x01, 0x00, 0x03, 0x0D, 0x4A, 0x0D, 0x4B, 0x0D, 0x4C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x10, 0x26, + 0x00, 0x02, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x01, 0x10, 0x25, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x10, 0x25, 0x10, 0x2E, + 0x00, 0x01, 0x00, 0x01, 0x10, 0x26, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x22, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x0B, 0x4B, + 0x00, 0x02, 0x0B, 0x3E, 0x0B, 0x48, 0x00, 0x02, 0x0B, 0x56, 0x0B, 0x4C, 0x00, 0x02, 0x0B, 0x57, + 0x00, 0x01, 0x00, 0x01, 0x0B, 0x47, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x56, + 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x3E, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x57, 0x00, 0x01, 0x00, 0x03, + 0x0B, 0x48, 0x0B, 0x4B, 0x0B, 0x4C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x38, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x18, + 0x00, 0x1E, 0x0D, 0xDA, 0x00, 0x02, 0x0D, 0xCA, 0x0D, 0xDD, 0x00, 0x03, 0x0D, 0xCF, 0x0D, 0xCA, + 0x0D, 0xDC, 0x00, 0x02, 0x0D, 0xCF, 0x0D, 0xDE, 0x00, 0x02, 0x0D, 0xDF, 0x00, 0x01, 0x00, 0x04, + 0x0D, 0xDD, 0x00, 0x02, 0x0D, 0xCA, 0x00, 0x01, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xDC, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x3C, 0x00, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x0E, + 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xCA, 0x00, 0x02, 0x0D, 0xD9, + 0x0D, 0xCF, 0x00, 0x02, 0x0D, 0xDC, 0x0D, 0xCA, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xDF, 0x00, 0x01, + 0x00, 0x04, 0x0D, 0xDA, 0x0D, 0xDC, 0x0D, 0xDD, 0x0D, 0xDE, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x03, 0x0D, 0xD9, 0x0D, 0xCF, 0x0D, 0xCA, 0x00, 0x01, 0x00, 0x01, 0x0D, 0xDD, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x32, 0x00, 0x03, 0x00, 0x0C, + 0x00, 0x16, 0x00, 0x28, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x00, 0x02, 0x0B, 0xD7, 0x00, 0x02, + 0x00, 0x06, 0x00, 0x0C, 0x0B, 0xCA, 0x00, 0x02, 0x0B, 0xBE, 0x0B, 0xCC, 0x00, 0x02, 0x0B, 0xD7, + 0x00, 0x01, 0x00, 0x04, 0x0B, 0xCB, 0x00, 0x02, 0x0B, 0xBE, 0x00, 0x01, 0x00, 0x03, 0x0B, 0x92, + 0x0B, 0xC6, 0x0B, 0xC7, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x26, + 0x00, 0x04, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, 0x0B, 0x92, 0x0B, 0xD7, + 0x00, 0x02, 0x0B, 0xC6, 0x0B, 0xBE, 0x00, 0x02, 0x0B, 0xC7, 0x0B, 0xBE, 0x00, 0x02, 0x0B, 0xC6, + 0x0B, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x0B, 0xCA, 0x0B, 0xCB, 0x0B, 0xCC, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x04, 0x0C, 0x48, 0x00, 0x02, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, 0x0C, 0x46, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, + 0x0C, 0x46, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, 0x0C, 0x48, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x08, 0x00, 0x01, 0x00, 0x8A, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3A, + 0x00, 0x44, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, 0x00, 0x01, + 0x00, 0x04, 0x1B, 0x06, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x08, 0x00, 0x02, + 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x0A, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, + 0x1B, 0x0C, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x0E, 0x00, 0x02, 0x1B, 0x35, + 0x00, 0x01, 0x00, 0x04, 0x1B, 0x12, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x3B, + 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x3D, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, + 0x00, 0x04, 0x1B, 0x40, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x41, 0x00, 0x02, + 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x43, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x0B, + 0x1B, 0x05, 0x1B, 0x07, 0x1B, 0x09, 0x1B, 0x0B, 0x1B, 0x0D, 0x1B, 0x11, 0x1B, 0x3A, 0x1B, 0x3C, + 0x1B, 0x3E, 0x1B, 0x3F, 0x1B, 0x42, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, + 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, + 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x02, 0x1B, 0x05, 0x1B, 0x35, + 0x00, 0x02, 0x1B, 0x07, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x09, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x0B, + 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x0D, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x11, 0x1B, 0x35, 0x00, 0x02, + 0x1B, 0x3A, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x3C, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x3E, 0x1B, 0x35, + 0x00, 0x02, 0x1B, 0x3F, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x42, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x0B, + 0x1B, 0x06, 0x1B, 0x08, 0x1B, 0x0A, 0x1B, 0x0C, 0x1B, 0x0E, 0x1B, 0x12, 0x1B, 0x3B, 0x1B, 0x3D, + 0x1B, 0x40, 0x1B, 0x41, 0x1B, 0x43 +}; + +const le_uint8 CanonShaping::glyphDefinitionTable[] = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x28, + 0x06, 0x0B, 0x06, 0x0F, 0x00, 0x01, 0x06, 0x10, 0x06, 0x15, 0x00, 0x03, 0x06, 0x1B, 0x06, 0x1B, + 0x00, 0x01, 0x06, 0x1E, 0x06, 0x1F, 0x00, 0x01, 0x06, 0x21, 0x06, 0x21, 0x00, 0x01, 0x06, 0x22, + 0x06, 0x26, 0x00, 0x02, 0x06, 0x27, 0x06, 0x3A, 0x00, 0x01, 0x06, 0x40, 0x06, 0x4A, 0x00, 0x01, + 0x06, 0x4B, 0x06, 0x5E, 0x00, 0x03, 0x06, 0x60, 0x06, 0x6F, 0x00, 0x01, 0x06, 0x70, 0x06, 0x70, + 0x00, 0x03, 0x06, 0x71, 0x06, 0xBF, 0x00, 0x01, 0x06, 0xC0, 0x06, 0xC0, 0x00, 0x02, 0x06, 0xC1, + 0x06, 0xC1, 0x00, 0x01, 0x06, 0xC2, 0x06, 0xC2, 0x00, 0x02, 0x06, 0xC3, 0x06, 0xD2, 0x00, 0x01, + 0x06, 0xD3, 0x06, 0xD3, 0x00, 0x02, 0x06, 0xD4, 0x06, 0xD5, 0x00, 0x01, 0x06, 0xD6, 0x06, 0xDC, + 0x00, 0x03, 0x06, 0xDE, 0x06, 0xE4, 0x00, 0x03, 0x06, 0xE5, 0x06, 0xE6, 0x00, 0x01, 0x06, 0xE7, + 0x06, 0xE8, 0x00, 0x03, 0x06, 0xE9, 0x06, 0xE9, 0x00, 0x01, 0x06, 0xEA, 0x06, 0xED, 0x00, 0x03, + 0x06, 0xEE, 0x06, 0xFF, 0x00, 0x01, 0x07, 0x50, 0x07, 0x6D, 0x00, 0x01, 0xFB, 0x50, 0xFB, 0xB1, + 0x00, 0x01, 0xFB, 0xD3, 0xFB, 0xDC, 0x00, 0x01, 0xFB, 0xDD, 0xFB, 0xDD, 0x00, 0x02, 0xFB, 0xDE, + 0xFB, 0xE9, 0x00, 0x01, 0xFB, 0xEA, 0xFB, 0xFB, 0x00, 0x02, 0xFB, 0xFC, 0xFB, 0xFF, 0x00, 0x01, + 0xFC, 0x00, 0xFC, 0x5D, 0x00, 0x02, 0xFC, 0x64, 0xFC, 0xF1, 0x00, 0x02, 0xFC, 0xF5, 0xFD, 0x3D, + 0x00, 0x02, 0xFD, 0x50, 0xFD, 0x8F, 0x00, 0x02, 0xFD, 0x92, 0xFD, 0xC7, 0x00, 0x02, 0xFD, 0xF0, + 0xFD, 0xFC, 0x00, 0x02, 0xFE, 0x80, 0xFE, 0xF4, 0x00, 0x01, 0xFE, 0xF5, 0xFE, 0xFC, 0x00, 0x02, + 0x00, 0x02, 0x00, 0xCE, 0x03, 0x00, 0x03, 0x14, 0x00, 0xE6, 0x03, 0x15, 0x03, 0x15, 0x00, 0xE8, + 0x03, 0x16, 0x03, 0x19, 0x00, 0xDC, 0x03, 0x1A, 0x03, 0x1A, 0x00, 0xE8, 0x03, 0x1B, 0x03, 0x1B, + 0x00, 0xD8, 0x03, 0x1C, 0x03, 0x20, 0x00, 0xDC, 0x03, 0x21, 0x03, 0x22, 0x00, 0xCA, 0x03, 0x23, + 0x03, 0x26, 0x00, 0xDC, 0x03, 0x27, 0x03, 0x28, 0x00, 0xCA, 0x03, 0x29, 0x03, 0x33, 0x00, 0xDC, + 0x03, 0x34, 0x03, 0x38, 0x00, 0x01, 0x03, 0x39, 0x03, 0x3C, 0x00, 0xDC, 0x03, 0x3D, 0x03, 0x44, + 0x00, 0xE6, 0x03, 0x45, 0x03, 0x45, 0x00, 0xF0, 0x03, 0x46, 0x03, 0x46, 0x00, 0xE6, 0x03, 0x47, + 0x03, 0x49, 0x00, 0xDC, 0x03, 0x4A, 0x03, 0x4C, 0x00, 0xE6, 0x03, 0x4D, 0x03, 0x4E, 0x00, 0xDC, + 0x03, 0x50, 0x03, 0x52, 0x00, 0xE6, 0x03, 0x53, 0x03, 0x56, 0x00, 0xDC, 0x03, 0x57, 0x03, 0x57, + 0x00, 0xE6, 0x03, 0x58, 0x03, 0x58, 0x00, 0xE8, 0x03, 0x59, 0x03, 0x5A, 0x00, 0xDC, 0x03, 0x5B, + 0x03, 0x5B, 0x00, 0xE6, 0x03, 0x5C, 0x03, 0x5C, 0x00, 0xE9, 0x03, 0x5D, 0x03, 0x5E, 0x00, 0xEA, + 0x03, 0x5F, 0x03, 0x5F, 0x00, 0xE9, 0x03, 0x60, 0x03, 0x61, 0x00, 0xEA, 0x03, 0x62, 0x03, 0x62, + 0x00, 0xE9, 0x03, 0x63, 0x03, 0x6F, 0x00, 0xE6, 0x04, 0x83, 0x04, 0x86, 0x00, 0xE6, 0x05, 0x91, + 0x05, 0x91, 0x00, 0xDC, 0x05, 0x92, 0x05, 0x95, 0x00, 0xE6, 0x05, 0x96, 0x05, 0x96, 0x00, 0xDC, + 0x05, 0x97, 0x05, 0x98, 0x00, 0xE6, 0x05, 0x99, 0x05, 0x99, 0x00, 0xE8, 0x05, 0x9A, 0x05, 0x9A, + 0x00, 0xDE, 0x05, 0x9B, 0x05, 0x9B, 0x00, 0xDC, 0x05, 0x9C, 0x05, 0xA1, 0x00, 0xE6, 0x05, 0xA2, + 0x05, 0xA7, 0x00, 0xDC, 0x05, 0xA8, 0x05, 0xA8, 0x00, 0xE6, 0x05, 0xA9, 0x05, 0xA9, 0x00, 0xE8, + 0x05, 0xAA, 0x05, 0xAA, 0x00, 0xDC, 0x05, 0xAB, 0x05, 0xAC, 0x00, 0xE6, 0x05, 0xAD, 0x05, 0xAD, + 0x00, 0xDE, 0x05, 0xAE, 0x05, 0xAE, 0x00, 0xE8, 0x05, 0xAF, 0x05, 0xAF, 0x00, 0xE6, 0x05, 0xB0, + 0x05, 0xB8, 0x00, 0xDC, 0x05, 0xB9, 0x05, 0xB9, 0x00, 0x1B, 0x05, 0xBA, 0x05, 0xBA, 0x00, 0x13, + 0x05, 0xBB, 0x05, 0xBB, 0x00, 0xDC, 0x05, 0xBC, 0x05, 0xBC, 0x00, 0x15, 0x05, 0xBD, 0x05, 0xBD, + 0x00, 0xDC, 0x05, 0xBF, 0x05, 0xBF, 0x00, 0x17, 0x05, 0xC1, 0x05, 0xC1, 0x00, 0x0A, 0x05, 0xC2, + 0x05, 0xC2, 0x00, 0x0B, 0x05, 0xC4, 0x05, 0xC4, 0x00, 0xE6, 0x05, 0xC5, 0x05, 0xC5, 0x00, 0xDC, + 0x05, 0xC7, 0x05, 0xC7, 0x00, 0x12, 0x06, 0x10, 0x06, 0x15, 0x00, 0xE6, 0x06, 0x4B, 0x06, 0x4C, + 0x00, 0x1F, 0x06, 0x4D, 0x06, 0x4D, 0x00, 0x1E, 0x06, 0x4E, 0x06, 0x4F, 0x00, 0x1F, 0x06, 0x50, + 0x06, 0x50, 0x00, 0x1E, 0x06, 0x51, 0x06, 0x51, 0x00, 0x1C, 0x06, 0x52, 0x06, 0x52, 0x00, 0x1F, + 0x06, 0x53, 0x06, 0x53, 0x00, 0x20, 0x06, 0x54, 0x06, 0x55, 0x00, 0x1B, 0x06, 0x56, 0x06, 0x56, + 0x00, 0x1D, 0x06, 0x57, 0x06, 0x58, 0x00, 0x1F, 0x06, 0x59, 0x06, 0x5B, 0x00, 0xE6, 0x06, 0x5C, + 0x06, 0x5C, 0x00, 0xDC, 0x06, 0x5D, 0x06, 0x5E, 0x00, 0xE6, 0x06, 0x70, 0x06, 0x70, 0x00, 0x1D, + 0x06, 0xD6, 0x06, 0xDC, 0x00, 0xE6, 0x06, 0xDF, 0x06, 0xE0, 0x00, 0xE6, 0x06, 0xE1, 0x06, 0xE1, + 0x00, 0x1F, 0x06, 0xE2, 0x06, 0xE2, 0x00, 0xE6, 0x06, 0xE3, 0x06, 0xE3, 0x00, 0xDC, 0x06, 0xE4, + 0x06, 0xE4, 0x00, 0xE6, 0x06, 0xE7, 0x06, 0xE8, 0x00, 0xE6, 0x06, 0xEA, 0x06, 0xEA, 0x00, 0xDC, + 0x06, 0xEB, 0x06, 0xEC, 0x00, 0xE6, 0x06, 0xED, 0x06, 0xED, 0x00, 0xDC, 0x07, 0x11, 0x07, 0x11, + 0x00, 0x24, 0x07, 0x30, 0x07, 0x30, 0x00, 0xE6, 0x07, 0x31, 0x07, 0x31, 0x00, 0xDC, 0x07, 0x32, + 0x07, 0x33, 0x00, 0xE6, 0x07, 0x34, 0x07, 0x34, 0x00, 0xDC, 0x07, 0x35, 0x07, 0x36, 0x00, 0xE6, + 0x07, 0x37, 0x07, 0x39, 0x00, 0xDC, 0x07, 0x3A, 0x07, 0x3A, 0x00, 0xE6, 0x07, 0x3B, 0x07, 0x3C, + 0x00, 0xDC, 0x07, 0x3D, 0x07, 0x3D, 0x00, 0xE6, 0x07, 0x3E, 0x07, 0x3E, 0x00, 0xDC, 0x07, 0x3F, + 0x07, 0x41, 0x00, 0xE6, 0x07, 0x42, 0x07, 0x42, 0x00, 0xDC, 0x07, 0x43, 0x07, 0x43, 0x00, 0xE6, + 0x07, 0x44, 0x07, 0x44, 0x00, 0xDC, 0x07, 0x45, 0x07, 0x45, 0x00, 0xE6, 0x07, 0x46, 0x07, 0x46, + 0x00, 0xDC, 0x07, 0x47, 0x07, 0x47, 0x00, 0xE6, 0x07, 0x48, 0x07, 0x48, 0x00, 0xDC, 0x07, 0x49, + 0x07, 0x4A, 0x00, 0xE6, 0x07, 0xEB, 0x07, 0xF1, 0x00, 0xE6, 0x07, 0xF2, 0x07, 0xF2, 0x00, 0xDC, + 0x07, 0xF3, 0x07, 0xF3, 0x00, 0xE6, 0x09, 0x3C, 0x09, 0x3C, 0x00, 0x07, 0x09, 0x4D, 0x09, 0x4D, + 0x00, 0x09, 0x09, 0x51, 0x09, 0x51, 0x00, 0xE6, 0x09, 0x52, 0x09, 0x52, 0x00, 0xDC, 0x09, 0x53, + 0x09, 0x54, 0x00, 0xE6, 0x09, 0xBC, 0x09, 0xBC, 0x00, 0x07, 0x09, 0xCD, 0x09, 0xCD, 0x00, 0x09, + 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x07, 0x0A, 0x4D, 0x0A, 0x4D, 0x00, 0x09, 0x0A, 0xBC, 0x0A, 0xBC, + 0x00, 0x07, 0x0A, 0xCD, 0x0A, 0xCD, 0x00, 0x09, 0x0B, 0x3C, 0x0B, 0x3C, 0x00, 0x07, 0x0B, 0x4D, + 0x0B, 0x4D, 0x00, 0x09, 0x0B, 0xCD, 0x0B, 0xCD, 0x00, 0x09, 0x0C, 0x4D, 0x0C, 0x4D, 0x00, 0x09, + 0x0C, 0x55, 0x0C, 0x55, 0x00, 0x54, 0x0C, 0x56, 0x0C, 0x56, 0x00, 0x5B, 0x0C, 0xBC, 0x0C, 0xBC, + 0x00, 0x07, 0x0C, 0xCD, 0x0C, 0xCD, 0x00, 0x09, 0x0D, 0x4D, 0x0D, 0x4D, 0x00, 0x09, 0x0D, 0xCA, + 0x0D, 0xCA, 0x00, 0x09, 0x0E, 0x38, 0x0E, 0x39, 0x00, 0x67, 0x0E, 0x3A, 0x0E, 0x3A, 0x00, 0x09, + 0x0E, 0x48, 0x0E, 0x4B, 0x00, 0x6B, 0x0E, 0xB8, 0x0E, 0xB9, 0x00, 0x76, 0x0E, 0xC8, 0x0E, 0xCB, + 0x00, 0x7A, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0xDC, 0x0F, 0x35, 0x0F, 0x35, 0x00, 0xDC, 0x0F, 0x37, + 0x0F, 0x37, 0x00, 0xDC, 0x0F, 0x39, 0x0F, 0x39, 0x00, 0xD8, 0x0F, 0x71, 0x0F, 0x71, 0x00, 0x81, + 0x0F, 0x72, 0x0F, 0x72, 0x00, 0x82, 0x0F, 0x74, 0x0F, 0x74, 0x00, 0x84, 0x0F, 0x7A, 0x0F, 0x7D, + 0x00, 0x82, 0x0F, 0x80, 0x0F, 0x80, 0x00, 0x82, 0x0F, 0x82, 0x0F, 0x83, 0x00, 0xE6, 0x0F, 0x84, + 0x0F, 0x84, 0x00, 0x09, 0x0F, 0x86, 0x0F, 0x87, 0x00, 0xE6, 0x0F, 0xC6, 0x0F, 0xC6, 0x00, 0xDC, + 0x10, 0x37, 0x10, 0x37, 0x00, 0x07, 0x10, 0x39, 0x10, 0x39, 0x00, 0x09, 0x13, 0x5F, 0x13, 0x5F, + 0x00, 0xE6, 0x17, 0x14, 0x17, 0x14, 0x00, 0x09, 0x17, 0x34, 0x17, 0x34, 0x00, 0x09, 0x17, 0xD2, + 0x17, 0xD2, 0x00, 0x09, 0x17, 0xDD, 0x17, 0xDD, 0x00, 0xE6, 0x18, 0xA9, 0x18, 0xA9, 0x00, 0xE4, + 0x19, 0x39, 0x19, 0x39, 0x00, 0xDE, 0x19, 0x3A, 0x19, 0x3A, 0x00, 0xE6, 0x19, 0x3B, 0x19, 0x3B, + 0x00, 0xDC, 0x1A, 0x17, 0x1A, 0x17, 0x00, 0xE6, 0x1A, 0x18, 0x1A, 0x18, 0x00, 0xDC, 0x1B, 0x34, + 0x1B, 0x34, 0x00, 0x07, 0x1B, 0x44, 0x1B, 0x44, 0x00, 0x09, 0x1B, 0x6B, 0x1B, 0x6B, 0x00, 0xE6, + 0x1B, 0x6C, 0x1B, 0x6C, 0x00, 0xDC, 0x1B, 0x6D, 0x1B, 0x73, 0x00, 0xE6, 0x1D, 0xC0, 0x1D, 0xC1, + 0x00, 0xE6, 0x1D, 0xC2, 0x1D, 0xC2, 0x00, 0xDC, 0x1D, 0xC3, 0x1D, 0xC9, 0x00, 0xE6, 0x1D, 0xCA, + 0x1D, 0xCA, 0x00, 0xDC, 0x1D, 0xFE, 0x1D, 0xFE, 0x00, 0xE6, 0x1D, 0xFF, 0x1D, 0xFF, 0x00, 0xDC, + 0x20, 0xD0, 0x20, 0xD1, 0x00, 0xE6, 0x20, 0xD2, 0x20, 0xD3, 0x00, 0x01, 0x20, 0xD4, 0x20, 0xD7, + 0x00, 0xE6, 0x20, 0xD8, 0x20, 0xDA, 0x00, 0x01, 0x20, 0xDB, 0x20, 0xDC, 0x00, 0xE6, 0x20, 0xE1, + 0x20, 0xE1, 0x00, 0xE6, 0x20, 0xE5, 0x20, 0xE6, 0x00, 0x01, 0x20, 0xE7, 0x20, 0xE7, 0x00, 0xE6, + 0x20, 0xE8, 0x20, 0xE8, 0x00, 0xDC, 0x20, 0xE9, 0x20, 0xE9, 0x00, 0xE6, 0x20, 0xEA, 0x20, 0xEB, + 0x00, 0x01, 0x20, 0xEC, 0x20, 0xEF, 0x00, 0xDC, 0x30, 0x2A, 0x30, 0x2A, 0x00, 0xDA, 0x30, 0x2B, + 0x30, 0x2B, 0x00, 0xE4, 0x30, 0x2C, 0x30, 0x2C, 0x00, 0xE8, 0x30, 0x2D, 0x30, 0x2D, 0x00, 0xDE, + 0x30, 0x2E, 0x30, 0x2F, 0x00, 0xE0, 0x30, 0x99, 0x30, 0x9A, 0x00, 0x08, 0xA8, 0x06, 0xA8, 0x06, + 0x00, 0x09, 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x1A, 0xFE, 0x20, 0xFE, 0x23, 0x00, 0xE6, 0x0A, 0x0D, + 0x0A, 0x0D, 0x00, 0xDC, 0x0A, 0x0F, 0x0A, 0x0F, 0x00, 0xE6, 0x0A, 0x38, 0x0A, 0x38, 0x00, 0xE6, + 0x0A, 0x39, 0x0A, 0x39, 0x00, 0x01, 0x0A, 0x3A, 0x0A, 0x3A, 0x00, 0xDC, 0x0A, 0x3F, 0x0A, 0x3F, + 0x00, 0x09, 0xD1, 0x65, 0xD1, 0x66, 0x00, 0xD8, 0xD1, 0x67, 0xD1, 0x69, 0x00, 0x01, 0xD1, 0x6D, + 0xD1, 0x6D, 0x00, 0xE2, 0xD1, 0x6E, 0xD1, 0x72, 0x00, 0xD8, 0xD1, 0x7B, 0xD1, 0x82, 0x00, 0xDC, + 0xD1, 0x85, 0xD1, 0x89, 0x00, 0xE6, 0xD1, 0x8A, 0xD1, 0x8B, 0x00, 0xDC, 0xD1, 0xAA, 0xD1, 0xAD, + 0x00, 0xE6, 0xD2, 0x42, 0xD2, 0x44, 0x00, 0xE6 +}; + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/CanonShaping.cpp b/Build/source/libs/icu/icu-50.1/layout/CanonShaping.cpp new file mode 100644 index 00000000000..ea109a77d98 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/CanonShaping.cpp @@ -0,0 +1,81 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphStorage.h" +#include "CanonShaping.h" +#include "GlyphDefinitionTables.h" +#include "ClassDefinitionTables.h" + +U_NAMESPACE_BEGIN + +void CanonShaping::sortMarks(le_int32 *indices, const le_int32 *combiningClasses, le_int32 index, le_int32 limit) +{ + for (le_int32 j = index + 1; j < limit; j += 1) { + le_int32 i; + le_int32 v = indices[j]; + le_int32 c = combiningClasses[v]; + + for (i = j - 1; i >= index; i -= 1) { + if (c >= combiningClasses[indices[i]]) { + break; + } + + indices[i + 1] = indices[i]; + } + + indices[i + 1] = v; + } +} + +void CanonShaping::reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft, + LEUnicode *outChars, LEGlyphStorage &glyphStorage) +{ + const GlyphDefinitionTableHeader *gdefTable = (const GlyphDefinitionTableHeader *) glyphDefinitionTable; + const ClassDefinitionTable *classTable = gdefTable->getMarkAttachClassDefinitionTable(); + le_int32 *combiningClasses = LE_NEW_ARRAY(le_int32, charCount); + le_int32 *indices = LE_NEW_ARRAY(le_int32, charCount); + LEErrorCode status = LE_NO_ERROR; + le_int32 i; + + for (i = 0; i < charCount; i += 1) { + combiningClasses[i] = classTable->getGlyphClass((LEGlyphID) inChars[i]); + indices[i] = i; + } + + for (i = 0; i < charCount; i += 1) { + if (combiningClasses[i] != 0) { + le_int32 mark; + + for (mark = i; mark < charCount; mark += 1) { + if (combiningClasses[mark] == 0) { + break; + } + } + + sortMarks(indices, combiningClasses, i, mark); + } + } + + le_int32 out = 0, dir = 1; + + if (rightToLeft) { + out = charCount - 1; + dir = -1; + } + + for (i = 0; i < charCount; i += 1, out += dir) { + le_int32 index = indices[i]; + + outChars[i] = inChars[index]; + glyphStorage.setCharIndex(out, index, status); + } + + LE_DELETE_ARRAY(indices); + LE_DELETE_ARRAY(combiningClasses); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/CanonShaping.h b/Build/source/libs/icu/icu-50.1/layout/CanonShaping.h new file mode 100644 index 00000000000..cdf19595b59 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/CanonShaping.h @@ -0,0 +1,30 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2006 - All Rights Reserved + * + */ + +#ifndef __CANONSHAPING_H +#define __CANONSHAPING_H + +#include "LETypes.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class U_LAYOUT_API CanonShaping /* not : public UObject because all members are static */ +{ +public: + static const le_uint8 glyphSubstitutionTable[]; + static const le_uint8 glyphDefinitionTable[]; + + static void reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft, + LEUnicode *outChars, LEGlyphStorage &glyphStorage); + +private: + static void sortMarks(le_int32 *indices, const le_int32 *combiningClasses, le_int32 index, le_int32 limit); +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/CharSubstitutionFilter.h b/Build/source/libs/icu/icu-50.1/layout/CharSubstitutionFilter.h new file mode 100644 index 00000000000..780e8ad2cdf --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/CharSubstitutionFilter.h @@ -0,0 +1,81 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __CHARSUBSTITUTIONFILTER_H +#define __CHARSUBSTITUTIONFILTER_H + +#include "LETypes.h" +#include "LEGlyphFilter.h" + +U_NAMESPACE_BEGIN + +class LEFontInstance; + +/** + * This filter is used by character-based GSUB processors. It + * accepts only those characters which the given font can display. + * + * @internal + */ +class CharSubstitutionFilter : public UMemory, public LEGlyphFilter +{ +private: + /** + * Holds the font which is used to test the characters. + * + * @internal + */ + const LEFontInstance *fFontInstance; + + /** + * The copy constructor. Not allowed! + * + * @internal + */ + CharSubstitutionFilter(const CharSubstitutionFilter &other); // forbid copying of this class + + /** + * The replacement operator. Not allowed! + * + * @internal + */ + CharSubstitutionFilter &operator=(const CharSubstitutionFilter &other); // forbid copying of this class + +public: + /** + * The constructor. + * + * @param fontInstance - the font to use to test the characters. + * + * @internal + */ + CharSubstitutionFilter(const LEFontInstance *fontInstance); + + /** + * The destructor. + * + * @internal + */ + ~CharSubstitutionFilter(); + + /** + * This method is used to test if a particular + * character can be displayed by the filter's + * font. + * + * @param glyph - the Unicode character code to be tested + * + * @return TRUE if the filter's font can display this character. + * + * @internal + */ + le_bool accept(LEGlyphID glyph) const; +}; + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/ClassDefinitionTables.cpp b/Build/source/libs/icu/icu-50.1/layout/ClassDefinitionTables.cpp new file mode 100644 index 00000000000..471a2b3e1b2 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ClassDefinitionTables.cpp @@ -0,0 +1,120 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "OpenTypeUtilities.h" +#include "ClassDefinitionTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_int32 ClassDefinitionTable::getGlyphClass(LEGlyphID glyphID) const +{ + switch(SWAPW(classFormat)) { + case 0: + return 0; + + case 1: + { + const ClassDefFormat1Table *f1Table = (const ClassDefFormat1Table *) this; + + return f1Table->getGlyphClass(glyphID); + } + + case 2: + { + const ClassDefFormat2Table *f2Table = (const ClassDefFormat2Table *) this; + + return f2Table->getGlyphClass(glyphID); + } + + default: + return 0; + } +} + +le_bool ClassDefinitionTable::hasGlyphClass(le_int32 glyphClass) const +{ + switch(SWAPW(classFormat)) { + case 0: + return 0; + + case 1: + { + const ClassDefFormat1Table *f1Table = (const ClassDefFormat1Table *) this; + + return f1Table->hasGlyphClass(glyphClass); + } + + case 2: + { + const ClassDefFormat2Table *f2Table = (const ClassDefFormat2Table *) this; + + return f2Table->hasGlyphClass(glyphClass); + } + + default: + return 0; + } +} + +le_int32 ClassDefFormat1Table::getGlyphClass(LEGlyphID glyphID) const +{ + TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); + TTGlyphID firstGlyph = SWAPW(startGlyph); + TTGlyphID lastGlyph = firstGlyph + SWAPW(glyphCount); + + if (ttGlyphID >= firstGlyph && ttGlyphID < lastGlyph) { + return SWAPW(classValueArray[ttGlyphID - firstGlyph]); + } + + return 0; +} + +le_bool ClassDefFormat1Table::hasGlyphClass(le_int32 glyphClass) const +{ + le_uint16 count = SWAPW(glyphCount); + int i; + + for (i = 0; i < count; i += 1) { + if (SWAPW(classValueArray[i]) == glyphClass) { + return TRUE; + } + } + + return FALSE; +} + +le_int32 ClassDefFormat2Table::getGlyphClass(LEGlyphID glyphID) const +{ + TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyphID); + le_uint16 rangeCount = SWAPW(classRangeCount); + le_int32 rangeIndex = + OpenTypeUtilities::getGlyphRangeIndex(ttGlyph, classRangeRecordArray, rangeCount); + + if (rangeIndex < 0) { + return 0; + } + + return SWAPW(classRangeRecordArray[rangeIndex].rangeValue); +} + +le_bool ClassDefFormat2Table::hasGlyphClass(le_int32 glyphClass) const +{ + le_uint16 rangeCount = SWAPW(classRangeCount); + int i; + + for (i = 0; i < rangeCount; i += 1) { + if (SWAPW(classRangeRecordArray[i].rangeValue) == glyphClass) { + return TRUE; + } + } + + return FALSE; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/ClassDefinitionTables.h b/Build/source/libs/icu/icu-50.1/layout/ClassDefinitionTables.h new file mode 100644 index 00000000000..3dfe86e61a5 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ClassDefinitionTables.h @@ -0,0 +1,55 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __CLASSDEFINITIONTABLES_H +#define __CLASSDEFINITIONTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +struct ClassDefinitionTable +{ + le_uint16 classFormat; + + le_int32 getGlyphClass(LEGlyphID glyphID) const; + le_bool hasGlyphClass(le_int32 glyphClass) const; +}; + +struct ClassDefFormat1Table : ClassDefinitionTable +{ + TTGlyphID startGlyph; + le_uint16 glyphCount; + le_uint16 classValueArray[ANY_NUMBER]; + + le_int32 getGlyphClass(LEGlyphID glyphID) const; + le_bool hasGlyphClass(le_int32 glyphClass) const; +}; + +struct ClassRangeRecord +{ + TTGlyphID start; + TTGlyphID end; + le_uint16 classValue; +}; + +struct ClassDefFormat2Table : ClassDefinitionTable +{ + le_uint16 classRangeCount; + GlyphRangeRecord classRangeRecordArray[ANY_NUMBER]; + + le_int32 getGlyphClass(LEGlyphID glyphID) const; + le_bool hasGlyphClass(le_int32 glyphClass) const; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphInsertion.h b/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphInsertion.h new file mode 100644 index 00000000000..ead88425ddc --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphInsertion.h @@ -0,0 +1,46 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __CONTEXTUALGLYPHINSERTION_H +#define __CONTEXTUALGLYPHINSERTION_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LayoutTables.h" +#include "StateTables.h" +#include "MorphTables.h" +#include "MorphStateTables.h" + +U_NAMESPACE_BEGIN + +struct ContextualGlyphInsertionHeader : MorphStateTableHeader +{ +}; + +enum ContextualGlyphInsertionFlags +{ + cgiSetMark = 0x8000, + cgiDontAdvance = 0x4000, + cgiCurrentIsKashidaLike = 0x2000, + cgiMarkedIsKashidaLike = 0x1000, + cgiCurrentInsertBefore = 0x0800, + cgiMarkInsertBefore = 0x0400, + cgiCurrentInsertCountMask = 0x03E0, + cgiMarkedInsertCountMask = 0x001F +}; + +struct LigatureSubstitutionStateEntry : StateEntry +{ + ByteOffset currentInsertionListOffset; + ByteOffset markedInsertionListOffset; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphSubstProc.cpp b/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphSubstProc.cpp new file mode 100644 index 00000000000..94c4a60b075 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphSubstProc.cpp @@ -0,0 +1,79 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "StateTables.h" +#include "MorphStateTables.h" +#include "SubtableProcessor.h" +#include "StateTableProcessor.h" +#include "ContextualGlyphSubstProc.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ContextualGlyphSubstitutionProcessor) + +ContextualGlyphSubstitutionProcessor::ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) + : StateTableProcessor(morphSubtableHeader) +{ + contextualGlyphSubstitutionHeader = (const ContextualGlyphSubstitutionHeader *) morphSubtableHeader; + substitutionTableOffset = SWAPW(contextualGlyphSubstitutionHeader->substitutionTableOffset); + + entryTable = (const ContextualGlyphSubstitutionStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset); +} + +ContextualGlyphSubstitutionProcessor::~ContextualGlyphSubstitutionProcessor() +{ +} + +void ContextualGlyphSubstitutionProcessor::beginStateTable() +{ + markGlyph = 0; +} + +ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) +{ + const ContextualGlyphSubstitutionStateEntry *entry = &entryTable[index]; + ByteOffset newState = SWAPW(entry->newStateOffset); + le_int16 flags = SWAPW(entry->flags); + WordOffset markOffset = SWAPW(entry->markOffset); + WordOffset currOffset = SWAPW(entry->currOffset); + + if (markOffset != 0) { + const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + markOffset * 2); + LEGlyphID mGlyph = glyphStorage[markGlyph]; + TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(mGlyph)]); + + glyphStorage[markGlyph] = LE_SET_GLYPH(mGlyph, newGlyph); + } + + if (currOffset != 0) { + const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + currOffset * 2); + LEGlyphID thisGlyph = glyphStorage[currGlyph]; + TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(thisGlyph)]); + + glyphStorage[currGlyph] = LE_SET_GLYPH(thisGlyph, newGlyph); + } + + if (flags & cgsSetMark) { + markGlyph = currGlyph; + } + + if (!(flags & cgsDontAdvance)) { + // should handle reverse too! + currGlyph += 1; + } + + return newState; +} + +void ContextualGlyphSubstitutionProcessor::endStateTable() +{ +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphSubstProc.h b/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphSubstProc.h new file mode 100644 index 00000000000..b0c5a6b38c3 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphSubstProc.h @@ -0,0 +1,65 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __CONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H +#define __CONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "StateTableProcessor.h" +#include "ContextualGlyphSubstitution.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class ContextualGlyphSubstitutionProcessor : public StateTableProcessor +{ +public: + virtual void beginStateTable(); + + virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index); + + virtual void endStateTable(); + + ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader); + virtual ~ContextualGlyphSubstitutionProcessor(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +private: + ContextualGlyphSubstitutionProcessor(); + +protected: + ByteOffset substitutionTableOffset; + const ContextualGlyphSubstitutionStateEntry *entryTable; + + le_int32 markGlyph; + + const ContextualGlyphSubstitutionHeader *contextualGlyphSubstitutionHeader; + +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphSubstitution.h b/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphSubstitution.h new file mode 100644 index 00000000000..72c23559db9 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ContextualGlyphSubstitution.h @@ -0,0 +1,41 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __CONTEXTUALGLYPHSUBSTITUTION_H +#define __CONTEXTUALGLYPHSUBSTITUTION_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LayoutTables.h" +#include "StateTables.h" +#include "MorphTables.h" + +U_NAMESPACE_BEGIN + +struct ContextualGlyphSubstitutionHeader : MorphStateTableHeader +{ + ByteOffset substitutionTableOffset; +}; + +enum ContextualGlyphSubstitutionFlags +{ + cgsSetMark = 0x8000, + cgsDontAdvance = 0x4000, + cgsReserved = 0x3FFF +}; + +struct ContextualGlyphSubstitutionStateEntry : StateEntry +{ + WordOffset markOffset; + WordOffset currOffset; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/ContextualSubstSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/ContextualSubstSubtables.cpp new file mode 100644 index 00000000000..b75e388807a --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ContextualSubstSubtables.cpp @@ -0,0 +1,569 @@ +/* + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "ContextualSubstSubtables.h" +#include "GlyphIterator.h" +#include "LookupProcessor.h" +#include "CoverageTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +/* + NOTE: This could be optimized somewhat by keeping track + of the previous sequenceIndex in the loop and doing next() + or prev() of the delta between that and the current + sequenceIndex instead of always resetting to the front. +*/ +void ContextualSubstitutionBase::applySubstitutionLookups( + const LookupProcessor *lookupProcessor, + const SubstitutionLookupRecord *substLookupRecordArray, + le_uint16 substCount, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + le_int32 position, + LEErrorCode& success) +{ + if (LE_FAILURE(success)) { + return; + } + + GlyphIterator tempIterator(*glyphIterator); + + for (le_int16 subst = 0; subst < substCount && LE_SUCCESS(success); subst += 1) { + le_uint16 sequenceIndex = SWAPW(substLookupRecordArray[subst].sequenceIndex); + le_uint16 lookupListIndex = SWAPW(substLookupRecordArray[subst].lookupListIndex); + + tempIterator.setCurrStreamPosition(position); + tempIterator.next(sequenceIndex); + + lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance, success); + } +} + +le_bool ContextualSubstitutionBase::matchGlyphIDs(const TTGlyphID *glyphArray, le_uint16 glyphCount, + GlyphIterator *glyphIterator, le_bool backtrack) +{ + le_int32 direction = 1; + le_int32 match = 0; + + if (backtrack) { + match = glyphCount -1; + direction = -1; + } + + while (glyphCount > 0) { + if (! glyphIterator->next()) { + return FALSE; + } + + TTGlyphID glyph = (TTGlyphID) glyphIterator->getCurrGlyphID(); + + if (glyph != SWAPW(glyphArray[match])) { + return FALSE; + } + + glyphCount -= 1; + match += direction; + } + + return TRUE; +} + +le_bool ContextualSubstitutionBase::matchGlyphClasses(const le_uint16 *classArray, le_uint16 glyphCount, + GlyphIterator *glyphIterator, + const ClassDefinitionTable *classDefinitionTable, + le_bool backtrack) +{ + le_int32 direction = 1; + le_int32 match = 0; + + if (backtrack) { + match = glyphCount - 1; + direction = -1; + } + + while (glyphCount > 0) { + if (! glyphIterator->next()) { + return FALSE; + } + + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 glyphClass = classDefinitionTable->getGlyphClass(glyph); + le_int32 matchClass = SWAPW(classArray[match]); + + if (glyphClass != matchClass) { + // Some fonts, e.g. Traditional Arabic, have classes + // in the class array which aren't in the class definition + // table. If we're looking for such a class, pretend that + // we found it. + if (classDefinitionTable->hasGlyphClass(matchClass)) { + return FALSE; + } + } + + glyphCount -= 1; + match += direction; + } + + return TRUE; +} + +le_bool ContextualSubstitutionBase::matchGlyphCoverages(const Offset *coverageTableOffsetArray, le_uint16 glyphCount, + GlyphIterator *glyphIterator, const char *offsetBase, le_bool backtrack) +{ + le_int32 direction = 1; + le_int32 glyph = 0; + + if (backtrack) { + glyph = glyphCount - 1; + direction = -1; + } + + while (glyphCount > 0) { + Offset coverageTableOffset = SWAPW(coverageTableOffsetArray[glyph]); + const CoverageTable *coverageTable = (const CoverageTable *) (offsetBase + coverageTableOffset); + + if (! glyphIterator->next()) { + return FALSE; + } + + if (coverageTable->getGlyphCoverage((LEGlyphID) glyphIterator->getCurrGlyphID()) < 0) { + return FALSE; + } + + glyphCount -= 1; + glyph += direction; + } + + return TRUE; +} + +le_uint32 ContextualSubstitutionSubtable::process(const LookupProcessor *lookupProcessor, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + switch(SWAPW(subtableFormat)) + { + case 0: + return 0; + + case 1: + { + const ContextualSubstitutionFormat1Subtable *subtable = (const ContextualSubstitutionFormat1Subtable *) this; + return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + case 2: + { + const ContextualSubstitutionFormat2Subtable *subtable = (const ContextualSubstitutionFormat2Subtable *) this; + return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + case 3: + { + const ContextualSubstitutionFormat3Subtable *subtable = (const ContextualSubstitutionFormat3Subtable *) this; + return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + default: + return 0; + } +} + +le_uint32 ContextualSubstitutionFormat1Subtable::process(const LookupProcessor *lookupProcessor, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + le_uint16 srSetCount = SWAPW(subRuleSetCount); + + if (coverageIndex < srSetCount) { + Offset subRuleSetTableOffset = SWAPW(subRuleSetTableOffsetArray[coverageIndex]); + const SubRuleSetTable *subRuleSetTable = + (const SubRuleSetTable *) ((char *) this + subRuleSetTableOffset); + le_uint16 subRuleCount = SWAPW(subRuleSetTable->subRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + + for (le_uint16 subRule = 0; subRule < subRuleCount; subRule += 1) { + Offset subRuleTableOffset = + SWAPW(subRuleSetTable->subRuleTableOffsetArray[subRule]); + const SubRuleTable *subRuleTable = + (const SubRuleTable *) ((char *) subRuleSetTable + subRuleTableOffset); + le_uint16 matchCount = SWAPW(subRuleTable->glyphCount) - 1; + le_uint16 substCount = SWAPW(subRuleTable->substCount); + + if (matchGlyphIDs(subRuleTable->inputGlyphArray, matchCount, glyphIterator)) { + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &subRuleTable->inputGlyphArray[matchCount]; + + applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); + + return matchCount + 1; + } + + glyphIterator->setCurrStreamPosition(position); + } + } + + // XXX If we get here, the table is mal-formed... + } + + return 0; +} + +le_uint32 ContextualSubstitutionFormat2Subtable::process(const LookupProcessor *lookupProcessor, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + const ClassDefinitionTable *classDefinitionTable = + (const ClassDefinitionTable *) ((char *) this + SWAPW(classDefTableOffset)); + le_uint16 scSetCount = SWAPW(subClassSetCount); + le_int32 setClass = classDefinitionTable->getGlyphClass(glyphIterator->getCurrGlyphID()); + + if (setClass < scSetCount && subClassSetTableOffsetArray[setClass] != 0) { + Offset subClassSetTableOffset = SWAPW(subClassSetTableOffsetArray[setClass]); + const SubClassSetTable *subClassSetTable = + (const SubClassSetTable *) ((char *) this + subClassSetTableOffset); + le_uint16 subClassRuleCount = SWAPW(subClassSetTable->subClassRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + + for (le_uint16 scRule = 0; scRule < subClassRuleCount; scRule += 1) { + Offset subClassRuleTableOffset = + SWAPW(subClassSetTable->subClassRuleTableOffsetArray[scRule]); + const SubClassRuleTable *subClassRuleTable = + (const SubClassRuleTable *) ((char *) subClassSetTable + subClassRuleTableOffset); + le_uint16 matchCount = SWAPW(subClassRuleTable->glyphCount) - 1; + le_uint16 substCount = SWAPW(subClassRuleTable->substCount); + + if (matchGlyphClasses(subClassRuleTable->classArray, matchCount, glyphIterator, classDefinitionTable)) { + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &subClassRuleTable->classArray[matchCount]; + + applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); + + return matchCount + 1; + } + + glyphIterator->setCurrStreamPosition(position); + } + } + + // XXX If we get here, the table is mal-formed... + } + + return 0; +} + +le_uint32 ContextualSubstitutionFormat3Subtable::process(const LookupProcessor *lookupProcessor, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + LEErrorCode& success)const +{ + if (LE_FAILURE(success)) { + return 0; + } + + le_uint16 gCount = SWAPW(glyphCount); + le_uint16 subCount = SWAPW(substCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + + // Back up the glyph iterator so that we + // can call next() before the check, which + // will leave it pointing at the last glyph + // that matched when we're done. + glyphIterator->prev(); + + if (ContextualSubstitutionBase::matchGlyphCoverages(coverageTableOffsetArray, gCount, glyphIterator, (const char *) this)) { + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &coverageTableOffsetArray[gCount]; + + ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, subCount, glyphIterator, fontInstance, position, success); + + return gCount + 1; + } + + glyphIterator->setCurrStreamPosition(position); + + return 0; +} + +le_uint32 ChainingContextualSubstitutionSubtable::process(const LookupProcessor *lookupProcessor, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + switch(SWAPW(subtableFormat)) + { + case 0: + return 0; + + case 1: + { + const ChainingContextualSubstitutionFormat1Subtable *subtable = (const ChainingContextualSubstitutionFormat1Subtable *) this; + return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + case 2: + { + const ChainingContextualSubstitutionFormat2Subtable *subtable = (const ChainingContextualSubstitutionFormat2Subtable *) this; + return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + case 3: + { + const ChainingContextualSubstitutionFormat3Subtable *subtable = (const ChainingContextualSubstitutionFormat3Subtable *) this; + return subtable->process(lookupProcessor, glyphIterator, fontInstance, success); + } + + default: + return 0; + } +} + +// NOTE: This could be a #define, but that seems to confuse +// the Visual Studio .NET 2003 compiler on the calls to the +// GlyphIterator constructor. It somehow can't decide if +// emptyFeatureList matches an le_uint32 or an le_uint16... +static const FeatureMask emptyFeatureList = 0x00000000UL; + +le_uint32 ChainingContextualSubstitutionFormat1Subtable::process(const LookupProcessor *lookupProcessor, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + le_uint16 srSetCount = SWAPW(chainSubRuleSetCount); + + if (coverageIndex < srSetCount) { + Offset chainSubRuleSetTableOffset = SWAPW(chainSubRuleSetTableOffsetArray[coverageIndex]); + const ChainSubRuleSetTable *chainSubRuleSetTable = + (const ChainSubRuleSetTable *) ((char *) this + chainSubRuleSetTableOffset); + le_uint16 chainSubRuleCount = SWAPW(chainSubRuleSetTable->chainSubRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); + + for (le_uint16 subRule = 0; subRule < chainSubRuleCount; subRule += 1) { + Offset chainSubRuleTableOffset = + SWAPW(chainSubRuleSetTable->chainSubRuleTableOffsetArray[subRule]); + const ChainSubRuleTable *chainSubRuleTable = + (const ChainSubRuleTable *) ((char *) chainSubRuleSetTable + chainSubRuleTableOffset); + le_uint16 backtrackGlyphCount = SWAPW(chainSubRuleTable->backtrackGlyphCount); + le_uint16 inputGlyphCount = (le_uint16) SWAPW(chainSubRuleTable->backtrackGlyphArray[backtrackGlyphCount]) - 1; + const TTGlyphID *inputGlyphArray = &chainSubRuleTable->backtrackGlyphArray[backtrackGlyphCount + 1]; + le_uint16 lookaheadGlyphCount = (le_uint16) SWAPW(inputGlyphArray[inputGlyphCount]); + const TTGlyphID *lookaheadGlyphArray = &inputGlyphArray[inputGlyphCount + 1]; + le_uint16 substCount = (le_uint16) SWAPW(lookaheadGlyphArray[lookaheadGlyphCount]); + + tempIterator.setCurrStreamPosition(position); + + if (! tempIterator.prev(backtrackGlyphCount)) { + continue; + } + + tempIterator.prev(); + if (! matchGlyphIDs(chainSubRuleTable->backtrackGlyphArray, backtrackGlyphCount, &tempIterator, TRUE)) { + continue; + } + + tempIterator.setCurrStreamPosition(position); + tempIterator.next(inputGlyphCount); + if (!matchGlyphIDs(lookaheadGlyphArray, lookaheadGlyphCount, &tempIterator)) { + continue; + } + + if (matchGlyphIDs(inputGlyphArray, inputGlyphCount, glyphIterator)) { + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &lookaheadGlyphArray[lookaheadGlyphCount + 1]; + + applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); + + return inputGlyphCount + 1; + } + + glyphIterator->setCurrStreamPosition(position); + } + } + + // XXX If we get here, the table is mal-formed... + } + + return 0; +} + +le_uint32 ChainingContextualSubstitutionFormat2Subtable::process(const LookupProcessor *lookupProcessor, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + const ClassDefinitionTable *backtrackClassDefinitionTable = + (const ClassDefinitionTable *) ((char *) this + SWAPW(backtrackClassDefTableOffset)); + const ClassDefinitionTable *inputClassDefinitionTable = + (const ClassDefinitionTable *) ((char *) this + SWAPW(inputClassDefTableOffset)); + const ClassDefinitionTable *lookaheadClassDefinitionTable = + (const ClassDefinitionTable *) ((char *) this + SWAPW(lookaheadClassDefTableOffset)); + le_uint16 scSetCount = SWAPW(chainSubClassSetCount); + le_int32 setClass = inputClassDefinitionTable->getGlyphClass(glyphIterator->getCurrGlyphID()); + + if (setClass < scSetCount && chainSubClassSetTableOffsetArray[setClass] != 0) { + Offset chainSubClassSetTableOffset = SWAPW(chainSubClassSetTableOffsetArray[setClass]); + const ChainSubClassSetTable *chainSubClassSetTable = + (const ChainSubClassSetTable *) ((char *) this + chainSubClassSetTableOffset); + le_uint16 chainSubClassRuleCount = SWAPW(chainSubClassSetTable->chainSubClassRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); + + for (le_uint16 scRule = 0; scRule < chainSubClassRuleCount; scRule += 1) { + Offset chainSubClassRuleTableOffset = + SWAPW(chainSubClassSetTable->chainSubClassRuleTableOffsetArray[scRule]); + const ChainSubClassRuleTable *chainSubClassRuleTable = + (const ChainSubClassRuleTable *) ((char *) chainSubClassSetTable + chainSubClassRuleTableOffset); + le_uint16 backtrackGlyphCount = SWAPW(chainSubClassRuleTable->backtrackGlyphCount); + le_uint16 inputGlyphCount = SWAPW(chainSubClassRuleTable->backtrackClassArray[backtrackGlyphCount]) - 1; + const le_uint16 *inputClassArray = &chainSubClassRuleTable->backtrackClassArray[backtrackGlyphCount + 1]; + le_uint16 lookaheadGlyphCount = SWAPW(inputClassArray[inputGlyphCount]); + const le_uint16 *lookaheadClassArray = &inputClassArray[inputGlyphCount + 1]; + le_uint16 substCount = SWAPW(lookaheadClassArray[lookaheadGlyphCount]); + + + tempIterator.setCurrStreamPosition(position); + + if (! tempIterator.prev(backtrackGlyphCount)) { + continue; + } + + tempIterator.prev(); + if (! matchGlyphClasses(chainSubClassRuleTable->backtrackClassArray, backtrackGlyphCount, + &tempIterator, backtrackClassDefinitionTable, TRUE)) { + continue; + } + + tempIterator.setCurrStreamPosition(position); + tempIterator.next(inputGlyphCount); + if (! matchGlyphClasses(lookaheadClassArray, lookaheadGlyphCount, &tempIterator, lookaheadClassDefinitionTable)) { + continue; + } + + if (matchGlyphClasses(inputClassArray, inputGlyphCount, glyphIterator, inputClassDefinitionTable)) { + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &lookaheadClassArray[lookaheadGlyphCount + 1]; + + applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); + + return inputGlyphCount + 1; + } + + glyphIterator->setCurrStreamPosition(position); + } + } + + // XXX If we get here, the table is mal-formed... + } + + return 0; +} + +le_uint32 ChainingContextualSubstitutionFormat3Subtable::process(const LookupProcessor *lookupProcessor, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + LEErrorCode & success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + le_uint16 backtrkGlyphCount = SWAPW(backtrackGlyphCount); + le_uint16 inputGlyphCount = (le_uint16) SWAPW(backtrackCoverageTableOffsetArray[backtrkGlyphCount]); + const Offset *inputCoverageTableOffsetArray = &backtrackCoverageTableOffsetArray[backtrkGlyphCount + 1]; + const le_uint16 lookaheadGlyphCount = (le_uint16) SWAPW(inputCoverageTableOffsetArray[inputGlyphCount]); + const Offset *lookaheadCoverageTableOffsetArray = &inputCoverageTableOffsetArray[inputGlyphCount + 1]; + le_uint16 substCount = (le_uint16) SWAPW(lookaheadCoverageTableOffsetArray[lookaheadGlyphCount]); + le_int32 position = glyphIterator->getCurrStreamPosition(); + GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); + + if (! tempIterator.prev(backtrkGlyphCount)) { + return 0; + } + + tempIterator.prev(); + if (! ContextualSubstitutionBase::matchGlyphCoverages(backtrackCoverageTableOffsetArray, + backtrkGlyphCount, &tempIterator, (const char *) this, TRUE)) { + return 0; + } + + tempIterator.setCurrStreamPosition(position); + tempIterator.next(inputGlyphCount - 1); + if (! ContextualSubstitutionBase::matchGlyphCoverages(lookaheadCoverageTableOffsetArray, + lookaheadGlyphCount, &tempIterator, (const char *) this)) { + return 0; + } + + // Back up the glyph iterator so that we + // can call next() before the check, which + // will leave it pointing at the last glyph + // that matched when we're done. + glyphIterator->prev(); + + if (ContextualSubstitutionBase::matchGlyphCoverages(inputCoverageTableOffsetArray, + inputGlyphCount, glyphIterator, (const char *) this)) { + const SubstitutionLookupRecord *substLookupRecordArray = + (const SubstitutionLookupRecord *) &lookaheadCoverageTableOffsetArray[lookaheadGlyphCount + 1]; + + ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); + + return inputGlyphCount; + } + + glyphIterator->setCurrStreamPosition(position); + + return 0; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/ContextualSubstSubtables.h b/Build/source/libs/icu/icu-50.1/layout/ContextualSubstSubtables.h new file mode 100644 index 00000000000..2ca1c1a0536 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ContextualSubstSubtables.h @@ -0,0 +1,205 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#ifndef __CONTEXTUALSUBSTITUTIONSUBTABLES_H +#define __CONTEXTUALSUBSTITUTIONSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "GlyphIterator.h" +#include "LookupProcessor.h" + +U_NAMESPACE_BEGIN + +struct SubstitutionLookupRecord +{ + le_uint16 sequenceIndex; + le_uint16 lookupListIndex; +}; + +struct ContextualSubstitutionBase : GlyphSubstitutionSubtable +{ + static le_bool matchGlyphIDs( + const TTGlyphID *glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator, + le_bool backtrack = FALSE); + + static le_bool matchGlyphClasses( + const le_uint16 *classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator, + const ClassDefinitionTable *classDefinitionTable, le_bool backtrack = FALSE); + + static le_bool matchGlyphCoverages( + const Offset *coverageTableOffsetArray, le_uint16 glyphCount, + GlyphIterator *glyphIterator, const char *offsetBase, le_bool backtrack = FALSE); + + static void applySubstitutionLookups( + const LookupProcessor *lookupProcessor, + const SubstitutionLookupRecord *substLookupRecordArray, + le_uint16 substCount, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + le_int32 position, + LEErrorCode& success); +}; + +struct ContextualSubstitutionSubtable : ContextualSubstitutionBase +{ + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; +}; + +struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable +{ + le_uint16 subRuleSetCount; + Offset subRuleSetTableOffsetArray[ANY_NUMBER]; + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; +}; + +struct SubRuleSetTable +{ + le_uint16 subRuleCount; + Offset subRuleTableOffsetArray[ANY_NUMBER]; + +}; + +// NOTE: Multiple variable size arrays!! +struct SubRuleTable +{ + le_uint16 glyphCount; + le_uint16 substCount; + TTGlyphID inputGlyphArray[ANY_NUMBER]; + //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; +}; + +struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable +{ + Offset classDefTableOffset; + le_uint16 subClassSetCount; + Offset subClassSetTableOffsetArray[ANY_NUMBER]; + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; +}; + +struct SubClassSetTable +{ + le_uint16 subClassRuleCount; + Offset subClassRuleTableOffsetArray[ANY_NUMBER]; +}; + +// NOTE: Multiple variable size arrays!! +struct SubClassRuleTable +{ + le_uint16 glyphCount; + le_uint16 substCount; + le_uint16 classArray[ANY_NUMBER]; + //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; +}; + +// NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause +// it has an array of coverage tables instead of a single coverage table... +// +// NOTE: Multiple variable size arrays!! +struct ContextualSubstitutionFormat3Subtable +{ + le_uint16 substFormat; + le_uint16 glyphCount; + le_uint16 substCount; + Offset coverageTableOffsetArray[ANY_NUMBER]; + //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER]; + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; +}; + +struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase +{ + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; +}; + +struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable +{ + le_uint16 chainSubRuleSetCount; + Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER]; + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; +}; + +struct ChainSubRuleSetTable +{ + le_uint16 chainSubRuleCount; + Offset chainSubRuleTableOffsetArray[ANY_NUMBER]; + +}; + +// NOTE: Multiple variable size arrays!! +struct ChainSubRuleTable +{ + le_uint16 backtrackGlyphCount; + TTGlyphID backtrackGlyphArray[ANY_NUMBER]; + //le_uint16 inputGlyphCount; + //TTGlyphID inputGlyphArray[ANY_NUMBER]; + //le_uint16 lookaheadGlyphCount; + //TTGlyphID lookaheadGlyphArray[ANY_NUMBER]; + //le_uint16 substCount; + //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; +}; + +struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstitutionSubtable +{ + Offset backtrackClassDefTableOffset; + Offset inputClassDefTableOffset; + Offset lookaheadClassDefTableOffset; + le_uint16 chainSubClassSetCount; + Offset chainSubClassSetTableOffsetArray[ANY_NUMBER]; + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; +}; + +struct ChainSubClassSetTable +{ + le_uint16 chainSubClassRuleCount; + Offset chainSubClassRuleTableOffsetArray[ANY_NUMBER]; +}; + +// NOTE: Multiple variable size arrays!! +struct ChainSubClassRuleTable +{ + le_uint16 backtrackGlyphCount; + le_uint16 backtrackClassArray[ANY_NUMBER]; + //le_uint16 inputGlyphCount; + //le_uint16 inputClassArray[ANY_NUMBER]; + //le_uint16 lookaheadGlyphCount; + //le_uint16 lookaheadClassArray[ANY_NUMBER]; + //le_uint16 substCount; + //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; +}; + +// NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause +// it has arrays of coverage tables instead of a single coverage table... +// +// NOTE: Multiple variable size arrays!! +struct ChainingContextualSubstitutionFormat3Subtable +{ + le_uint16 substFormat; + le_uint16 backtrackGlyphCount; + Offset backtrackCoverageTableOffsetArray[ANY_NUMBER]; + //le_uint16 inputGlyphCount; + //Offset inputCoverageTableOffsetArray[ANY_NUMBER]; + //le_uint16 lookaheadGlyphCount; + //le_uint16 lookaheadCoverageTableOffsetArray[ANY_NUMBER]; + //le_uint16 substCount; + //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER]; + + le_uint32 process(const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/CoverageTables.cpp b/Build/source/libs/icu/icu-50.1/layout/CoverageTables.cpp new file mode 100644 index 00000000000..e5f1597f864 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/CoverageTables.cpp @@ -0,0 +1,91 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2006 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "OpenTypeUtilities.h" +#include "CoverageTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_int32 CoverageTable::getGlyphCoverage(LEGlyphID glyphID) const +{ + switch(SWAPW(coverageFormat)) + { + case 0: + return -1; + + case 1: + { + const CoverageFormat1Table *f1Table = (const CoverageFormat1Table *) this; + + return f1Table->getGlyphCoverage(glyphID); + } + + case 2: + { + const CoverageFormat2Table *f2Table = (const CoverageFormat2Table *) this; + + return f2Table->getGlyphCoverage(glyphID); + } + + default: + return -1; + } +} + +le_int32 CoverageFormat1Table::getGlyphCoverage(LEGlyphID glyphID) const +{ + TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); + le_uint16 count = SWAPW(glyphCount); + le_uint8 bit = OpenTypeUtilities::highBit(count); + le_uint16 power = 1 << bit; + le_uint16 extra = count - power; + le_uint16 probe = power; + le_uint16 index = 0; + + if (count == 0) { + return -1; + } + + if (SWAPW(glyphArray[extra]) <= ttGlyphID) { + index = extra; + } + + while (probe > (1 << 0)) { + probe >>= 1; + + if (SWAPW(glyphArray[index + probe]) <= ttGlyphID) { + index += probe; + } + } + + if (SWAPW(glyphArray[index]) == ttGlyphID) { + return index; + } + + return -1; +} + +le_int32 CoverageFormat2Table::getGlyphCoverage(LEGlyphID glyphID) const +{ + TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); + le_uint16 count = SWAPW(rangeCount); + le_int32 rangeIndex = + OpenTypeUtilities::getGlyphRangeIndex(ttGlyphID, rangeRecordArray, count); + + if (rangeIndex < 0) { + return -1; + } + + TTGlyphID firstInRange = SWAPW(rangeRecordArray[rangeIndex].firstGlyph); + le_uint16 startCoverageIndex = SWAPW(rangeRecordArray[rangeIndex].rangeValue); + + return startCoverageIndex + (ttGlyphID - firstInRange); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/CoverageTables.h b/Build/source/libs/icu/icu-50.1/layout/CoverageTables.h new file mode 100644 index 00000000000..5e9dbaa15a7 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/CoverageTables.h @@ -0,0 +1,44 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __COVERAGETABLES_H +#define __COVERAGETABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +struct CoverageTable +{ + le_uint16 coverageFormat; + + le_int32 getGlyphCoverage(LEGlyphID glyphID) const; +}; + +struct CoverageFormat1Table : CoverageTable +{ + le_uint16 glyphCount; + TTGlyphID glyphArray[ANY_NUMBER]; + + le_int32 getGlyphCoverage(LEGlyphID glyphID) const; +}; + +struct CoverageFormat2Table : CoverageTable +{ + le_uint16 rangeCount; + GlyphRangeRecord rangeRecordArray[ANY_NUMBER]; + + le_int32 getGlyphCoverage(LEGlyphID glyphID) const; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/CursiveAttachmentSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/CursiveAttachmentSubtables.cpp new file mode 100644 index 00000000000..9d2144fcefa --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/CursiveAttachmentSubtables.cpp @@ -0,0 +1,53 @@ +/* + * (C) Copyright IBM Corp. 1998 - 2007 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "GlyphPositioningTables.h" +#include "CursiveAttachmentSubtables.h" +#include "AnchorTables.h" +#include "GlyphIterator.h" +#include "OpenTypeUtilities.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_uint32 CursiveAttachmentSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const +{ + LEGlyphID glyphID = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyphID); + le_uint16 eeCount = SWAPW(entryExitCount); + + if (coverageIndex < 0 || coverageIndex >= eeCount) { + glyphIterator->setCursiveGlyph(); + return 0; + } + + LEPoint entryAnchor, exitAnchor; + Offset entryOffset = SWAPW(entryExitRecords[coverageIndex].entryAnchor); + Offset exitOffset = SWAPW(entryExitRecords[coverageIndex].exitAnchor); + + if (entryOffset != 0) { + const AnchorTable *entryAnchorTable = (const AnchorTable *) ((char *) this + entryOffset); + + entryAnchorTable->getAnchor(glyphID, fontInstance, entryAnchor); + glyphIterator->setCursiveEntryPoint(entryAnchor); + } else { + //glyphIterator->clearCursiveEntryPoint(); + } + + if (exitOffset != 0) { + const AnchorTable *exitAnchorTable = (const AnchorTable *) ((char *) this + exitOffset); + + exitAnchorTable->getAnchor(glyphID, fontInstance, exitAnchor); + glyphIterator->setCursiveExitPoint(exitAnchor); + } else { + //glyphIterator->clearCursiveExitPoint(); + } + + return 1; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/CursiveAttachmentSubtables.h b/Build/source/libs/icu/icu-50.1/layout/CursiveAttachmentSubtables.h new file mode 100644 index 00000000000..5eefb2f9888 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/CursiveAttachmentSubtables.h @@ -0,0 +1,41 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#ifndef __CURSIVEATTACHMENTSUBTABLES_H +#define __CURSIVEATTACHMENTSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "GlyphPositioningTables.h" + +U_NAMESPACE_BEGIN + +class LEFontInstance; +class GlyphIterator; + +struct EntryExitRecord +{ + Offset entryAnchor; + Offset exitAnchor; +}; + +struct CursiveAttachmentSubtable : GlyphPositioningSubtable +{ + le_uint16 entryExitCount; + EntryExitRecord entryExitRecords[ANY_NUMBER]; + + le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; +}; + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/DefaultCharMapper.h b/Build/source/libs/icu/icu-50.1/layout/DefaultCharMapper.h new file mode 100644 index 00000000000..c0e1bc1c33b --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/DefaultCharMapper.h @@ -0,0 +1,57 @@ +/* + * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved + * + */ + +#ifndef __DEFAULTCHARMAPPER_H +#define __DEFAULTCHARMAPPER_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" + +U_NAMESPACE_BEGIN + +/** + * This class is an instance of LECharMapper which + * implements control character filtering and bidi + * mirroring. + * + * @see LECharMapper + */ +class DefaultCharMapper : public UMemory, public LECharMapper +{ +private: + le_bool fFilterControls; + le_bool fMirror; + + static const LEUnicode32 controlChars[]; + + static const le_int32 controlCharsCount; + + static const LEUnicode32 mirroredChars[]; + static const LEUnicode32 srahCderorrim[]; + + static const le_int32 mirroredCharsCount; + +public: + DefaultCharMapper(le_bool filterControls, le_bool mirror) + : fFilterControls(filterControls), fMirror(mirror) + { + // nothing + }; + + ~DefaultCharMapper() + { + // nada + }; + + LEUnicode32 mapChar(LEUnicode32 ch) const; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/DeviceTables.cpp b/Build/source/libs/icu/icu-50.1/layout/DeviceTables.cpp new file mode 100644 index 00000000000..0bbbf181496 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/DeviceTables.cpp @@ -0,0 +1,46 @@ +/* + * @(#)DeviceTables.cpp 1.5 00/03/15 + * + * (C) Copyright IBM Corp. 1998 - 2006 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "DeviceTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +const le_uint16 DeviceTable::fieldMasks[] = {0x0003, 0x000F, 0x00FF}; +const le_uint16 DeviceTable::fieldSignBits[] = {0x0002, 0x0008, 0x0080}; +const le_uint16 DeviceTable::fieldBits[] = { 2, 4, 8}; + +#define FORMAT_COUNT LE_ARRAY_SIZE(fieldBits) + +le_int16 DeviceTable::getAdjustment(le_uint16 ppem) const +{ + le_uint16 start = SWAPW(startSize); + le_uint16 format = SWAPW(deltaFormat) - 1; + le_int16 result = 0; + + if (ppem >= start && ppem <= SWAPW(endSize) && format < FORMAT_COUNT) { + le_uint16 sizeIndex = ppem - start; + le_uint16 bits = fieldBits[format]; + le_uint16 count = 16 / bits; + le_uint16 word = SWAPW(deltaValues[sizeIndex / count]); + le_uint16 fieldIndex = sizeIndex % count; + le_uint16 shift = 16 - (bits * (fieldIndex + 1)); + le_uint16 field = (word >> shift) & fieldMasks[format]; + + result = field; + + if ((field & fieldSignBits[format]) != 0) { + result |= ~ fieldMasks[format]; + } + } + + return result; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/DeviceTables.h b/Build/source/libs/icu/icu-50.1/layout/DeviceTables.h new file mode 100644 index 00000000000..864bba1ad11 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/DeviceTables.h @@ -0,0 +1,39 @@ +/* + * @(#)DeviceTables.h 1.5 00/03/15 + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#ifndef __DEVICETABLES_H +#define __DEVICETABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +struct DeviceTable +{ + le_uint16 startSize; + le_uint16 endSize; + le_uint16 deltaFormat; + le_uint16 deltaValues[ANY_NUMBER]; + + le_int16 getAdjustment(le_uint16 ppem) const; + +private: + static const le_uint16 fieldMasks[]; + static const le_uint16 fieldSignBits[]; + static const le_uint16 fieldBits[]; +}; + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/ExtensionSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/ExtensionSubtables.cpp new file mode 100644 index 00000000000..813caeb3708 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ExtensionSubtables.cpp @@ -0,0 +1,45 @@ +/* + * %W% %E% + * + * (C) Copyright IBM Corp. 2008-2011 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "LookupProcessor.h" +#include "ExtensionSubtables.h" +#include "GlyphIterator.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +// read a 32-bit value that might only be 16-bit-aligned in memory +static inline le_uint32 READ_LONG(le_uint32 code) { + le_uint16* first = ((le_uint16*)&code); + le_uint16* second = (((le_uint16*)&code) + 1); + return (le_uint32)((SWAPW(*first) << 16) + SWAPW(*second)); +} + +// FIXME: should look at the format too... maybe have a sub-class for it? +le_uint32 ExtensionSubtable::process(const LookupProcessor *lookupProcessor, le_uint16 lookupType, + GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + le_uint16 elt = SWAPW(extensionLookupType); + + if (elt != lookupType) { + le_uint32 extOffset = READ_LONG(extensionOffset); + LookupSubtable *subtable = (LookupSubtable *) ((char *) this + extOffset); + + return lookupProcessor->applySubtable(subtable, elt, glyphIterator, fontInstance, success); + } + + return 0; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/ExtensionSubtables.h b/Build/source/libs/icu/icu-50.1/layout/ExtensionSubtables.h new file mode 100644 index 00000000000..7d214af5ec2 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ExtensionSubtables.h @@ -0,0 +1,35 @@ +/* + * %W% %E% + * + * (C) Copyright IBM Corp. 2002-2008 - All Rights Reserved + * + */ + +#ifndef __EXTENSIONSUBTABLES_H +#define __EXTENSIONSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "LookupProcessor.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +struct ExtensionSubtable //: GlyphSubstitutionSubtable +{ + le_uint16 substFormat; + le_uint16 extensionLookupType; + le_uint32 extensionOffset; + + le_uint32 process(const LookupProcessor *lookupProcessor, le_uint16 lookupType, + GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/Features.cpp b/Build/source/libs/icu/icu-50.1/layout/Features.cpp new file mode 100644 index 00000000000..01419ecad80 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/Features.cpp @@ -0,0 +1,61 @@ +/* + * @(#)Features.cpp 1.4 00/03/15 + * + * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeUtilities.h" +#include "OpenTypeTables.h" +#include "ICUFeatures.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +const FeatureTable *FeatureListTable::getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const +{ + if (featureIndex >= SWAPW(featureCount)) { + return 0; + } + + Offset featureTableOffset = featureRecordArray[featureIndex].featureTableOffset; + + *featureTag = SWAPT(featureRecordArray[featureIndex].featureTag); + + return (const FeatureTable *) ((char *) this + SWAPW(featureTableOffset)); +} + +/* + * Note: according to the OpenType Spec. v 1.4, the entries in the Feature + * List Table are sorted alphabetically by feature tag; however, there seem + * to be some fonts which have an unsorted list; that's why the binary search + * is #if 0'd out and replaced by a linear search. + * + * Also note: as of ICU 2.6, this method isn't called anyhow... + */ +const FeatureTable *FeatureListTable::getFeatureTable(LETag featureTag) const +{ +#if 0 + Offset featureTableOffset = + OpenTypeUtilities::getTagOffset(featureTag, (TagAndOffsetRecord *) featureRecordArray, SWAPW(featureCount)); + + if (featureTableOffset == 0) { + return 0; + } + + return (const FeatureTable *) ((char *) this + SWAPW(featureTableOffset)); +#else + int count = SWAPW(featureCount); + + for (int i = 0; i < count; i += 1) { + if (SWAPT(featureRecordArray[i].featureTag) == featureTag) { + return (const FeatureTable *) ((char *) this + SWAPW(featureRecordArray[i].featureTableOffset)); + } + } + + return 0; +#endif +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/GDEFMarkFilter.cpp b/Build/source/libs/icu/icu-50.1/layout/GDEFMarkFilter.cpp new file mode 100644 index 00000000000..344e07ab286 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GDEFMarkFilter.cpp @@ -0,0 +1,31 @@ +/* + * + * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "GDEFMarkFilter.h" +#include "GlyphDefinitionTables.h" + +U_NAMESPACE_BEGIN + +GDEFMarkFilter::GDEFMarkFilter(const GlyphDefinitionTableHeader *gdefTable) +{ + classDefTable = gdefTable->getGlyphClassDefinitionTable(); +} + +GDEFMarkFilter::~GDEFMarkFilter() +{ + // nothing to do? +} + +le_bool GDEFMarkFilter::accept(LEGlyphID glyph) const +{ + le_int32 glyphClass = classDefTable->getGlyphClass(glyph); + + return glyphClass == gcdMarkGlyph; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/GDEFMarkFilter.h b/Build/source/libs/icu/icu-50.1/layout/GDEFMarkFilter.h new file mode 100644 index 00000000000..5ae5b45fdfc --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GDEFMarkFilter.h @@ -0,0 +1,37 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __GDEFMARKFILTER__H +#define __GDEFMARKFILTER__H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "GlyphDefinitionTables.h" + +U_NAMESPACE_BEGIN + +class GDEFMarkFilter : public UMemory, public LEGlyphFilter +{ +private: + const GlyphClassDefinitionTable *classDefTable; + + GDEFMarkFilter(const GDEFMarkFilter &other); // forbid copying of this class + GDEFMarkFilter &operator=(const GDEFMarkFilter &other); // forbid copying of this class + +public: + GDEFMarkFilter(const GlyphDefinitionTableHeader *gdefTable); + virtual ~GDEFMarkFilter(); + + virtual le_bool accept(LEGlyphID glyph) const; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/GXLayoutEngine.cpp b/Build/source/libs/icu/icu-50.1/layout/GXLayoutEngine.cpp new file mode 100644 index 00000000000..78f0162e489 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GXLayoutEngine.cpp @@ -0,0 +1,69 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LayoutEngine.h" +#include "GXLayoutEngine.h" +#include "LEGlyphStorage.h" + +#include "MorphTables.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GXLayoutEngine) + +GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable, LEErrorCode &success) + : LayoutEngine(fontInstance, scriptCode, languageCode, 0, success), fMorphTable(morphTable) +{ + // nothing else to do? +} + +GXLayoutEngine::~GXLayoutEngine() +{ + reset(); +} + +// apply 'mort' table +le_int32 GXLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + mapCharsToGlyphs(chars, offset, count, FALSE, rightToLeft, glyphStorage, success); + + if (LE_FAILURE(success)) { + return 0; + } + + fMorphTable->process(glyphStorage); + + return count; +} + +// apply positional tables +void GXLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/, + LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (chars == NULL || offset < 0 || count < 0) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + // FIXME: no positional processing yet... +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/GXLayoutEngine.h b/Build/source/libs/icu/icu-50.1/layout/GXLayoutEngine.h new file mode 100644 index 00000000000..8d48a4e31f7 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GXLayoutEngine.h @@ -0,0 +1,126 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#ifndef __GXLAYOUTENGINE_H +#define __GXLAYOUTENGINE_H + +#include "LETypes.h" +#include "LayoutEngine.h" + +#include "MorphTables.h" + +U_NAMESPACE_BEGIN + +class LEFontInstance; +class LEGlyphStorage; + +/** + * This class implements layout for QuickDraw GX or Apple Advanced Typograyph (AAT) + * fonts. A font is a GX or AAT font if it contains a 'mort' table. See Apple's + * TrueType Reference Manual (http://fonts.apple.com/TTRefMan/index.html) for details. + * Information about 'mort' tables is in the chapter titled "Font Files." + * + * @internal + */ +class GXLayoutEngine : public LayoutEngine +{ +public: + /** + * This is the main constructor. It constructs an instance of GXLayoutEngine for + * a particular font, script and language. It takes the 'mort' table as a parameter since + * LayoutEngine::layoutEngineFactory has to read the 'mort' table to know that it has a + * GX font. + * + * Note: GX and AAT fonts don't contain any script and language specific tables, so + * the script and language are ignored. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param morphTable - the 'mort' table + * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ + GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const MorphTableHeader *morphTable, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. + * + * @internal + */ + virtual ~GXLayoutEngine(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +protected: + + /** + * The address of the 'mort' table + * + * @internal + */ + const MorphTableHeader *fMorphTable; + + /** + * This method does GX layout using the font's 'mort' table. It converts the + * input character codes to glyph indices using mapCharsToGlyphs, and then + * applies the 'mort' table. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - <code>TRUE</code> if the text is in a right to left directional run + * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. + * + * Output parameters: + * @param success - set to an error code if the operation fails + * + * @return the number of glyphs in the glyph index array + * + * @internal + */ + virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method adjusts the glyph positions using the font's + * 'kern', 'trak', 'bsln', 'opbd' and 'just' tables. + * + * Input parameters: + * @param glyphStorage - the object holding the glyph storage. The positions will be updated as needed. + * + * Output parameters: + * @param success - set to an error code if the operation fails + * + * @internal + */ + virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphDefinitionTables.cpp b/Build/source/libs/icu/icu-50.1/layout/GlyphDefinitionTables.cpp new file mode 100644 index 00000000000..a51e6ba0813 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphDefinitionTables.cpp @@ -0,0 +1,34 @@ +/* + * + * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "GlyphDefinitionTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +const GlyphClassDefinitionTable *GlyphDefinitionTableHeader::getGlyphClassDefinitionTable() const +{ + return (const GlyphClassDefinitionTable *) ((char *) this + SWAPW(glyphClassDefOffset)); +} + +const AttachmentListTable *GlyphDefinitionTableHeader::getAttachmentListTable() const +{ + return (const AttachmentListTable *) ((char *) this + SWAPW(attachListOffset)); +} + +const LigatureCaretListTable *GlyphDefinitionTableHeader::getLigatureCaretListTable() const +{ + return (const LigatureCaretListTable *) ((char *) this + SWAPW(ligCaretListOffset)); +} + +const MarkAttachClassDefinitionTable *GlyphDefinitionTableHeader::getMarkAttachClassDefinitionTable() const +{ + return (const MarkAttachClassDefinitionTable *) ((char *) this + SWAPW(MarkAttachClassDefOffset)); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphDefinitionTables.h b/Build/source/libs/icu/icu-50.1/layout/GlyphDefinitionTables.h new file mode 100644 index 00000000000..e4cbbb6e1f5 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphDefinitionTables.h @@ -0,0 +1,96 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __GLYPHDEFINITIONTABLES_H +#define __GLYPHDEFINITIONTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "ClassDefinitionTables.h" + +U_NAMESPACE_BEGIN + +typedef ClassDefinitionTable GlyphClassDefinitionTable; + +enum GlyphClassDefinitions +{ + gcdNoGlyphClass = 0, + gcdSimpleGlyph = 1, + gcdLigatureGlyph = 2, + gcdMarkGlyph = 3, + gcdComponentGlyph = 4 +}; + +struct AttachmentListTable +{ + Offset coverageTableOffset; + le_uint16 glyphCount; + Offset attachPointTableOffsetArray[ANY_NUMBER]; +}; + +struct AttachPointTable +{ + le_uint16 pointCount; + le_uint16 pointIndexArray[ANY_NUMBER]; +}; + +struct LigatureCaretListTable +{ + Offset coverageTableOffset; + le_uint16 ligGlyphCount; + Offset ligGlyphTableOffsetArray[ANY_NUMBER]; +}; + +struct LigatureGlyphTable +{ + le_uint16 caretCount; + Offset caretValueTableOffsetArray[ANY_NUMBER]; +}; + +struct CaretValueTable +{ + le_uint16 caretValueFormat; +}; + +struct CaretValueFormat1Table : CaretValueTable +{ + le_int16 coordinate; +}; + +struct CaretValueFormat2Table : CaretValueTable +{ + le_uint16 caretValuePoint; +}; + +struct CaretValueFormat3Table : CaretValueTable +{ + le_int16 coordinate; + Offset deviceTableOffset; +}; + +typedef ClassDefinitionTable MarkAttachClassDefinitionTable; + +struct GlyphDefinitionTableHeader +{ + fixed32 version; + Offset glyphClassDefOffset; + Offset attachListOffset; + Offset ligCaretListOffset; + Offset MarkAttachClassDefOffset; + + const GlyphClassDefinitionTable *getGlyphClassDefinitionTable() const; + const AttachmentListTable *getAttachmentListTable()const ; + const LigatureCaretListTable *getLigatureCaretListTable() const; + const MarkAttachClassDefinitionTable *getMarkAttachClassDefinitionTable() const; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphIterator.cpp b/Build/source/libs/icu/icu-50.1/layout/GlyphIterator.cpp new file mode 100644 index 00000000000..90e962eb2a1 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphIterator.cpp @@ -0,0 +1,530 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositionAdjustments.h" +#include "GlyphIterator.h" +#include "LEGlyphStorage.h" +#include "Lookups.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +GlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, + FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader) + : direction(1), position(-1), nextLimit(-1), prevLimit(-1), + glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments), + srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), featureParam(0), glyphGroup(0), + glyphClassDefinitionTable(NULL), markAttachClassDefinitionTable(NULL) + +{ + le_int32 glyphCount = glyphStorage.getGlyphCount(); + + if (theGlyphDefinitionTableHeader != NULL) { + glyphClassDefinitionTable = theGlyphDefinitionTableHeader->getGlyphClassDefinitionTable(); + markAttachClassDefinitionTable = theGlyphDefinitionTableHeader->getMarkAttachClassDefinitionTable(); + } + + nextLimit = glyphCount; + + if (rightToLeft) { + direction = -1; + position = glyphCount; + nextLimit = -1; + prevLimit = glyphCount; + } +} + +GlyphIterator::GlyphIterator(GlyphIterator &that) + : glyphStorage(that.glyphStorage) +{ + direction = that.direction; + position = that.position; + nextLimit = that.nextLimit; + prevLimit = that.prevLimit; + + glyphPositionAdjustments = that.glyphPositionAdjustments; + srcIndex = that.srcIndex; + destIndex = that.destIndex; + lookupFlags = that.lookupFlags; + featureMask = that.featureMask; + featureParam = that.featureParam; + glyphGroup = that.glyphGroup; + glyphClassDefinitionTable = that.glyphClassDefinitionTable; + markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; +} + +GlyphIterator::GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask, le_int32 newFeatureParam) + : glyphStorage(that.glyphStorage) +{ + direction = that.direction; + position = that.position; + nextLimit = that.nextLimit; + prevLimit = that.prevLimit; + + glyphPositionAdjustments = that.glyphPositionAdjustments; + srcIndex = that.srcIndex; + destIndex = that.destIndex; + lookupFlags = that.lookupFlags; + featureMask = newFeatureMask; + featureParam = newFeatureParam; + glyphGroup = 0; + glyphClassDefinitionTable = that.glyphClassDefinitionTable; + markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; +} + +GlyphIterator::GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags) + : glyphStorage(that.glyphStorage) +{ + direction = that.direction; + position = that.position; + nextLimit = that.nextLimit; + prevLimit = that.prevLimit; + + glyphPositionAdjustments = that.glyphPositionAdjustments; + srcIndex = that.srcIndex; + destIndex = that.destIndex; + lookupFlags = newLookupFlags; + featureMask = that.featureMask; + featureParam = that.featureParam; + glyphGroup = that.glyphGroup; + glyphClassDefinitionTable = that.glyphClassDefinitionTable; + markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; +} + +GlyphIterator::~GlyphIterator() +{ + // nothing to do, right? +} + +void GlyphIterator::reset(le_uint16 newLookupFlags, FeatureMask newFeatureMask) +{ + position = prevLimit; + featureMask = newFeatureMask; + featureParam = 0; + glyphGroup = 0; + lookupFlags = newLookupFlags; +} + +LEGlyphID *GlyphIterator::insertGlyphs(le_int32 count, LEErrorCode& success) +{ + return glyphStorage.insertGlyphs(position, count, success); +} + +le_int32 GlyphIterator::applyInsertions() +{ + le_int32 newGlyphCount = glyphStorage.applyInsertions(); + + if (direction < 0) { + prevLimit = newGlyphCount; + } else { + nextLimit = newGlyphCount; + } + + return newGlyphCount; +} + +le_int32 GlyphIterator::getCurrStreamPosition() const +{ + return position; +} + +le_int32 GlyphIterator::getFeatureParam() const +{ + return featureParam; +} + +le_bool GlyphIterator::isRightToLeft() const +{ + return direction < 0; +} + +le_bool GlyphIterator::ignoresMarks() const +{ + return (lookupFlags & lfIgnoreMarks) != 0; +} + +le_bool GlyphIterator::baselineIsLogicalEnd() const +{ + return (lookupFlags & lfBaselineIsLogicalEnd) != 0; +} + +LEGlyphID GlyphIterator::getCurrGlyphID() const +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return 0xFFFF; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return 0xFFFF; + } + } + + return glyphStorage[position]; +} + +void GlyphIterator::getCursiveEntryPoint(LEPoint &entryPoint) const +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return; + } + } + + glyphPositionAdjustments->getEntryPoint(position, entryPoint); +} + +void GlyphIterator::getCursiveExitPoint(LEPoint &exitPoint) const +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return; + } + } + + glyphPositionAdjustments->getExitPoint(position, exitPoint); +} + +void GlyphIterator::setCurrGlyphID(TTGlyphID glyphID) +{ + LEGlyphID glyph = glyphStorage[position]; + + glyphStorage[position] = LE_SET_GLYPH(glyph, glyphID); +} + +void GlyphIterator::setCurrStreamPosition(le_int32 newPosition) +{ + if (direction < 0) { + if (newPosition >= prevLimit) { + position = prevLimit; + return; + } + + if (newPosition <= nextLimit) { + position = nextLimit; + return; + } + } else { + if (newPosition <= prevLimit) { + position = prevLimit; + return; + } + + if (newPosition >= nextLimit) { + position = nextLimit; + return; + } + } + + position = newPosition - direction; + next(); +} + +void GlyphIterator::setCurrGlyphBaseOffset(le_int32 baseOffset) +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return; + } + } + + glyphPositionAdjustments->setBaseOffset(position, baseOffset); +} + +void GlyphIterator::adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, + float xAdvanceAdjust, float yAdvanceAdjust) +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return; + } + } + + glyphPositionAdjustments->adjustXPlacement(position, xPlacementAdjust); + glyphPositionAdjustments->adjustYPlacement(position, yPlacementAdjust); + glyphPositionAdjustments->adjustXAdvance(position, xAdvanceAdjust); + glyphPositionAdjustments->adjustYAdvance(position, yAdvanceAdjust); +} + +void GlyphIterator::setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, + float xAdvanceAdjust, float yAdvanceAdjust) +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return; + } + } + + glyphPositionAdjustments->setXPlacement(position, xPlacementAdjust); + glyphPositionAdjustments->setYPlacement(position, yPlacementAdjust); + glyphPositionAdjustments->setXAdvance(position, xAdvanceAdjust); + glyphPositionAdjustments->setYAdvance(position, yAdvanceAdjust); +} + +void GlyphIterator::clearCursiveEntryPoint() +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return; + } + } + + glyphPositionAdjustments->clearEntryPoint(position); +} + +void GlyphIterator::clearCursiveExitPoint() +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return; + } + } + + glyphPositionAdjustments->clearExitPoint(position); +} + +void GlyphIterator::setCursiveEntryPoint(LEPoint &entryPoint) +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return; + } + } + + glyphPositionAdjustments->setEntryPoint(position, entryPoint, baselineIsLogicalEnd()); +} + +void GlyphIterator::setCursiveExitPoint(LEPoint &exitPoint) +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return; + } + } + + glyphPositionAdjustments->setExitPoint(position, exitPoint, baselineIsLogicalEnd()); +} + +void GlyphIterator::setCursiveGlyph() +{ + if (direction < 0) { + if (position <= nextLimit || position >= prevLimit) { + return; + } + } else { + if (position <= prevLimit || position >= nextLimit) { + return; + } + } + + glyphPositionAdjustments->setCursiveGlyph(position, baselineIsLogicalEnd()); +} + +le_bool GlyphIterator::filterGlyph(le_uint32 index) const +{ + LEGlyphID glyphID = glyphStorage[index]; + le_int32 glyphClass = gcdNoGlyphClass; + + if (LE_GET_GLYPH(glyphID) >= 0xFFFE) { + return TRUE; + } + + if (glyphClassDefinitionTable != NULL) { + glyphClass = glyphClassDefinitionTable->getGlyphClass(glyphID); + } + + switch (glyphClass) + { + case gcdNoGlyphClass: + return FALSE; + + case gcdSimpleGlyph: + return (lookupFlags & lfIgnoreBaseGlyphs) != 0; + + case gcdLigatureGlyph: + return (lookupFlags & lfIgnoreLigatures) != 0; + + case gcdMarkGlyph: + { + if ((lookupFlags & lfIgnoreMarks) != 0) { + return TRUE; + } + + le_uint16 markAttachType = (lookupFlags & lfMarkAttachTypeMask) >> lfMarkAttachTypeShift; + + if ((markAttachType != 0) && (markAttachClassDefinitionTable != NULL)) { + return markAttachClassDefinitionTable->getGlyphClass(glyphID) != markAttachType; + } + + return FALSE; + } + + case gcdComponentGlyph: + return (lookupFlags & lfIgnoreBaseGlyphs) != 0; + + default: + return FALSE; + } +} + +le_bool GlyphIterator::hasFeatureTag(le_bool matchGroup) +{ + featureParam = 0; + + if (featureMask == 0) { + return TRUE; + } + + LEErrorCode success = LE_NO_ERROR; + FeatureMask fm = glyphStorage.getAuxData(position, success); + + if (((fm & featureMask) == featureMask) && (!matchGroup || (le_int32)(fm & LE_GLYPH_GROUP_MASK) == glyphGroup)) { + const le_int32 *paramList = (const le_int32 *) glyphStorage.getAuxParam(position, success); + if (paramList != NULL) { + fm = featureMask; + while ((fm & 0x80000000UL) == 0) { + ++paramList; + fm <<= 1; + } + featureParam = *paramList; + } + return TRUE; + } + + return FALSE; +} + +le_bool GlyphIterator::findFeatureTag() +{ + //glyphGroup = 0; + + while (nextInternal()) { + if (hasFeatureTag(FALSE)) { + LEErrorCode success = LE_NO_ERROR; + + glyphGroup = (glyphStorage.getAuxData(position, success) & LE_GLYPH_GROUP_MASK); + return TRUE; + } + } + + return FALSE; +} + + +le_bool GlyphIterator::nextInternal(le_uint32 delta) +{ + le_int32 newPosition = position; + + while (newPosition != nextLimit && delta > 0) { + do { + newPosition += direction; + } while (newPosition != nextLimit && filterGlyph(newPosition)); + + delta -= 1; + } + + position = newPosition; + + return position != nextLimit; +} + +le_bool GlyphIterator::next(le_uint32 delta) +{ + return nextInternal(delta) && hasFeatureTag(TRUE); +} + +le_bool GlyphIterator::prevInternal(le_uint32 delta) +{ + le_int32 newPosition = position; + + while (newPosition != prevLimit && delta > 0) { + do { + newPosition -= direction; + } while (newPosition != prevLimit && filterGlyph(newPosition)); + + delta -= 1; + } + + position = newPosition; + + return position != prevLimit; +} + +le_bool GlyphIterator::prev(le_uint32 delta) +{ + return prevInternal(delta) && hasFeatureTag(TRUE); +} + +le_int32 GlyphIterator::getMarkComponent(le_int32 markPosition) const +{ + le_int32 component = 0; + le_int32 posn; + + for (posn = position; posn != markPosition; posn += direction) { + if (glyphStorage[posn] == 0xFFFE) { + component += 1; + } + } + + return component; +} + +// This is basically prevInternal except that it +// doesn't take a delta argument, and it doesn't +// filter out 0xFFFE glyphs. +le_bool GlyphIterator::findMark2Glyph() +{ + le_int32 newPosition = position; + + do { + newPosition -= direction; + } while (newPosition != prevLimit && glyphStorage[newPosition] != 0xFFFE && filterGlyph(newPosition)); + + position = newPosition; + + return position != prevLimit; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphIterator.h b/Build/source/libs/icu/icu-50.1/layout/GlyphIterator.h new file mode 100644 index 00000000000..5ab8bce1bd1 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphIterator.h @@ -0,0 +1,105 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#ifndef __GLYPHITERATOR_H +#define __GLYPHITERATOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "GlyphDefinitionTables.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; +class GlyphPositionAdjustments; + +class GlyphIterator : public UMemory { +public: + GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, + FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader); + + GlyphIterator(GlyphIterator &that); + + GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask, le_int32 featureParam = 0); + + GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags); + + virtual ~GlyphIterator(); + + void reset(le_uint16 newLookupFlags, LETag newFeatureTag); + + le_bool next(le_uint32 delta = 1); + le_bool prev(le_uint32 delta = 1); + le_bool findFeatureTag(); + + le_bool isRightToLeft() const; + le_bool ignoresMarks() const; + + le_bool baselineIsLogicalEnd() const; + + LEGlyphID getCurrGlyphID() const; + le_int32 getCurrStreamPosition() const; + + le_int32 getMarkComponent(le_int32 markPosition) const; + le_bool findMark2Glyph(); + + le_int32 getFeatureParam() const; + + void getCursiveEntryPoint(LEPoint &entryPoint) const; + void getCursiveExitPoint(LEPoint &exitPoint) const; + + void setCurrGlyphID(TTGlyphID glyphID); + void setCurrStreamPosition(le_int32 position); + void setCurrGlyphBaseOffset(le_int32 baseOffset); + void adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, + float xAdvanceAdjust, float yAdvanceAdjust); + + void setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, + float xAdvanceAdjust, float yAdvanceAdjust); + + void clearCursiveEntryPoint(); + void clearCursiveExitPoint(); + void setCursiveEntryPoint(LEPoint &entryPoint); + void setCursiveExitPoint(LEPoint &exitPoint); + void setCursiveGlyph(); + + LEGlyphID *insertGlyphs(le_int32 count, LEErrorCode& success); + le_int32 applyInsertions(); + +private: + le_bool filterGlyph(le_uint32 index) const; + le_bool hasFeatureTag(le_bool matchGroup); /* not const because it updates the featureParam field */ + le_bool nextInternal(le_uint32 delta = 1); + le_bool prevInternal(le_uint32 delta = 1); + + le_int32 direction; + le_int32 position; + le_int32 nextLimit; + le_int32 prevLimit; + + LEGlyphStorage &glyphStorage; + GlyphPositionAdjustments *glyphPositionAdjustments; + + le_int32 srcIndex; + le_int32 destIndex; + le_uint16 lookupFlags; + FeatureMask featureMask; + le_int32 featureParam; + le_int32 glyphGroup; + + const GlyphClassDefinitionTable *glyphClassDefinitionTable; + const MarkAttachClassDefinitionTable *markAttachClassDefinitionTable; + + GlyphIterator &operator=(const GlyphIterator &other); // forbid copying of this class +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphLookupTables.cpp b/Build/source/libs/icu/icu-50.1/layout/GlyphLookupTables.cpp new file mode 100644 index 00000000000..fdc646fe4f8 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphLookupTables.cpp @@ -0,0 +1,32 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "ScriptAndLanguage.h" +#include "GlyphLookupTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_bool GlyphLookupTableHeader::coversScript(LETag scriptTag) const +{ + const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset)); + + return scriptListOffset != 0 && scriptListTable->findScript(scriptTag) != NULL; +} + +le_bool GlyphLookupTableHeader::coversScriptAndLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch) const +{ + const ScriptListTable *scriptListTable = (const ScriptListTable *) ((char *)this + SWAPW(scriptListOffset)); + const LangSysTable *langSysTable = scriptListTable->findLanguage(scriptTag, languageTag, exactMatch); + + // FIXME: could check featureListOffset, lookupListOffset, and lookup count... + // Note: don't have to SWAPW langSysTable->featureCount to check for non-zero. + return langSysTable != NULL && langSysTable->featureCount != 0; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphLookupTables.h b/Build/source/libs/icu/icu-50.1/layout/GlyphLookupTables.h new file mode 100644 index 00000000000..65642d02e28 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphLookupTables.h @@ -0,0 +1,34 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __GLYPHLOOKUPTABLES_H +#define __GLYPHLOOKUPTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +struct GlyphLookupTableHeader +{ + fixed32 version; + Offset scriptListOffset; + Offset featureListOffset; + Offset lookupListOffset; + + le_bool coversScript(LETag scriptTag) const; + le_bool coversScriptAndLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const; +}; + +U_NAMESPACE_END + +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphPositionAdjustments.cpp b/Build/source/libs/icu/icu-50.1/layout/GlyphPositionAdjustments.cpp new file mode 100644 index 00000000000..900e1aeecef --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphPositionAdjustments.cpp @@ -0,0 +1,185 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "GlyphPositionAdjustments.h" +#include "LEGlyphStorage.h" +#include "LEFontInstance.h" + +U_NAMESPACE_BEGIN + +#define CHECK_ALLOCATE_ARRAY(array, type, size) \ + if (array == NULL) { \ + array = (type *) new type[size]; \ + } + +GlyphPositionAdjustments::GlyphPositionAdjustments(le_int32 glyphCount) + : fGlyphCount(glyphCount), fEntryExitPoints(NULL), fAdjustments(NULL) +{ + fAdjustments = (Adjustment *) new Adjustment[glyphCount]; +} + +GlyphPositionAdjustments::~GlyphPositionAdjustments() +{ + delete[] fEntryExitPoints; + delete[] fAdjustments; +} + +const LEPoint *GlyphPositionAdjustments::getEntryPoint(le_int32 index, LEPoint &entryPoint) const +{ + if (fEntryExitPoints == NULL) { + return NULL; + } + + return fEntryExitPoints[index].getEntryPoint(entryPoint); +} + +const LEPoint *GlyphPositionAdjustments::getExitPoint(le_int32 index, LEPoint &exitPoint)const +{ + if (fEntryExitPoints == NULL) { + return NULL; + } + + return fEntryExitPoints[index].getExitPoint(exitPoint); +} + +void GlyphPositionAdjustments::clearEntryPoint(le_int32 index) +{ + CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); + + fEntryExitPoints[index].clearEntryPoint(); +} + +void GlyphPositionAdjustments::clearExitPoint(le_int32 index) +{ + CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); + + fEntryExitPoints[index].clearExitPoint(); +} + +void GlyphPositionAdjustments::setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd) +{ + CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); + + fEntryExitPoints[index].setEntryPoint(newEntryPoint, baselineIsLogicalEnd); +} + +void GlyphPositionAdjustments::setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd) +{ + CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); + + fEntryExitPoints[index].setExitPoint(newExitPoint, baselineIsLogicalEnd); +} + +void GlyphPositionAdjustments::setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd) +{ + CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); + + fEntryExitPoints[index].setCursiveGlyph(baselineIsLogicalEnd); +} + +void GlyphPositionAdjustments::applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance) +{ + if (! hasCursiveGlyphs()) { + return; + } + + le_int32 start = 0, end = fGlyphCount, dir = 1; + le_int32 firstExitPoint = -1, lastExitPoint = -1; + LEPoint entryAnchor, exitAnchor, pixels; + LEGlyphID lastExitGlyphID = 0; + float baselineAdjustment = 0; + + // This removes a possible warning about + // using exitAnchor before it's been initialized. + exitAnchor.fX = exitAnchor.fY = 0; + + if (rightToLeft) { + start = fGlyphCount - 1; + end = -1; + dir = -1; + } + + for (le_int32 i = start; i != end; i += dir) { + LEGlyphID glyphID = glyphStorage[i]; + + if (isCursiveGlyph(i)) { + if (lastExitPoint >= 0 && getEntryPoint(i, entryAnchor) != NULL) { + float anchorDiffX = exitAnchor.fX - entryAnchor.fX; + float anchorDiffY = exitAnchor.fY - entryAnchor.fY; + + baselineAdjustment += anchorDiffY; + adjustYPlacement(i, baselineAdjustment); + + if (rightToLeft) { + LEPoint secondAdvance; + + fontInstance->getGlyphAdvance(glyphID, pixels); + fontInstance->pixelsToUnits(pixels, secondAdvance); + + adjustXAdvance(i, -(anchorDiffX + secondAdvance.fX)); + } else { + LEPoint firstAdvance; + + fontInstance->getGlyphAdvance(lastExitGlyphID, pixels); + fontInstance->pixelsToUnits(pixels, firstAdvance); + + adjustXAdvance(lastExitPoint, anchorDiffX - firstAdvance.fX); + } + } + + lastExitPoint = i; + + if (getExitPoint(i, exitAnchor) != NULL) { + if (firstExitPoint < 0) { + firstExitPoint = i; + } + + lastExitGlyphID = glyphID; + } else { + if (baselineIsLogicalEnd(i) && firstExitPoint >= 0 && lastExitPoint >= 0) { + le_int32 limit = lastExitPoint /*+ dir*/; + LEPoint dummyAnchor; + + if (getEntryPoint(i, dummyAnchor) != NULL) { + limit += dir; + } + + for (le_int32 j = firstExitPoint; j != limit; j += dir) { + if (isCursiveGlyph(j)) { + adjustYPlacement(j, -baselineAdjustment); + } + } + } + + firstExitPoint = lastExitPoint = -1; + baselineAdjustment = 0; + } + } + } +} + +LEPoint *GlyphPositionAdjustments::EntryExitPoint::getEntryPoint(LEPoint &entryPoint) const +{ + if (fFlags & EEF_HAS_ENTRY_POINT) { + entryPoint = fEntryPoint; + return &entryPoint; + } + + return NULL; +} + +LEPoint *GlyphPositionAdjustments::EntryExitPoint::getExitPoint(LEPoint &exitPoint) const +{ + if (fFlags & EEF_HAS_EXIT_POINT) { + exitPoint = fExitPoint; + return &exitPoint; + } + + return NULL; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphPositionAdjustments.h b/Build/source/libs/icu/icu-50.1/layout/GlyphPositionAdjustments.h new file mode 100644 index 00000000000..9c9e39bffe6 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphPositionAdjustments.h @@ -0,0 +1,376 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved + * + */ + +#ifndef __GLYPHPOSITIONADJUSTMENTS_H +#define __GLYPHPOSITIONADJUSTMENTS_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; +class LEFontInstance; + +class GlyphPositionAdjustments : public UMemory +{ +private: + class Adjustment : public UMemory { + public: + + inline Adjustment(); + inline Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff = -1); + inline ~Adjustment(); + + inline float getXPlacement() const; + inline float getYPlacement() const; + inline float getXAdvance() const; + inline float getYAdvance() const; + + inline le_int32 getBaseOffset() const; + + inline void setXPlacement(float newXPlacement); + inline void setYPlacement(float newYPlacement); + inline void setXAdvance(float newXAdvance); + inline void setYAdvance(float newYAdvance); + + inline void setBaseOffset(le_int32 newBaseOffset); + + inline void adjustXPlacement(float xAdjustment); + inline void adjustYPlacement(float yAdjustment); + inline void adjustXAdvance(float xAdjustment); + inline void adjustYAdvance(float yAdjustment); + + private: + float xPlacement; + float yPlacement; + float xAdvance; + float yAdvance; + + le_int32 baseOffset; + + // allow copying of this class because all of its fields are simple types + }; + + class EntryExitPoint : public UMemory + { + public: + inline EntryExitPoint(); + inline ~EntryExitPoint(); + + inline le_bool isCursiveGlyph() const; + inline le_bool baselineIsLogicalEnd() const; + + LEPoint *getEntryPoint(LEPoint &entryPoint) const; + LEPoint *getExitPoint(LEPoint &exitPoint) const; + + inline void clearEntryPoint(); + inline void clearExitPoint(); + inline void setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd); + inline void setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd); + inline void setCursiveGlyph(le_bool baselineIsLogicalEnd); + + private: + enum EntryExitFlags + { + EEF_HAS_ENTRY_POINT = 0x80000000L, + EEF_HAS_EXIT_POINT = 0x40000000L, + EEF_IS_CURSIVE_GLYPH = 0x20000000L, + EEF_BASELINE_IS_LOGICAL_END = 0x10000000L + }; + + le_uint32 fFlags; + LEPoint fEntryPoint; + LEPoint fExitPoint; + }; + + le_int32 fGlyphCount; + EntryExitPoint *fEntryExitPoints; + Adjustment *fAdjustments; + + GlyphPositionAdjustments(); + +public: + GlyphPositionAdjustments(le_int32 glyphCount); + ~GlyphPositionAdjustments(); + + inline le_bool hasCursiveGlyphs() const; + inline le_bool isCursiveGlyph(le_int32 index) const; + inline le_bool baselineIsLogicalEnd(le_int32 index) const; + + const LEPoint *getEntryPoint(le_int32 index, LEPoint &entryPoint) const; + const LEPoint *getExitPoint(le_int32 index, LEPoint &exitPoint) const; + + inline float getXPlacement(le_int32 index) const; + inline float getYPlacement(le_int32 index) const; + inline float getXAdvance(le_int32 index) const; + inline float getYAdvance(le_int32 index) const; + + inline le_int32 getBaseOffset(le_int32 index) const; + + inline void setXPlacement(le_int32 index, float newXPlacement); + inline void setYPlacement(le_int32 index, float newYPlacement); + inline void setXAdvance(le_int32 index, float newXAdvance); + inline void setYAdvance(le_int32 index, float newYAdvance); + + inline void setBaseOffset(le_int32 index, le_int32 newBaseOffset); + + inline void adjustXPlacement(le_int32 index, float xAdjustment); + inline void adjustYPlacement(le_int32 index, float yAdjustment); + inline void adjustXAdvance(le_int32 index, float xAdjustment); + inline void adjustYAdvance(le_int32 index, float yAdjustment); + + void clearEntryPoint(le_int32 index); + void clearExitPoint(le_int32 index); + void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd); + void setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd); + void setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd); + + void applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance); +}; + +inline GlyphPositionAdjustments::Adjustment::Adjustment() + : xPlacement(0), yPlacement(0), xAdvance(0), yAdvance(0), baseOffset(-1) +{ + // nothing else to do! +} + +inline GlyphPositionAdjustments::Adjustment::Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff) + : xPlacement(xPlace), yPlacement(yPlace), xAdvance(xAdv), yAdvance(yAdv), baseOffset(baseOff) +{ + // nothing else to do! +} + +inline GlyphPositionAdjustments::Adjustment::~Adjustment() +{ + // nothing to do! +} + +inline float GlyphPositionAdjustments::Adjustment::getXPlacement() const +{ + return xPlacement; +} + +inline float GlyphPositionAdjustments::Adjustment::getYPlacement() const +{ + return yPlacement; +} + +inline float GlyphPositionAdjustments::Adjustment::getXAdvance() const +{ + return xAdvance; +} + +inline float GlyphPositionAdjustments::Adjustment::getYAdvance() const +{ + return yAdvance; +} + +inline le_int32 GlyphPositionAdjustments::Adjustment::getBaseOffset() const +{ + return baseOffset; +} + +inline void GlyphPositionAdjustments::Adjustment::setXPlacement(float newXPlacement) +{ + xPlacement = newXPlacement; +} + +inline void GlyphPositionAdjustments::Adjustment::setYPlacement(float newYPlacement) +{ + yPlacement = newYPlacement; +} + +inline void GlyphPositionAdjustments::Adjustment::setXAdvance(float newXAdvance) +{ + xAdvance = newXAdvance; +} + +inline void GlyphPositionAdjustments::Adjustment::setYAdvance(float newYAdvance) +{ + yAdvance = newYAdvance; +} + +inline void GlyphPositionAdjustments::Adjustment::setBaseOffset(le_int32 newBaseOffset) +{ + baseOffset = newBaseOffset; +} + +inline void GlyphPositionAdjustments::Adjustment::adjustXPlacement(float xAdjustment) +{ + xPlacement += xAdjustment; +} + +inline void GlyphPositionAdjustments::Adjustment::adjustYPlacement(float yAdjustment) +{ + yPlacement += yAdjustment; +} + +inline void GlyphPositionAdjustments::Adjustment::adjustXAdvance(float xAdjustment) +{ + xAdvance += xAdjustment; +} + +inline void GlyphPositionAdjustments::Adjustment::adjustYAdvance(float yAdjustment) +{ + yAdvance += yAdjustment; +} + +inline GlyphPositionAdjustments::EntryExitPoint::EntryExitPoint() + : fFlags(0) +{ + fEntryPoint.fX = fEntryPoint.fY = fExitPoint.fX = fExitPoint.fY = 0; +} + +inline GlyphPositionAdjustments::EntryExitPoint::~EntryExitPoint() +{ + // nothing special to do +} + +inline le_bool GlyphPositionAdjustments::EntryExitPoint::isCursiveGlyph() const +{ + return (fFlags & EEF_IS_CURSIVE_GLYPH) != 0; +} + +inline le_bool GlyphPositionAdjustments::EntryExitPoint::baselineIsLogicalEnd() const +{ + return (fFlags & EEF_BASELINE_IS_LOGICAL_END) != 0; +} + +inline void GlyphPositionAdjustments::EntryExitPoint::clearEntryPoint() +{ + fFlags &= ~EEF_HAS_ENTRY_POINT; +} + +inline void GlyphPositionAdjustments::EntryExitPoint::clearExitPoint() +{ + fFlags &= ~EEF_HAS_EXIT_POINT; +} + +inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd) +{ + if (baselineIsLogicalEnd) { + fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); + } else { + fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH); + } + + fEntryPoint = newEntryPoint; +} + +inline void GlyphPositionAdjustments::EntryExitPoint::setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd) +{ + if (baselineIsLogicalEnd) { + fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); + } else { + fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH); + } + + fExitPoint = newExitPoint; +} + +inline void GlyphPositionAdjustments::EntryExitPoint::setCursiveGlyph(le_bool baselineIsLogicalEnd) +{ + if (baselineIsLogicalEnd) { + fFlags |= (EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); + } else { + fFlags |= EEF_IS_CURSIVE_GLYPH; + } +} + +inline le_bool GlyphPositionAdjustments::isCursiveGlyph(le_int32 index) const +{ + return fEntryExitPoints != NULL && fEntryExitPoints[index].isCursiveGlyph(); +} + +inline le_bool GlyphPositionAdjustments::baselineIsLogicalEnd(le_int32 index) const +{ + return fEntryExitPoints != NULL && fEntryExitPoints[index].baselineIsLogicalEnd(); +} + +inline float GlyphPositionAdjustments::getXPlacement(le_int32 index) const +{ + return fAdjustments[index].getXPlacement(); +} + +inline float GlyphPositionAdjustments::getYPlacement(le_int32 index) const +{ + return fAdjustments[index].getYPlacement(); +} + +inline float GlyphPositionAdjustments::getXAdvance(le_int32 index) const +{ + return fAdjustments[index].getXAdvance(); +} + +inline float GlyphPositionAdjustments::getYAdvance(le_int32 index) const +{ + return fAdjustments[index].getYAdvance(); +} + + +inline le_int32 GlyphPositionAdjustments::getBaseOffset(le_int32 index) const +{ + return fAdjustments[index].getBaseOffset(); +} + +inline void GlyphPositionAdjustments::setXPlacement(le_int32 index, float newXPlacement) +{ + fAdjustments[index].setXPlacement(newXPlacement); +} + +inline void GlyphPositionAdjustments::setYPlacement(le_int32 index, float newYPlacement) +{ + fAdjustments[index].setYPlacement(newYPlacement); +} + +inline void GlyphPositionAdjustments::setXAdvance(le_int32 index, float newXAdvance) +{ + fAdjustments[index].setXAdvance(newXAdvance); +} + +inline void GlyphPositionAdjustments::setYAdvance(le_int32 index, float newYAdvance) +{ + fAdjustments[index].setYAdvance(newYAdvance); +} + +inline void GlyphPositionAdjustments::setBaseOffset(le_int32 index, le_int32 newBaseOffset) +{ + fAdjustments[index].setBaseOffset(newBaseOffset); +} + +inline void GlyphPositionAdjustments::adjustXPlacement(le_int32 index, float xAdjustment) +{ + fAdjustments[index].adjustXPlacement(xAdjustment); +} + +inline void GlyphPositionAdjustments::adjustYPlacement(le_int32 index, float yAdjustment) +{ + fAdjustments[index].adjustYPlacement(yAdjustment); +} + +inline void GlyphPositionAdjustments::adjustXAdvance(le_int32 index, float xAdjustment) +{ + fAdjustments[index].adjustXAdvance(xAdjustment); +} + +inline void GlyphPositionAdjustments::adjustYAdvance(le_int32 index, float yAdjustment) +{ + fAdjustments[index].adjustYAdvance(yAdjustment); +} + +inline le_bool GlyphPositionAdjustments::hasCursiveGlyphs() const +{ + return fEntryExitPoints != NULL; +} + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphPositioningTables.cpp b/Build/source/libs/icu/icu-50.1/layout/GlyphPositioningTables.cpp new file mode 100644 index 00000000000..b973fb7ae99 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphPositioningTables.cpp @@ -0,0 +1,38 @@ +/* + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "Lookups.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositioningTables.h" +#include "GlyphPosnLookupProc.h" +#include "CursiveAttachmentSubtables.h" +#include "LEGlyphStorage.h" +#include "GlyphPositionAdjustments.h" + +U_NAMESPACE_BEGIN + +void GlyphPositioningTableHeader::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft, + LETag scriptTag, LETag languageTag, + const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, LEErrorCode &success, + const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const +{ + if (LE_FAILURE(success)) { + return; + } + + GlyphPositioningLookupProcessor processor(this, scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success); + if (LE_FAILURE(success)) { + return; + } + + processor.process(glyphStorage, glyphPositionAdjustments, rightToLeft, glyphDefinitionTableHeader, fontInstance, success); + + glyphPositionAdjustments->applyCursiveAdjustments(glyphStorage, rightToLeft, fontInstance); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphPositioningTables.h b/Build/source/libs/icu/icu-50.1/layout/GlyphPositioningTables.h new file mode 100644 index 00000000000..590488cd679 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphPositioningTables.h @@ -0,0 +1,51 @@ +/* + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#ifndef __GLYPHPOSITIONINGTABLES_H +#define __GLYPHPOSITIONINGTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "Lookups.h" +#include "GlyphLookupTables.h" + +U_NAMESPACE_BEGIN + +class LEFontInstance; +class LEGlyphStorage; +class LEGlyphFilter; +class GlyphPositionAdjustments; +struct GlyphDefinitionTableHeader; + +struct GlyphPositioningTableHeader : public GlyphLookupTableHeader +{ + void process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, + le_bool rightToLeft, LETag scriptTag, LETag languageTag, + const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, LEErrorCode &success, + const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const; +}; + +enum GlyphPositioningSubtableTypes +{ + gpstSingle = 1, + gpstPair = 2, + gpstCursive = 3, + gpstMarkToBase = 4, + gpstMarkToLigature = 5, + gpstMarkToMark = 6, + gpstContext = 7, + gpstChainedContext = 8, + gpstExtension = 9 +}; + +typedef LookupSubtable GlyphPositioningSubtable; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphPosnLookupProc.cpp b/Build/source/libs/icu/icu-50.1/layout/GlyphPosnLookupProc.cpp new file mode 100644 index 00000000000..de325140364 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphPosnLookupProc.cpp @@ -0,0 +1,161 @@ +/* + * (C) Copyright IBM Corp. 1998 - 2010 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "ICUFeatures.h" +#include "Lookups.h" +#include "ScriptAndLanguage.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositioningTables.h" +#include "SinglePositioningSubtables.h" +#include "PairPositioningSubtables.h" +#include "CursiveAttachmentSubtables.h" +#include "MarkToBasePosnSubtables.h" +#include "MarkToLigaturePosnSubtables.h" +#include "MarkToMarkPosnSubtables.h" +//#include "ContextualPositioningSubtables.h" +#include "ContextualSubstSubtables.h" +#include "ExtensionSubtables.h" +#include "LookupProcessor.h" +#include "GlyphPosnLookupProc.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +// Aside from the names, the contextual positioning subtables are +// the same as the contextual substitution subtables. +typedef ContextualSubstitutionSubtable ContextualPositioningSubtable; +typedef ChainingContextualSubstitutionSubtable ChainingContextualPositioningSubtable; + +GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor( + const GlyphPositioningTableHeader *glyphPositioningTableHeader, + LETag scriptTag, + LETag languageTag, + const FeatureMap *featureMap, + le_int32 featureMapCount, + le_bool featureOrder, + LEErrorCode& success) + : LookupProcessor( + (char *) glyphPositioningTableHeader, + SWAPW(glyphPositioningTableHeader->scriptListOffset), + SWAPW(glyphPositioningTableHeader->featureListOffset), + SWAPW(glyphPositioningTableHeader->lookupListOffset), + scriptTag, + languageTag, + featureMap, + featureMapCount, + featureOrder, + success + ) +{ + // anything? +} + +GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor() +{ +} + +le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + le_uint32 delta = 0; + + switch(lookupType) + { + case 0: + break; + + case gpstSingle: + { + const SinglePositioningSubtable *subtable = (const SinglePositioningSubtable *) lookupSubtable; + + delta = subtable->process(glyphIterator, fontInstance); + break; + } + + case gpstPair: + { + const PairPositioningSubtable *subtable = (const PairPositioningSubtable *) lookupSubtable; + + delta = subtable->process(glyphIterator, fontInstance); + break; + } + + case gpstCursive: + { + const CursiveAttachmentSubtable *subtable = (const CursiveAttachmentSubtable *) lookupSubtable; + + delta = subtable->process(glyphIterator, fontInstance); + break; + } + + case gpstMarkToBase: + { + const MarkToBasePositioningSubtable *subtable = (const MarkToBasePositioningSubtable *) lookupSubtable; + + delta = subtable->process(glyphIterator, fontInstance); + break; + } + + case gpstMarkToLigature: + { + const MarkToLigaturePositioningSubtable *subtable = (const MarkToLigaturePositioningSubtable *) lookupSubtable; + + delta = subtable->process(glyphIterator, fontInstance); + break; + } + + case gpstMarkToMark: + { + const MarkToMarkPositioningSubtable *subtable = (const MarkToMarkPositioningSubtable *) lookupSubtable; + + delta = subtable->process(glyphIterator, fontInstance); + break; + } + + case gpstContext: + { + const ContextualPositioningSubtable *subtable = (const ContextualPositioningSubtable *) lookupSubtable; + + delta = subtable->process(this, glyphIterator, fontInstance, success); + break; + } + + case gpstChainedContext: + { + const ChainingContextualPositioningSubtable *subtable = (const ChainingContextualPositioningSubtable *) lookupSubtable; + + delta = subtable->process(this, glyphIterator, fontInstance, success); + break; + } + + case gpstExtension: + { + const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable; + + delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success); + break; + } + + default: + break; + } + + return delta; +} + +GlyphPositioningLookupProcessor::~GlyphPositioningLookupProcessor() +{ +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphPosnLookupProc.h b/Build/source/libs/icu/icu-50.1/layout/GlyphPosnLookupProc.h new file mode 100644 index 00000000000..b251137caf6 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphPosnLookupProc.h @@ -0,0 +1,52 @@ +/* + * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +#ifndef __GLYPHPOSITIONINGLOOKUPPROCESSOR_H +#define __GLYPHPOSITIONINGLOOKUPPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "Lookups.h" +#include "ICUFeatures.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositioningTables.h" +#include "GlyphIterator.h" +#include "LookupProcessor.h" + +U_NAMESPACE_BEGIN + +class GlyphPositioningLookupProcessor : public LookupProcessor +{ +public: + GlyphPositioningLookupProcessor(const GlyphPositioningTableHeader *glyphPositioningTableHeader, + LETag scriptTag, + LETag languageTag, + const FeatureMap *featureMap, + le_int32 featureMapCount, + le_bool featureOrder, + LEErrorCode& success); + + virtual ~GlyphPositioningLookupProcessor(); + + virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, LEErrorCode& success) const; + +protected: + GlyphPositioningLookupProcessor(); + +private: + + GlyphPositioningLookupProcessor(const GlyphPositioningLookupProcessor &other); // forbid copying of this class + GlyphPositioningLookupProcessor &operator=(const GlyphPositioningLookupProcessor &other); // forbid copying of this class +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphSubstLookupProc.cpp b/Build/source/libs/icu/icu-50.1/layout/GlyphSubstLookupProc.cpp new file mode 100644 index 00000000000..195de9dce33 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphSubstLookupProc.cpp @@ -0,0 +1,132 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "ICUFeatures.h" +#include "Lookups.h" +#include "ScriptAndLanguage.h" +#include "GlyphDefinitionTables.h" +#include "GlyphSubstitutionTables.h" +#include "SingleSubstitutionSubtables.h" +#include "MultipleSubstSubtables.h" +#include "AlternateSubstSubtables.h" +#include "LigatureSubstSubtables.h" +#include "ContextualSubstSubtables.h" +#include "ExtensionSubtables.h" +#include "LookupProcessor.h" +#include "GlyphSubstLookupProc.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor( + const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader, + LETag scriptTag, + LETag languageTag, + const LEGlyphFilter *filter, + const FeatureMap *featureMap, + le_int32 featureMapCount, + le_bool featureOrder, + LEErrorCode& success) + : LookupProcessor( + (char *) glyphSubstitutionTableHeader, + SWAPW(glyphSubstitutionTableHeader->scriptListOffset), + SWAPW(glyphSubstitutionTableHeader->featureListOffset), + SWAPW(glyphSubstitutionTableHeader->lookupListOffset), + scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success), fFilter(filter) +{ + // anything? +} + +GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor() +{ +} + +le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, + GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + le_uint32 delta = 0; + + switch(lookupType) + { + case 0: + break; + + case gsstSingle: + { + const SingleSubstitutionSubtable *subtable = (const SingleSubstitutionSubtable *) lookupSubtable; + + delta = subtable->process(glyphIterator, fFilter); + break; + } + + case gsstMultiple: + { + const MultipleSubstitutionSubtable *subtable = (const MultipleSubstitutionSubtable *) lookupSubtable; + + delta = subtable->process(glyphIterator, success, fFilter); + break; + } + + case gsstAlternate: + { + const AlternateSubstitutionSubtable *subtable = (const AlternateSubstitutionSubtable *) lookupSubtable; + + delta = subtable->process(glyphIterator, fFilter); + break; + } + + case gsstLigature: + { + const LigatureSubstitutionSubtable *subtable = (const LigatureSubstitutionSubtable *) lookupSubtable; + + delta = subtable->process(glyphIterator, fFilter); + break; + } + + case gsstContext: + { + const ContextualSubstitutionSubtable *subtable = (const ContextualSubstitutionSubtable *) lookupSubtable; + + delta = subtable->process(this, glyphIterator, fontInstance, success); + break; + } + + case gsstChainingContext: + { + const ChainingContextualSubstitutionSubtable *subtable = (const ChainingContextualSubstitutionSubtable *) lookupSubtable; + + delta = subtable->process(this, glyphIterator, fontInstance, success); + break; + } + + case gsstExtension: + { + const ExtensionSubtable *subtable = (const ExtensionSubtable *) lookupSubtable; + + delta = subtable->process(this, lookupType, glyphIterator, fontInstance, success); + break; + } + + default: + break; + } + + return delta; +} + +GlyphSubstitutionLookupProcessor::~GlyphSubstitutionLookupProcessor() +{ +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphSubstLookupProc.h b/Build/source/libs/icu/icu-50.1/layout/GlyphSubstLookupProc.h new file mode 100644 index 00000000000..ef04db253d2 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphSubstLookupProc.h @@ -0,0 +1,55 @@ +/* + * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +#ifndef __GLYPHSUBSTITUTIONLOOKUPPROCESSOR_H +#define __GLYPHSUBSTITUTIONLOOKUPPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "Lookups.h" +#include "ICUFeatures.h" +#include "GlyphDefinitionTables.h" +#include "GlyphSubstitutionTables.h" +#include "GlyphIterator.h" +#include "LookupProcessor.h" + +U_NAMESPACE_BEGIN + +class GlyphSubstitutionLookupProcessor : public LookupProcessor +{ +public: + GlyphSubstitutionLookupProcessor(const GlyphSubstitutionTableHeader *glyphSubstitutionTableHeader, + LETag scriptTag, + LETag languageTag, + const LEGlyphFilter *filter, + const FeatureMap *featureMap, + le_int32 featureMapCount, + le_bool featureOrder, + LEErrorCode& success); + + virtual ~GlyphSubstitutionLookupProcessor(); + + virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, LEErrorCode& success) const; + +protected: + GlyphSubstitutionLookupProcessor(); + +private: + const LEGlyphFilter *fFilter; + + GlyphSubstitutionLookupProcessor(const GlyphSubstitutionLookupProcessor &other); // forbid copying of this class + GlyphSubstitutionLookupProcessor &operator=(const GlyphSubstitutionLookupProcessor &other); // forbid copying of this class +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphSubstitutionTables.cpp b/Build/source/libs/icu/icu-50.1/layout/GlyphSubstitutionTables.cpp new file mode 100644 index 00000000000..bdd81277124 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphSubstitutionTables.cpp @@ -0,0 +1,39 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" +#include "Lookups.h" +#include "GlyphDefinitionTables.h" +#include "GlyphSubstitutionTables.h" +#include "GlyphSubstLookupProc.h" +#include "ScriptAndLanguage.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_int32 GlyphSubstitutionTableHeader::process(LEGlyphStorage &glyphStorage, + le_bool rightToLeft, + LETag scriptTag, + LETag languageTag, + const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, + const LEGlyphFilter *filter, + const FeatureMap *featureMap, + le_int32 featureMapCount, + le_bool featureOrder, + LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + GlyphSubstitutionLookupProcessor processor(this, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder, success); + return processor.process(glyphStorage, NULL, rightToLeft, glyphDefinitionTableHeader, NULL, success); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/GlyphSubstitutionTables.h b/Build/source/libs/icu/icu-50.1/layout/GlyphSubstitutionTables.h new file mode 100644 index 00000000000..b899bee4bfc --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/GlyphSubstitutionTables.h @@ -0,0 +1,55 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#ifndef __GLYPHSUBSTITUTIONTABLES_H +#define __GLYPHSUBSTITUTIONTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "Lookups.h" +#include "GlyphLookupTables.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; +class LEGlyphFilter; +struct GlyphDefinitionTableHeader; + +struct GlyphSubstitutionTableHeader : public GlyphLookupTableHeader +{ + le_int32 process(LEGlyphStorage &glyphStorage, + le_bool rightToLeft, + LETag scriptTag, + LETag languageTag, + const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, + const LEGlyphFilter *filter, + const FeatureMap *featureMap, + le_int32 featureMapCount, + le_bool featureOrder, + LEErrorCode &success) const; +}; + +enum GlyphSubstitutionSubtableTypes +{ + gsstSingle = 1, + gsstMultiple = 2, + gsstAlternate = 3, + gsstLigature = 4, + gsstContext = 5, + gsstChainingContext = 6, + gsstExtension = 7, + gsstReverseChaining = 8 +}; + +typedef LookupSubtable GlyphSubstitutionSubtable; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/HanLayoutEngine.cpp b/Build/source/libs/icu/icu-50.1/layout/HanLayoutEngine.cpp new file mode 100644 index 00000000000..31dc8187c43 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/HanLayoutEngine.cpp @@ -0,0 +1,84 @@ +/* + * HanLayoutEngine.cpp: OpenType processing for Han fonts. + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved. + */ + +#include "LETypes.h" +#include "LEScripts.h" +#include "LELanguages.h" + +#include "LayoutEngine.h" +#include "OpenTypeLayoutEngine.h" +#include "HanLayoutEngine.h" +#include "ScriptAndLanguageTags.h" +#include "LEGlyphStorage.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HanOpenTypeLayoutEngine) + +#define loclFeatureTag LE_LOCL_FEATURE_TAG +#define smplFeatureTag LE_SMPL_FEATURE_TAG +#define tradFeatureTag LE_TRAD_FEATURE_TAG + +#define loclFeatureMask 0x80000000UL +#define smplFeatureMask 0x40000000UL +#define tradFeatureMask 0x20000000UL + +static const FeatureMap featureMap[] = +{ + {loclFeatureTag, loclFeatureMask}, + {smplFeatureTag, smplFeatureMask}, + {tradFeatureTag, tradFeatureMask} +}; + +static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); + +#define features (loclFeatureMask) + +HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) +{ + fFeatureMap = featureMap; + fFeatureMapCount = featureMapCount; +} + +HanOpenTypeLayoutEngine::~HanOpenTypeLayoutEngine() +{ + // nothing to do +} + +le_int32 HanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, + LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + glyphStorage.allocateGlyphArray(count, FALSE, success); + glyphStorage.allocateAuxData(success); + + if (LE_FAILURE(success)) { + return 0; + } + + // FIXME: do we want to add the 'trad' feature for 'ZHT' and the + // 'smpl' feature for 'ZHS'? If we do this, we can remove the exact + // flag from the language tag lookups, so we can use these features + // with the default LangSys... + for (le_int32 i = 0; i < count; i += 1) { + glyphStorage.setAuxData(i, features, success); + } + + return count; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/HanLayoutEngine.h b/Build/source/libs/icu/icu-50.1/layout/HanLayoutEngine.h new file mode 100644 index 00000000000..f02153bcad1 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/HanLayoutEngine.h @@ -0,0 +1,105 @@ + +/* + * HanLayoutEngine.h: OpenType processing for Han fonts. + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved. + */ + +#ifndef __HANLAYOUTENGINE_H +#define __HANLAYOUTENGINE_H + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "LayoutEngine.h" +#include "OpenTypeLayoutEngine.h" + +#include "GlyphSubstitutionTables.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +/** + * This class implements OpenType layout for Han fonts. It overrides + * the characerProcessing method to assign the correct OpenType feature + * tags for the CJK language-specific forms. + * + * @internal + */ +class HanOpenTypeLayoutEngine : public OpenTypeLayoutEngine +{ +public: + /** + * This is the main constructor. It constructs an instance of HanOpenTypeLayoutEngine for + * a particular font, script and language. It takes the GSUB table as a parameter since + * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has a + * Han OpenType font. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param gsubTable - the GSUB table + * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see OpenTypeLayoutEngine + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ + HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTablem, LEErrorCode &success); + + + /** + * The destructor, virtual for correct polymorphic invocation. + * + * @internal + */ + virtual ~HanOpenTypeLayoutEngine(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +protected: + + /** + * This method does Han OpenType character processing. It assigns the OpenType feature + * tags to the characters to generate the correct language-specific variants. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run + * @param glyphStorage - the object holding the glyph storage. The char index and auxillary data arrays will be set. + * + * Output parameters: + * @param outChars - the output character arrayt + * @param charIndices - the output character index array + * @param featureTags - the output feature tag array + * @param success - set to an error code if the operation fails + * + * @return the output character count + * + * @internal + */ + virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/HangulLayoutEngine.cpp b/Build/source/libs/icu/icu-50.1/layout/HangulLayoutEngine.cpp new file mode 100644 index 00000000000..ad4731e5ee3 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/HangulLayoutEngine.cpp @@ -0,0 +1,338 @@ +/* + * HangulLayoutEngine.cpp: OpenType processing for Han fonts. + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved. + */ + +#include "LETypes.h" +#include "LEScripts.h" +#include "LELanguages.h" + +#include "LayoutEngine.h" +#include "OpenTypeLayoutEngine.h" +#include "HangulLayoutEngine.h" +#include "ScriptAndLanguageTags.h" +#include "LEGlyphStorage.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HangulOpenTypeLayoutEngine) + + +#define FEATURE_MAP(name) {name ## FeatureTag, name ## FeatureMask} + +#define LJMO_FIRST 0x1100 +#define LJMO_LAST 0x1159 +#define LJMO_FILL 0x115F +#define LJMO_COUNT 19 + +#define VJMO_FIRST 0x1161 +#define VJMO_LAST 0x11A2 +#define VJMO_FILL 0x1160 +#define VJMO_COUNT 21 + +#define TJMO_FIRST 0x11A7 +#define TJMO_LAST 0x11F9 +#define TJMO_COUNT 28 + +#define HSYL_FIRST 0xAC00 +#define HSYL_COUNT 11172 +#define HSYL_LVCNT (VJMO_COUNT * TJMO_COUNT) + +// Character classes +enum +{ + CC_L = 0, + CC_V, + CC_T, + CC_LV, + CC_LVT, + CC_X, + CC_COUNT +}; + +// Action flags +#define AF_L 1 +#define AF_V 2 +#define AF_T 4 + +// Actions +#define a_N 0 +#define a_L (AF_L) +#define a_V (AF_V) +#define a_T (AF_T) +#define a_VT (AF_V | AF_T) +#define a_LV (AF_L | AF_V) +#define a_LVT (AF_L | AF_V | AF_T) + +typedef struct +{ + int32_t newState; + int32_t actionFlags; +} StateTransition; + +static const StateTransition stateTable[][CC_COUNT] = +{ +// L V T LV LVT X + { {1, a_L}, {2, a_LV}, {3, a_LVT}, {2, a_LV}, {3, a_LVT}, {4, a_T}}, // 0 - start + { {1, a_L}, {2, a_V}, {3, a_VT}, {2, a_LV}, {3, a_LVT}, {-1, a_V}}, // 1 - L+ + {{-1, a_N}, {2, a_V}, {3, a_T}, {-1, a_N}, {-1, a_N}, {-1, a_N}}, // 2 - L+V+ + {{-1, a_N}, {-1, a_N}, {3, a_T}, {-1, a_N}, {-1, a_N}, {-1, a_N}}, // 3 - L+V+T* + {{-1, a_N}, {-1, a_N}, {-1, a_N}, {-1, a_N}, {-1, a_N}, {4, a_T}} // 4 - X+ +}; + + +#define ccmpFeatureTag LE_CCMP_FEATURE_TAG +#define ljmoFeatureTag LE_LJMO_FEATURE_TAG +#define vjmoFeatureTag LE_VJMO_FEATURE_TAG +#define tjmoFeatureTag LE_TJMO_FEATURE_TAG + +#define ccmpFeatureMask 0x80000000UL +#define ljmoFeatureMask 0x40000000UL +#define vjmoFeatureMask 0x20000000UL +#define tjmoFeatureMask 0x10000000UL + +static const FeatureMap featureMap[] = +{ + {ccmpFeatureTag, ccmpFeatureMask}, + {ljmoFeatureTag, ljmoFeatureMask}, + {vjmoFeatureTag, vjmoFeatureMask}, + {tjmoFeatureTag, tjmoFeatureMask} +}; + +static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); + +#define nullFeatures 0 +#define ljmoFeatures (ccmpFeatureMask | ljmoFeatureMask) +#define vjmoFeatures (ccmpFeatureMask | vjmoFeatureMask | ljmoFeatureMask | tjmoFeatureMask) +#define tjmoFeatures (ccmpFeatureMask | tjmoFeatureMask | ljmoFeatureMask | vjmoFeatureMask) + +static le_int32 compose(LEUnicode lead, LEUnicode vowel, LEUnicode trail, LEUnicode &syllable) +{ + le_int32 lIndex = lead - LJMO_FIRST; + le_int32 vIndex = vowel - VJMO_FIRST; + le_int32 tIndex = trail - TJMO_FIRST; + le_int32 result = 3; + + if ((lIndex < 0 || lIndex >= LJMO_COUNT ) || (vIndex < 0 || vIndex >= VJMO_COUNT)) { + return 0; + } + + if (tIndex <= 0 || tIndex >= TJMO_COUNT) { + tIndex = 0; + result = 2; + } + + syllable = (LEUnicode) ((lIndex * VJMO_COUNT + vIndex) * TJMO_COUNT + tIndex + HSYL_FIRST); + + return result; +} + +static le_int32 decompose(LEUnicode syllable, LEUnicode &lead, LEUnicode &vowel, LEUnicode &trail) +{ + le_int32 sIndex = syllable - HSYL_FIRST; + + if (sIndex < 0 || sIndex >= HSYL_COUNT) { + return 0; + } + + lead = LJMO_FIRST + (sIndex / HSYL_LVCNT); + vowel = VJMO_FIRST + (sIndex % HSYL_LVCNT) / TJMO_COUNT; + trail = TJMO_FIRST + (sIndex % TJMO_COUNT); + + if (trail == TJMO_FIRST) { + return 2; + } + + return 3; +} + +static le_int32 getCharClass(LEUnicode ch, LEUnicode &lead, LEUnicode &vowel, LEUnicode &trail) +{ + lead = LJMO_FILL; + vowel = VJMO_FILL; + trail = TJMO_FIRST; + + if (ch >= LJMO_FIRST && ch <= LJMO_LAST) { + lead = ch; + return CC_L; + } + + if (ch >= VJMO_FIRST && ch <= VJMO_LAST) { + vowel = ch; + return CC_V; + } + + if (ch > TJMO_FIRST && ch <= TJMO_LAST) { + trail = ch; + return CC_T; + } + + le_int32 c = decompose(ch, lead, vowel, trail); + + if (c == 2) { + return CC_LV; + } + + if (c == 3) { + return CC_LVT; + } + + trail = ch; + return CC_X; +} + +HangulOpenTypeLayoutEngine::HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 /*languageCode*/, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, korLanguageCode, typoFlags, gsubTable, success) +{ + fFeatureMap = featureMap; + fFeatureMapCount = featureMapCount; + fFeatureOrder = TRUE; +} + +HangulOpenTypeLayoutEngine::HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 /*languageCode*/, + le_int32 typoFlags, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, korLanguageCode, typoFlags, success) +{ + fFeatureMap = featureMap; + fFeatureMapCount = featureMapCount; + fFeatureOrder = TRUE; +} + +HangulOpenTypeLayoutEngine::~HangulOpenTypeLayoutEngine() +{ + // nothing to do +} + +le_int32 HangulOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + le_int32 worstCase = count * 3; + + outChars = LE_NEW_ARRAY(LEUnicode, worstCase); + + if (outChars == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); + glyphStorage.allocateAuxData(success); + + if (LE_FAILURE(success)) { + LE_DELETE_ARRAY(outChars); + return 0; + } + + le_int32 outCharCount = 0; + le_int32 limit = offset + count; + le_int32 i = offset; + + while (i < limit) { + le_int32 state = 0; + le_int32 inStart = i; + le_int32 outStart = outCharCount; + + while( i < limit) { + LEUnicode lead = 0; + LEUnicode vowel = 0; + LEUnicode trail = 0; + int32_t chClass = getCharClass(chars[i], lead, vowel, trail); + const StateTransition transition = stateTable[state][chClass]; + + if (chClass == CC_X) { + /* Any character of type X will be stored as a trail jamo */ + if ((transition.actionFlags & AF_T) != 0) { + outChars[outCharCount] = trail; + glyphStorage.setCharIndex(outCharCount, i-offset, success); + glyphStorage.setAuxData(outCharCount++, nullFeatures, success); + } + } else { + /* Any Hangul will be fully decomposed. Output the decomposed characters. */ + if ((transition.actionFlags & AF_L) != 0) { + outChars[outCharCount] = lead; + glyphStorage.setCharIndex(outCharCount, i-offset, success); + glyphStorage.setAuxData(outCharCount++, ljmoFeatures, success); + } + + if ((transition.actionFlags & AF_V) != 0) { + outChars[outCharCount] = vowel; + glyphStorage.setCharIndex(outCharCount, i-offset, success); + glyphStorage.setAuxData(outCharCount++, vjmoFeatures, success); + } + + if ((transition.actionFlags & AF_T) != 0) { + outChars[outCharCount] = trail; + glyphStorage.setCharIndex(outCharCount, i-offset, success); + glyphStorage.setAuxData(outCharCount++, tjmoFeatures, success); + } + } + + state = transition.newState; + + /* Negative next state means stop. */ + if (state < 0) { + break; + } + + i += 1; + } + + le_int32 inLength = i - inStart; + le_int32 outLength = outCharCount - outStart; + + /* + * See if the syllable can be composed into a single character. There are 5 + * possible cases: + * + * Input Decomposed to Compose to + * LV L, V LV + * LVT L, V, T LVT + * L, V L, V LV, DEL + * LV, T L, V, T LVT, DEL + * L, V, T L, V, T LVT, DEL, DEL + */ + if ((inLength >= 1 && inLength <= 3) && (outLength == 2 || outLength == 3)) { + LEUnicode syllable = 0x0000; + LEUnicode lead = outChars[outStart]; + LEUnicode vowel = outChars[outStart + 1]; + LEUnicode trail = outLength == 3? outChars[outStart + 2] : TJMO_FIRST; + + /* + * If the composition consumes the whole decomposed syllable, + * we can use it. + */ + if (compose(lead, vowel, trail, syllable) == outLength) { + outCharCount = outStart; + outChars[outCharCount] = syllable; + glyphStorage.setCharIndex(outCharCount, inStart-offset, success); + glyphStorage.setAuxData(outCharCount++, nullFeatures, success); + + /* + * Replace the rest of the input characters with DEL. + */ + for(le_int32 d = inStart + 1; d < i; d += 1) { + outChars[outCharCount] = 0xFFFF; + glyphStorage.setCharIndex(outCharCount, d - offset, success); + glyphStorage.setAuxData(outCharCount++, nullFeatures, success); + } + } + } + } + + glyphStorage.adoptGlyphCount(outCharCount); + return outCharCount; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/HangulLayoutEngine.h b/Build/source/libs/icu/icu-50.1/layout/HangulLayoutEngine.h new file mode 100644 index 00000000000..70a46c4064f --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/HangulLayoutEngine.h @@ -0,0 +1,127 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#ifndef __HANGULAYOUTENGINE_H +#define __HANGULAYOUTENGINE_H + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "LEGlyphFilter.h" +#include "LayoutEngine.h" +#include "OpenTypeLayoutEngine.h" + +#include "GlyphSubstitutionTables.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositioningTables.h" + +U_NAMESPACE_BEGIN + +class MPreFixups; +class LEGlyphStorage; + +/** + * This class implements OpenType layout for Old Hangul OpenType fonts, as + * specified by Microsoft in "Creating and Supporting OpenType Fonts for + * The Korean Hangul Script" (http://www.microsoft.com/typography/otfntdev/hangulot/default.htm) + * + * This class overrides the characterProcessing method to do Hangul character processing. + * (See the MS spec. for more details) + * + * @internal + */ +class HangulOpenTypeLayoutEngine : public OpenTypeLayoutEngine +{ +public: + /** + * This is the main constructor. It constructs an instance of HangulOpenTypeLayoutEngine for + * a particular font, script and language. It takes the GSUB table as a parameter since + * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an + * Hangul OpenType font. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param gsubTable - the GSUB table + * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see OpenTypeLayoutEngine + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ + HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known + * until after this constructor has been invoked. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param success - set to an error code if the operation fails + * + * @see OpenTypeLayoutEngine + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ + HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. + * + * @internal + */ + virtual ~HangulOpenTypeLayoutEngine(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +protected: + + /** + * This method does Hangul OpenType character processing. It assigns the OpenType feature + * tags to the characters, and may compose a character sequence into a modern Hangul syllable, + * or decompose a modern Hangul syllable if it forms part of an old Hangul syllable. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run + * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. + * the auxillary data array will be set to the feature tags. + * + * Output parameters: + * @param success - set to an error code if the operation fails + * + * @return the output character count + * + * @internal + */ + virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/ICUFeatures.h b/Build/source/libs/icu/icu-50.1/layout/ICUFeatures.h new file mode 100644 index 00000000000..4d9386630e6 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ICUFeatures.h @@ -0,0 +1,44 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +#ifndef __ICUFEATURES_H +#define __ICUFEATURES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +struct FeatureRecord +{ + ATag featureTag; + Offset featureTableOffset; +}; + +struct FeatureTable +{ + Offset featureParamsOffset; + le_uint16 lookupCount; + le_uint16 lookupListIndexArray[ANY_NUMBER]; +}; + +struct FeatureListTable +{ + le_uint16 featureCount; + FeatureRecord featureRecordArray[ANY_NUMBER]; + + const FeatureTable *getFeatureTable(le_uint16 featureIndex, LETag *featureTag) const; + + const FeatureTable *getFeatureTable(LETag featureTag) const; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/IndicClassTables.cpp b/Build/source/libs/icu/icu-50.1/layout/IndicClassTables.cpp new file mode 100644 index 00000000000..5a6f3222cd0 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/IndicClassTables.cpp @@ -0,0 +1,467 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEScripts.h" +#include "OpenTypeTables.h" +#include "OpenTypeUtilities.h" +#include "IndicReordering.h" + +U_NAMESPACE_BEGIN + +// Split matra table indices +#define _x1 (1 << CF_INDEX_SHIFT) +#define _x2 (2 << CF_INDEX_SHIFT) +#define _x3 (3 << CF_INDEX_SHIFT) +#define _x4 (4 << CF_INDEX_SHIFT) +#define _x5 (5 << CF_INDEX_SHIFT) +#define _x6 (6 << CF_INDEX_SHIFT) +#define _x7 (7 << CF_INDEX_SHIFT) +#define _x8 (8 << CF_INDEX_SHIFT) +#define _x9 (9 << CF_INDEX_SHIFT) + +// simple classes +#define _xx (CC_RESERVED) +#define _ma (CC_VOWEL_MODIFIER | CF_POS_ABOVE) +#define _mp (CC_VOWEL_MODIFIER | CF_POS_AFTER) +#define _sa (CC_STRESS_MARK | CF_POS_ABOVE) +#define _sb (CC_STRESS_MARK | CF_POS_BELOW) +#define _iv (CC_INDEPENDENT_VOWEL) +#define _i2 (CC_INDEPENDENT_VOWEL_2) +#define _i3 (CC_INDEPENDENT_VOWEL_3) +#define _ct (CC_CONSONANT | CF_CONSONANT) +#define _cn (CC_CONSONANT_WITH_NUKTA | CF_CONSONANT) +#define _nu (CC_NUKTA) +#define _dv (CC_DEPENDENT_VOWEL) +#define _dl (_dv | CF_POS_BEFORE) +#define _db (_dv | CF_POS_BELOW) +#define _da (_dv | CF_POS_ABOVE) +#define _dr (_dv | CF_POS_AFTER) +#define _lm (_dv | CF_LENGTH_MARK) +#define _l1 (CC_SPLIT_VOWEL_PIECE_1 | CF_POS_BEFORE) +#define _a1 (CC_SPLIT_VOWEL_PIECE_1 | CF_POS_ABOVE) +#define _b2 (CC_SPLIT_VOWEL_PIECE_2 | CF_POS_BELOW) +#define _r2 (CC_SPLIT_VOWEL_PIECE_2 | CF_POS_AFTER) +#define _m2 (CC_SPLIT_VOWEL_PIECE_2 | CF_LENGTH_MARK) +#define _m3 (CC_SPLIT_VOWEL_PIECE_3 | CF_LENGTH_MARK) +#define _vr (CC_VIRAMA) +#define _al (CC_AL_LAKUNA) + +// split matras +#define _s1 (_dv | _x1) +#define _s2 (_dv | _x2) +#define _s3 (_dv | _x3) +#define _s4 (_dv | _x4) +#define _s5 (_dv | _x5) +#define _s6 (_dv | _x6) +#define _s7 (_dv | _x7) +#define _s8 (_dv | _x8) +#define _s9 (_dv | _x9) + +// consonants with special forms +// NOTE: this assumes that no consonants with nukta have +// special forms... (Bengali RA?) +#define _bb (_ct | CF_BELOW_BASE) +#define _pb (_ct | CF_POST_BASE) +#define _vt (_bb | CF_VATTU) +#define _rv (_vt | CF_REPH) +#define _rp (_pb | CF_REPH) +#define _rb (_bb | CF_REPH) + +// +// Character class tables +// +static const IndicClassTable::CharClass devaCharClasses[] = +{ + _xx, _ma, _ma, _mp, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, // 0900 - 090F + _iv, _iv, _iv, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0910 - 091F + _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _cn, _ct, _ct, _ct, _ct, _ct, _ct, // 0920 - 092F + _rv, _cn, _ct, _ct, _cn, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _dr, _dl, // 0930 - 093F + _dr, _db, _db, _db, _db, _da, _da, _da, _da, _dr, _dr, _dr, _dr, _vr, _xx, _xx, // 0940 - 094F + _xx, _sa, _sb, _sa, _sa, _xx, _xx, _xx, _cn, _cn, _cn, _cn, _cn, _cn, _cn, _cn, // 0950 - 095F + _iv, _iv, _db, _db, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0960 - 096F + _xx // 0970 +}; + +static const IndicClassTable::CharClass bengCharClasses[] = +{ + _xx, _ma, _mp, _mp, _xx, _i2, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _i2, // 0980 - 098F + _iv, _xx, _xx, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0990 - 099F + _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _bb, _ct, _ct, _pb, // 09A0 - 09AF + _rv, _xx, _ct, _xx, _xx, _xx, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _r2, _dl, // 09B0 - 09BF + _dr, _db, _db, _db, _db, _xx, _xx, _l1, _dl, _xx, _xx, _s1, _s2, _vr, _xx, _xx, // 09C0 - 09CF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _cn, // 09D0 - 09DF + _iv, _iv, _dv, _dv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 09E0 - 09EF + _rv, _ct, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 09F0 - 09FA +}; + +static const IndicClassTable::CharClass punjCharClasses[] = +{ + _xx, _ma, _ma, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _xx, _iv, // 0A00 - 0A0F + _iv, _xx, _xx, _i3, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0A10 - 0A1F + _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _bb, // 0A20 - 0A2F + _vt, _xx, _ct, _cn, _xx, _bb, _cn, _xx, _ct, _bb, _xx, _xx, _nu, _xx, _dr, _dl, // 0A30 - 0A3F + _dr, _b2, _db, _xx, _xx, _xx, _xx, _da, _da, _xx, _xx, _a1, _da, _vr, _xx, _xx, // 0A40 - 0A4F + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _cn, _cn, _cn, _ct, _xx, _cn, _xx, // 0A50 - 0A5F + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0A60 - 0A6F + _ma, _ma, _xx, _xx, _xx // 0A70 - 0A74 +}; + +static const IndicClassTable::CharClass gujrCharClasses[] = +{ + _xx, _ma, _ma, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _xx, _iv, // 0A80 - 0A8F + _iv, _iv, _xx, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0A90 - 0A9F + _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _ct, // 0AA0 - 0AAF + _rv, _xx, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _dr, _dl, // 0AB0 - 0ABF + _dr, _db, _db, _db, _db, _da, _xx, _da, _da, _dr, _xx, _dr, _dr, _vr, _xx, _xx, // 0AC0 - 0ACF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0AD0 - 0ADF + _iv, _iv, _db, _db, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0AE0 - 0AEF +}; + +#if 1 +static const IndicClassTable::CharClass oryaCharClasses[] = +{ + _xx, _ma, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, /* 0B00 - 0B0F */ + _iv, _xx, _xx, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _ct, _bb, /* 0B10 - 0B1F */ + _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _pb, /* 0B20 - 0B2F */ + _rb, _xx, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _nu, _xx, _dr, _da, /* 0B30 - 0B3F */ + _dr, _db, _db, _db, _xx, _xx, _xx, _dl, _s1, _xx, _xx, _s2, _s3, _vr, _xx, _xx, /* 0B40 - 0B4F */ + _xx, _xx, _xx, _xx, _xx, _xx, _da, _dr, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _pb, /* 0B50 - 0B5F */ + _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, /* 0B60 - 0B6F */ + _xx, _bb /* 0B70 - 0B71 */ +}; +#else +static const IndicClassTable::CharClass oryaCharClasses[] = +{ + _xx, _ma, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, // 0B00 - 0B0F + _iv, _xx, _xx, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0B10 - 0B1F + _ct, _ct, _ct, _ct, _bb, _ct, _ct, _ct, _bb, _xx, _ct, _ct, _bb, _bb, _bb, _pb, // 0B20 - 0B2F + _rb, _xx, _bb, _bb, _xx, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _r2, _da, // 0B30 - 0B3F + _dr, _db, _db, _db, _xx, _xx, _xx, _l1, _s1, _xx, _xx, _s2, _s3, _vr, _xx, _xx, // 0B40 - 0B4F + _xx, _xx, _xx, _xx, _xx, _xx, _m2, _m2, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _cn, // 0B50 - 0B5F + _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0B60 - 0B6F + _xx, _ct // 0B70 - 0B71 +}; +#endif + +static const IndicClassTable::CharClass tamlCharClasses[] = +{ + _xx, _xx, _ma, _xx, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _iv, _iv, // 0B80 - 0B8F + _iv, _xx, _iv, _iv, _iv, _ct, _xx, _xx, _xx, _ct, _ct, _xx, _ct, _xx, _ct, _ct, // 0B90 - 0B9F + _xx, _xx, _xx, _ct, _ct, _xx, _xx, _xx, _ct, _ct, _ct, _xx, _xx, _xx, _ct, _ct, // 0BA0 - 0BAF + _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0BB0 - 0BBF + _da, _dr, _dr, _xx, _xx, _xx, _l1, _l1, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0BC0 - 0BCF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0BD0 - 0BDF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0BE0 - 0BEF + _xx, _xx, _xx // 0BF0 - 0BF2 +}; + +// FIXME: Should some of the bb's be pb's? (KA, NA, MA, YA, VA, etc. (approx 13)) +// U+C43 and U+C44 are _lm here not _dr. Similar to the situation with U+CC3 and +// U+CC4 in Kannada below. +static const IndicClassTable::CharClass teluCharClasses[] = +{ + _xx, _mp, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0C00 - 0C0F + _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, // 0C10 - 0C1F + _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, // 0C20 - 0C2F + _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _da, _da, // 0C30 - 0C3F + _da, _dr, _dr, _lm, _lm, _xx, _a1, _da, _s1, _xx, _da, _da, _da, _vr, _xx, _xx, // 0C40 - 0C4F + _xx, _xx, _xx, _xx, _xx, _da, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0C50 - 0C5F + _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0C60 - 0C6F +}; + +// U+CC3 and U+CC4 are _lm here not _dr since the Kannada rendering +// rules want them below and to the right of the entire cluster +// +// There's some information about this in: +// +// http://brahmi.sourceforge.net/docs/KannadaComputing.html +static const IndicClassTable::CharClass kndaCharClasses[] = +{ + _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0C80 - 0C8F + _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, // 0C90 - 0C9F + _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, // 0CA0 - 0CAF + _rb, _ct, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _dr, _da, // 0CB0 - 0CBF + _s1, _dr, _r2, _lm, _lm, _xx, _a1, _s2, _s3, _xx, _s4, _s5, _da, _vr, _xx, _xx, // 0CC0 - 0CCF + _xx, _xx, _xx, _xx, _xx, _m3, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _ct, _xx, // 0CD0 - 0CDF + _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0CE0 - 0CEF +}; + +// FIXME: this is correct for old-style Malayalam (MAL) but not for reformed Malayalam (MLR) +// FIXME: should there be a REPH for old-style Malayalam? +static const IndicClassTable::CharClass mlymCharClasses[] = +{ + _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0D00 - 0D0F + _iv, _xx, _iv, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0D10 - 0D1F + _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _pb, // 0D20 - 0D2F + _pb, _cn, _bb, _ct, _ct, _pb, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0D30 - 0D3F + _dr, _dr, _dr, _dr, _xx, _xx, _l1, _l1, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0D40 - 0D4F + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0D50 - 0D5F + _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0D60 - 0D6F +}; + +static const IndicClassTable::CharClass sinhCharClasses[] = +{ + _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, // 0D80 - 0D8F + _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _ct, _ct, _ct, _ct, _ct, _ct, // 0D90 - 0D9F + _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0DA0 - 0DAF + _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _xx, _xx, // 0DB0 - 0DBF + _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _al, _xx, _xx, _xx, _xx, _dr, // 0DC0 - 0DCF + _dr, _dr, _da, _da, _db, _xx, _db, _xx, _dr, _dl, _s1, _dl, _s2, _s3, _s4, _dr, // 0DD0 - 0DDF + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0DE0 - 0DEF + _xx, _xx, _dr, _dr, _xx // 0DF0 - 0DF4 +}; + +// +// Split matra tables +// +static const SplitMatra bengSplitTable[] = {{0x09C7, 0x09BE}, {0x09C7, 0x09D7}}; + +static const SplitMatra oryaSplitTable[] = {{0x0B47, 0x0B56}, {0x0B47, 0x0B3E}, {0x0B47, 0x0B57}}; + +static const SplitMatra tamlSplitTable[] = {{0x0BC6, 0x0BBE}, {0x0BC7, 0x0BBE}, {0x0BC6, 0x0BD7}}; + +static const SplitMatra teluSplitTable[] = {{0x0C46, 0x0C56}}; + +static const SplitMatra kndaSplitTable[] = {{0x0CBF, 0x0CD5}, {0x0CC6, 0x0CD5}, {0x0CC6, 0x0CD6}, {0x0CC6, 0x0CC2}, + {0x0CC6, 0x0CC2, 0x0CD5}}; + +static const SplitMatra mlymSplitTable[] = {{0x0D46, 0x0D3E}, {0x0D47, 0x0D3E}, {0x0D46, 0x0D57}}; + + +static const SplitMatra sinhSplitTable[] = {{0x0DD9, 0x0DCA}, {0x0DD9, 0x0DCF}, {0x0DD9, 0x0DCF, 0x0DCA}, + {0x0DD9, 0x0DDF}}; +// +// Script Flags +// + +// FIXME: post 'GSUB' reordering of MATRA_PRE's for Malayalam and Tamil +// FIXME: reformed Malayalam needs to reorder VATTU to before base glyph... +// FIXME: not sure passing ZWJ/ZWNJ is best way to render Malayalam Cillu... +// FIXME: eyelash RA only for Devanagari?? +#define DEVA_SCRIPT_FLAGS (SF_EYELASH_RA | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) +#define BENG_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) +#define PUNJ_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) +#define GUJR_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) +#define ORYA_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) +#define TAML_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) +#define TELU_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | SF_FILTER_ZERO_WIDTH | 3) +#define KNDA_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | SF_FILTER_ZERO_WIDTH | 3) +#define MLYM_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT /*| SF_FILTER_ZERO_WIDTH*/) +#define SINH_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT) + +// +// Indic Class Tables +// +static const IndicClassTable devaClassTable = {0x0900, 0x0970, 2, DEVA_SCRIPT_FLAGS, devaCharClasses, NULL}; + +static const IndicClassTable bengClassTable = {0x0980, 0x09FA, 3, BENG_SCRIPT_FLAGS, bengCharClasses, bengSplitTable}; + +static const IndicClassTable punjClassTable = {0x0A00, 0x0A74, 2, PUNJ_SCRIPT_FLAGS, punjCharClasses, NULL}; + +static const IndicClassTable gujrClassTable = {0x0A80, 0x0AEF, 2, GUJR_SCRIPT_FLAGS, gujrCharClasses, NULL}; + +static const IndicClassTable oryaClassTable = {0x0B00, 0x0B71, 3, ORYA_SCRIPT_FLAGS, oryaCharClasses, oryaSplitTable}; + +static const IndicClassTable tamlClassTable = {0x0B80, 0x0BF2, 3, TAML_SCRIPT_FLAGS, tamlCharClasses, tamlSplitTable}; + +static const IndicClassTable teluClassTable = {0x0C00, 0x0C6F, 3, TELU_SCRIPT_FLAGS, teluCharClasses, teluSplitTable}; + +static const IndicClassTable kndaClassTable = {0x0C80, 0x0CEF, 4, KNDA_SCRIPT_FLAGS, kndaCharClasses, kndaSplitTable}; + +static const IndicClassTable mlymClassTable = {0x0D00, 0x0D6F, 3, MLYM_SCRIPT_FLAGS, mlymCharClasses, mlymSplitTable}; + +static const IndicClassTable sinhClassTable = {0x0D80, 0x0DF4, 4, SINH_SCRIPT_FLAGS, sinhCharClasses, sinhSplitTable}; + +// +// IndicClassTable addresses +// +static const IndicClassTable * const indicClassTables[scriptCodeCount] = { + NULL, /* 'zyyy' (COMMON) */ + NULL, /* 'qaai' (INHERITED) */ + NULL, /* 'arab' (ARABIC) */ + NULL, /* 'armn' (ARMENIAN) */ + &bengClassTable, /* 'beng' (BENGALI) */ + NULL, /* 'bopo' (BOPOMOFO) */ + NULL, /* 'cher' (CHEROKEE) */ + NULL, /* 'copt' (COPTIC) */ + NULL, /* 'cyrl' (CYRILLIC) */ + NULL, /* 'dsrt' (DESERET) */ + &devaClassTable, /* 'deva' (DEVANAGARI) */ + NULL, /* 'ethi' (ETHIOPIC) */ + NULL, /* 'geor' (GEORGIAN) */ + NULL, /* 'goth' (GOTHIC) */ + NULL, /* 'grek' (GREEK) */ + &gujrClassTable, /* 'gujr' (GUJARATI) */ + &punjClassTable, /* 'guru' (GURMUKHI) */ + NULL, /* 'hani' (HAN) */ + NULL, /* 'hang' (HANGUL) */ + NULL, /* 'hebr' (HEBREW) */ + NULL, /* 'hira' (HIRAGANA) */ + &kndaClassTable, /* 'knda' (KANNADA) */ + NULL, /* 'kata' (KATAKANA) */ + NULL, /* 'khmr' (KHMER) */ + NULL, /* 'laoo' (LAO) */ + NULL, /* 'latn' (LATIN) */ + &mlymClassTable, /* 'mlym' (MALAYALAM) */ + NULL, /* 'mong' (MONGOLIAN) */ + NULL, /* 'mymr' (MYANMAR) */ + NULL, /* 'ogam' (OGHAM) */ + NULL, /* 'ital' (OLD-ITALIC) */ + &oryaClassTable, /* 'orya' (ORIYA) */ + NULL, /* 'runr' (RUNIC) */ + &sinhClassTable, /* 'sinh' (SINHALA) */ + NULL, /* 'syrc' (SYRIAC) */ + &tamlClassTable, /* 'taml' (TAMIL) */ + &teluClassTable, /* 'telu' (TELUGU) */ + NULL, /* 'thaa' (THAANA) */ + NULL, /* 'thai' (THAI) */ + NULL, /* 'tibt' (TIBETAN) */ + NULL, /* 'cans' (CANADIAN-ABORIGINAL) */ + NULL, /* 'yiii' (YI) */ + NULL, /* 'tglg' (TAGALOG) */ + NULL, /* 'hano' (HANUNOO) */ + NULL, /* 'buhd' (BUHID) */ + NULL, /* 'tagb' (TAGBANWA) */ + NULL, /* 'brai' (BRAILLE) */ + NULL, /* 'cprt' (CYPRIOT) */ + NULL, /* 'limb' (LIMBU) */ + NULL, /* 'linb' (LINEAR_B) */ + NULL, /* 'osma' (OSMANYA) */ + NULL, /* 'shaw' (SHAVIAN) */ + NULL, /* 'tale' (TAI_LE) */ + NULL, /* 'ugar' (UGARITIC) */ + NULL, /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ + NULL, /* 'bugi' (BUGINESE) */ + NULL, /* 'glag' (GLAGOLITIC) */ + NULL, /* 'khar' (KHAROSHTHI) */ + NULL, /* 'sylo' (SYLOTI_NAGRI) */ + NULL, /* 'talu' (NEW_TAI_LUE) */ + NULL, /* 'tfng' (TIFINAGH) */ + NULL, /* 'xpeo' (OLD_PERSIAN) */ + NULL, /* 'bali' (BALINESE) */ + NULL, /* 'batk' (BATK) */ + NULL, /* 'blis' (BLIS) */ + NULL, /* 'brah' (BRAH) */ + NULL, /* 'cham' (CHAM) */ + NULL, /* 'cirt' (CIRT) */ + NULL, /* 'cyrs' (CYRS) */ + NULL, /* 'egyd' (EGYD) */ + NULL, /* 'egyh' (EGYH) */ + NULL, /* 'egyp' (EGYP) */ + NULL, /* 'geok' (GEOK) */ + NULL, /* 'hans' (HANS) */ + NULL, /* 'hant' (HANT) */ + NULL, /* 'hmng' (HMNG) */ + NULL, /* 'hung' (HUNG) */ + NULL, /* 'inds' (INDS) */ + NULL, /* 'java' (JAVA) */ + NULL, /* 'kali' (KALI) */ + NULL, /* 'latf' (LATF) */ + NULL, /* 'latg' (LATG) */ + NULL, /* 'lepc' (LEPC) */ + NULL, /* 'lina' (LINA) */ + NULL, /* 'mand' (MAND) */ + NULL, /* 'maya' (MAYA) */ + NULL, /* 'mero' (MERO) */ + NULL, /* 'nko ' (NKO) */ + NULL, /* 'orkh' (ORKH) */ + NULL, /* 'perm' (PERM) */ + NULL, /* 'phag' (PHAGS_PA) */ + NULL, /* 'phnx' (PHOENICIAN) */ + NULL, /* 'plrd' (PLRD) */ + NULL, /* 'roro' (RORO) */ + NULL, /* 'sara' (SARA) */ + NULL, /* 'syre' (SYRE) */ + NULL, /* 'syrj' (SYRJ) */ + NULL, /* 'syrn' (SYRN) */ + NULL, /* 'teng' (TENG) */ + NULL, /* 'vai ' (VAII) */ + NULL, /* 'visp' (VISP) */ + NULL, /* 'xsux' (CUNEIFORM) */ + NULL, /* 'zxxx' (ZXXX) */ + NULL, /* 'zzzz' (UNKNOWN) */ + NULL, /* 'cari' (CARI) */ + NULL, /* 'jpan' (JPAN) */ + NULL, /* 'lana' (LANA) */ + NULL, /* 'lyci' (LYCI) */ + NULL, /* 'lydi' (LYDI) */ + NULL, /* 'olck' (OLCK) */ + NULL, /* 'rjng' (RJNG) */ + NULL, /* 'saur' (SAUR) */ + NULL, /* 'sgnw' (SGNW) */ + NULL, /* 'sund' (SUND) */ + NULL, /* 'moon' (MOON) */ + NULL, /* 'mtei' (MTEI) */ + NULL, /* 'armi' (ARMI) */ + NULL, /* 'avst' (AVST) */ + NULL, /* 'cakm' (CAKM) */ + NULL, /* 'kore' (KORE) */ + NULL, /* 'kthi' (KTHI) */ + NULL, /* 'mani' (MANI) */ + NULL, /* 'phli' (PHLI) */ + NULL, /* 'phlp' (PHLP) */ + NULL, /* 'phlv' (PHLV) */ + NULL, /* 'prti' (PRTI) */ + NULL, /* 'samr' (SAMR) */ + NULL, /* 'tavt' (TAVT) */ + NULL, /* 'zmth' (ZMTH) */ + NULL, /* 'zsym' (ZSYM) */ + NULL, /* 'bamu' (BAMUM) */ + NULL, /* 'lisu' (LISU) */ + NULL, /* 'nkgb' (NKGB) */ + NULL /* 'sarb' (OLD_SOUTH_ARABIAN) */ +}; + +IndicClassTable::CharClass IndicClassTable::getCharClass(LEUnicode ch) const +{ + if (ch == C_SIGN_ZWJ) { + return CF_CONSONANT | CC_ZERO_WIDTH_MARK; + } + + if (ch == C_SIGN_ZWNJ) { + return CC_ZERO_WIDTH_MARK; + } + + if (ch < firstChar || ch > lastChar) { + return CC_RESERVED; + } + + return classTable[ch - firstChar]; +} + +const IndicClassTable *IndicClassTable::getScriptClassTable(le_int32 scriptCode) +{ + if (scriptCode < 0 || scriptCode >= scriptCodeCount) { + return NULL; + } + + return indicClassTables[scriptCode]; +} + +le_int32 IndicReordering::getWorstCaseExpansion(le_int32 scriptCode) +{ + const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); + + if (classTable == NULL) { + return 1; + } + + return classTable->getWorstCaseExpansion(); +} + +le_bool IndicReordering::getFilterZeroWidth(le_int32 scriptCode) +{ + const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); + + if (classTable == NULL) { + return TRUE; + } + + return classTable->getFilterZeroWidth(); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/IndicLayoutEngine.cpp b/Build/source/libs/icu/icu-50.1/layout/IndicLayoutEngine.cpp new file mode 100644 index 00000000000..5bc0435af63 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/IndicLayoutEngine.cpp @@ -0,0 +1,135 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LayoutEngine.h" +#include "OpenTypeLayoutEngine.h" +#include "IndicLayoutEngine.h" +#include "ScriptAndLanguageTags.h" + +#include "GlyphSubstitutionTables.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositioningTables.h" + +#include "GDEFMarkFilter.h" +#include "LEGlyphStorage.h" + +#include "IndicReordering.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicOpenTypeLayoutEngine) + +IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, le_bool version2, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success), fMPreFixups(NULL) +{ + if ( version2 ) { + fFeatureMap = IndicReordering::getv2FeatureMap(fFeatureMapCount); + } else { + fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount); + } + fFeatureOrder = TRUE; + fVersion2 = version2; + fFilterZeroWidth = IndicReordering::getFilterZeroWidth(fScriptCode); +} + +IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fMPreFixups(NULL) +{ + fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; + fVersion2 = FALSE; +} + +IndicOpenTypeLayoutEngine::~IndicOpenTypeLayoutEngine() +{ + // nothing to do +} + +// Input: characters, tags +// Output: glyphs, char indices +le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + le_int32 retCount = OpenTypeLayoutEngine::glyphProcessing(chars, offset, count, max, rightToLeft, glyphStorage, success); + + if (LE_FAILURE(success)) { + return 0; + } + + if (fVersion2) { + IndicReordering::finalReordering(glyphStorage,retCount); + IndicReordering::applyPresentationForms(glyphStorage,retCount); + OpenTypeLayoutEngine::glyphSubstitution(count,max, rightToLeft, glyphStorage, success); + } else { + IndicReordering::adjustMPres(fMPreFixups, glyphStorage, success); + } + return retCount; +} + +// Input: characters +// Output: characters, char indices, tags +// Returns: output character count +le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + le_int32 worstCase = count * IndicReordering::getWorstCaseExpansion(fScriptCode); + + outChars = LE_NEW_ARRAY(LEUnicode, worstCase); + + if (outChars == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); + glyphStorage.allocateAuxData(success); + + if (LE_FAILURE(success)) { + LE_DELETE_ARRAY(outChars); + return 0; + } + + // NOTE: assumes this allocates featureTags... + // (probably better than doing the worst case stuff here...) + + le_int32 outCharCount; + if (fVersion2) { + outCharCount = IndicReordering::v2process(&chars[offset], count, fScriptCode, outChars, glyphStorage); + } else { + outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups, success); + } + + if (LE_FAILURE(success)) { + LE_DELETE_ARRAY(outChars); + return 0; + } + + glyphStorage.adoptGlyphCount(outCharCount); + return outCharCount; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/IndicLayoutEngine.h b/Build/source/libs/icu/icu-50.1/layout/IndicLayoutEngine.h new file mode 100644 index 00000000000..ff0b83cf001 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/IndicLayoutEngine.h @@ -0,0 +1,167 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved + * + */ + +#ifndef __INDICLAYOUTENGINE_H +#define __INDICLAYOUTENGINE_H + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "LEGlyphFilter.h" +#include "LayoutEngine.h" +#include "OpenTypeLayoutEngine.h" + +#include "GlyphSubstitutionTables.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositioningTables.h" + +U_NAMESPACE_BEGIN + +class MPreFixups; +class LEGlyphStorage; + +/** + * This class implements OpenType layout for Indic OpenType fonts, as + * specified by Microsoft in "Creating and Supporting OpenType Fonts for + * Indic Scripts" (http://www.microsoft.com/typography/otspec/indicot/default.htm) + * + * This class overrides the characterProcessing method to do Indic character processing + * and reordering, and the glyphProcessing method to implement post-GSUB processing for + * left matras. (See the MS spec. for more details) + * + * @internal + */ +class IndicOpenTypeLayoutEngine : public OpenTypeLayoutEngine +{ +public: + /** + * This is the main constructor. It constructs an instance of IndicOpenTypeLayoutEngine for + * a particular font, script and language. It takes the GSUB table as a parameter since + * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an + * Indic OpenType font. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param gsubTable - the GSUB table + * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see OpenTypeLayoutEngine + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ + IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, le_bool version2, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known + * until after this constructor has been invoked. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param success - set to an error code if the operation fails + * + * @see OpenTypeLayoutEngine + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ + IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. + * + * @internal + */ + virtual ~IndicOpenTypeLayoutEngine(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +protected: + + /** + * This method does Indic OpenType character processing. It assigns the OpenType feature + * tags to the characters, and may generate output characters which have been reordered. For + * some Indic scripts, it may also split some vowels, resulting in more output characters + * than input characters. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run + * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. + * the auxillary data array will be set to the feature tags. + * + * Output parameters: + * @param success - set to an error code if the operation fails + * + * @return the output character count + * + * @internal + */ + virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method does character to glyph mapping, applies the GSUB table and applies + * any post GSUB fixups for left matras. It calls OpenTypeLayoutEngine::glyphProcessing + * to do the character to glyph mapping, and apply the GSUB table. + * + * Note that in the case of "canned" GSUB tables, the output glyph indices may be + * "fake" glyph indices that need to be converted to "real" glyph indices by the + * glyphPostProcessing method. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run + * @param featureTags - the feature tag array + * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. + * + * Output parameters: + * @param success - set to an error code if the operation fails + * + * @return the number of glyphs in the output glyph index array + * + * Note: if the character index array was already set by the characterProcessing + * method, this method won't change it. + * + * @internal + */ + virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + + le_bool fVersion2; + +private: + + MPreFixups *fMPreFixups; + +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/IndicRearrangement.h b/Build/source/libs/icu/icu-50.1/layout/IndicRearrangement.h new file mode 100644 index 00000000000..48b1d08adae --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/IndicRearrangement.h @@ -0,0 +1,65 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __INDICREARRANGEMENT_H +#define __INDICREARRANGEMENT_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LayoutTables.h" +#include "StateTables.h" +#include "MorphTables.h" +#include "MorphStateTables.h" + +U_NAMESPACE_BEGIN + +struct IndicRearrangementSubtableHeader : MorphStateTableHeader +{ +}; + +enum IndicRearrangementFlags +{ + irfMarkFirst = 0x8000, + irfDontAdvance = 0x4000, + irfMarkLast = 0x2000, + irfReserved = 0x1FF0, + irfVerbMask = 0x000F +}; + +enum IndicRearrangementVerb +{ + irvNoAction = 0x0000, /* no action */ + irvxA = 0x0001, /* Ax => xA */ + irvDx = 0x0002, /* xD => Dx */ + irvDxA = 0x0003, /* AxD => DxA */ + + irvxAB = 0x0004, /* ABx => xAB */ + irvxBA = 0x0005, /* ABx => xBA */ + irvCDx = 0x0006, /* xCD => CDx */ + irvDCx = 0x0007, /* xCD => DCx */ + + irvCDxA = 0x0008, /* AxCD => CDxA */ + irvDCxA = 0x0009, /* AxCD => DCxA */ + irvDxAB = 0x000A, /* ABxD => DxAB */ + irvDxBA = 0x000B, /* ABxD => DxBA */ + + irvCDxAB = 0x000C, /* ABxCD => CDxAB */ + irvCDxBA = 0x000D, /* ABxCD => CDxBA */ + irvDCxAB = 0x000E, /* ABxCD => DCxAB */ + irvDCxBA = 0x000F /* ABxCD => DCxBA */ +}; + +struct IndicRearrangementStateEntry : StateEntry +{ +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/IndicRearrangementProcessor.cpp b/Build/source/libs/icu/icu-50.1/layout/IndicRearrangementProcessor.cpp new file mode 100644 index 00000000000..92202450705 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/IndicRearrangementProcessor.cpp @@ -0,0 +1,398 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "StateTables.h" +#include "MorphStateTables.h" +#include "SubtableProcessor.h" +#include "StateTableProcessor.h" +#include "IndicRearrangementProcessor.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicRearrangementProcessor) + +IndicRearrangementProcessor::IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader) + : StateTableProcessor(morphSubtableHeader) +{ + indicRearrangementSubtableHeader = (const IndicRearrangementSubtableHeader *) morphSubtableHeader; + entryTable = (const IndicRearrangementStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset); +} + +IndicRearrangementProcessor::~IndicRearrangementProcessor() +{ +} + +void IndicRearrangementProcessor::beginStateTable() +{ + firstGlyph = 0; + lastGlyph = 0; +} + +ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) +{ + const IndicRearrangementStateEntry *entry = &entryTable[index]; + ByteOffset newState = SWAPW(entry->newStateOffset); + IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags); + + if (flags & irfMarkFirst) { + firstGlyph = currGlyph; + } + + if (flags & irfMarkLast) { + lastGlyph = currGlyph; + } + + doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask)); + + if (!(flags & irfDontAdvance)) { + // XXX: Should handle reverse too... + currGlyph += 1; + } + + return newState; +} + +void IndicRearrangementProcessor::endStateTable() +{ +} + +void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const +{ + LEGlyphID a, b, c, d; + le_int32 ia, ib, ic, id, ix, x; + LEErrorCode success = LE_NO_ERROR; + + switch(verb) + { + case irvNoAction: + break; + + case irvxA: + a = glyphStorage[firstGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + x = firstGlyph + 1; + + while (x <= lastGlyph) { + glyphStorage[x - 1] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x - 1, ix, success); + x += 1; + } + + glyphStorage[lastGlyph] = a; + glyphStorage.setCharIndex(lastGlyph, ia, success); + break; + + case irvDx: + d = glyphStorage[lastGlyph]; + id = glyphStorage.getCharIndex(lastGlyph, success); + x = lastGlyph - 1; + + while (x >= firstGlyph) { + glyphStorage[x + 1] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x + 1, ix, success); + x -= 1; + } + + glyphStorage[firstGlyph] = d; + glyphStorage.setCharIndex(firstGlyph, id, success); + break; + + case irvDxA: + a = glyphStorage[firstGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + id = glyphStorage.getCharIndex(lastGlyph, success); + + glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; + glyphStorage[lastGlyph] = a; + + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); + break; + + case irvxAB: + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + x = firstGlyph + 2; + + while (x <= lastGlyph) { + glyphStorage[x - 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x - 2, ix, success); + x += 1; + } + + glyphStorage[lastGlyph - 1] = a; + glyphStorage[lastGlyph] = b; + + glyphStorage.setCharIndex(lastGlyph - 1, ia, success); + glyphStorage.setCharIndex(lastGlyph, ib, success); + break; + + case irvxBA: + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + x = firstGlyph + 2; + + while (x <= lastGlyph) { + glyphStorage[x - 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x - 2, ix, success); + x += 1; + } + + glyphStorage[lastGlyph - 1] = b; + glyphStorage[lastGlyph] = a; + + glyphStorage.setCharIndex(lastGlyph - 1, ib, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); + break; + + case irvCDx: + c = glyphStorage[lastGlyph - 1]; + d = glyphStorage[lastGlyph]; + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); + x = lastGlyph - 2; + + while (x >= firstGlyph) { + glyphStorage[x + 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x + 2, ix, success); + x -= 1; + } + + glyphStorage[firstGlyph] = c; + glyphStorage[firstGlyph + 1] = d; + + glyphStorage.setCharIndex(firstGlyph, ic, success); + glyphStorage.setCharIndex(firstGlyph + 1, id, success); + break; + + case irvDCx: + c = glyphStorage[lastGlyph - 1]; + d = glyphStorage[lastGlyph]; + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); + x = lastGlyph - 2; + + while (x >= firstGlyph) { + glyphStorage[x + 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x + 2, ix, success); + x -= 1; + } + + glyphStorage[firstGlyph] = d; + glyphStorage[firstGlyph + 1] = c; + + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(firstGlyph + 1, ic, success); + break; + + case irvCDxA: + a = glyphStorage[firstGlyph]; + c = glyphStorage[lastGlyph - 1]; + d = glyphStorage[lastGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); + x = lastGlyph - 2; + + while (x > firstGlyph) { + glyphStorage[x + 1] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x + 1, ix, success); + x -= 1; + } + + glyphStorage[firstGlyph] = c; + glyphStorage[firstGlyph + 1] = d; + glyphStorage[lastGlyph] = a; + + glyphStorage.setCharIndex(firstGlyph, ic, success); + glyphStorage.setCharIndex(firstGlyph + 1, id, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); + break; + + case irvDCxA: + a = glyphStorage[firstGlyph]; + c = glyphStorage[lastGlyph - 1]; + d = glyphStorage[lastGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); + x = lastGlyph - 2; + + while (x > firstGlyph) { + glyphStorage[x + 1] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x + 1, ix, success); + x -= 1; + } + + glyphStorage[firstGlyph] = d; + glyphStorage[firstGlyph + 1] = c; + glyphStorage[lastGlyph] = a; + + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(firstGlyph + 1, ic, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); + break; + + case irvDxAB: + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + d = glyphStorage[lastGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); + x = firstGlyph + 2; + + while (x < lastGlyph) { + glyphStorage[x - 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x - 2, ix, success); + x += 1; + } + + glyphStorage[firstGlyph] = d; + glyphStorage[lastGlyph - 1] = a; + glyphStorage[lastGlyph] = b; + + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(lastGlyph - 1, ia, success); + glyphStorage.setCharIndex(lastGlyph, ib, success); + break; + + case irvDxBA: + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + d = glyphStorage[lastGlyph]; + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); + x = firstGlyph + 2; + + while (x < lastGlyph) { + glyphStorage[x - 2] = glyphStorage[x]; + ix = glyphStorage.getCharIndex(x, success); + glyphStorage.setCharIndex(x - 2, ix, success); + x += 1; + } + + glyphStorage[firstGlyph] = d; + glyphStorage[lastGlyph - 1] = b; + glyphStorage[lastGlyph] = a; + + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(lastGlyph - 1, ib, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); + break; + + case irvCDxAB: + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + + glyphStorage[firstGlyph] = glyphStorage[lastGlyph - 1]; + glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph]; + + glyphStorage[lastGlyph - 1] = a; + glyphStorage[lastGlyph] = b; + + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); + + glyphStorage.setCharIndex(firstGlyph, ic, success); + glyphStorage.setCharIndex(firstGlyph + 1, id, success); + + glyphStorage.setCharIndex(lastGlyph - 1, ia, success); + glyphStorage.setCharIndex(lastGlyph, ib, success); + break; + + case irvCDxBA: + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + + glyphStorage[firstGlyph] = glyphStorage[lastGlyph - 1]; + glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph]; + + glyphStorage[lastGlyph - 1] = b; + glyphStorage[lastGlyph] = a; + + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); + + glyphStorage.setCharIndex(firstGlyph, ic, success); + glyphStorage.setCharIndex(firstGlyph + 1, id, success); + + glyphStorage.setCharIndex(lastGlyph - 1, ib, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); + break; + + case irvDCxAB: + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + + glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; + glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph - 1]; + + glyphStorage[lastGlyph - 1] = a; + glyphStorage[lastGlyph] = b; + + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); + + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(firstGlyph + 1, ic, success); + + glyphStorage.setCharIndex(lastGlyph - 1, ia, success); + glyphStorage.setCharIndex(lastGlyph, ib, success); + break; + + case irvDCxBA: + a = glyphStorage[firstGlyph]; + b = glyphStorage[firstGlyph + 1]; + + glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; + glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph - 1]; + + glyphStorage[lastGlyph - 1] = b; + glyphStorage[lastGlyph] = a; + + ia = glyphStorage.getCharIndex(firstGlyph, success); + ib = glyphStorage.getCharIndex(firstGlyph + 1, success); + ic = glyphStorage.getCharIndex(lastGlyph - 1, success); + id = glyphStorage.getCharIndex(lastGlyph, success); + + glyphStorage.setCharIndex(firstGlyph, id, success); + glyphStorage.setCharIndex(firstGlyph + 1, ic, success); + + glyphStorage.setCharIndex(lastGlyph - 1, ib, success); + glyphStorage.setCharIndex(lastGlyph, ia, success); + break; + + default: + break; + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/IndicRearrangementProcessor.h b/Build/source/libs/icu/icu-50.1/layout/IndicRearrangementProcessor.h new file mode 100644 index 00000000000..0cb46ddfccc --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/IndicRearrangementProcessor.h @@ -0,0 +1,63 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __INDICREARRANGEMENTPROCESSOR_H +#define __INDICREARRANGEMENTPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "StateTableProcessor.h" +#include "IndicRearrangement.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class IndicRearrangementProcessor : public StateTableProcessor +{ +public: + virtual void beginStateTable(); + + virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index); + + virtual void endStateTable(); + + void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const; + + IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader); + virtual ~IndicRearrangementProcessor(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +protected: + le_int32 firstGlyph; + le_int32 lastGlyph; + + const IndicRearrangementStateEntry *entryTable; + const IndicRearrangementSubtableHeader *indicRearrangementSubtableHeader; + +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/IndicReordering.cpp b/Build/source/libs/icu/icu-50.1/layout/IndicReordering.cpp new file mode 100644 index 00000000000..9c4b3a9fcb6 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/IndicReordering.cpp @@ -0,0 +1,1186 @@ +/* +/ * + * (C) Copyright IBM Corp. 1998-2012 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "OpenTypeUtilities.h" +#include "IndicReordering.h" +#include "LEGlyphStorage.h" +#include "MPreFixups.h" + +U_NAMESPACE_BEGIN + +#define loclFeatureTag LE_LOCL_FEATURE_TAG +#define initFeatureTag LE_INIT_FEATURE_TAG +#define nuktFeatureTag LE_NUKT_FEATURE_TAG +#define akhnFeatureTag LE_AKHN_FEATURE_TAG +#define rphfFeatureTag LE_RPHF_FEATURE_TAG +#define rkrfFeatureTag LE_RKRF_FEATURE_TAG +#define blwfFeatureTag LE_BLWF_FEATURE_TAG +#define halfFeatureTag LE_HALF_FEATURE_TAG +#define pstfFeatureTag LE_PSTF_FEATURE_TAG +#define vatuFeatureTag LE_VATU_FEATURE_TAG +#define presFeatureTag LE_PRES_FEATURE_TAG +#define blwsFeatureTag LE_BLWS_FEATURE_TAG +#define abvsFeatureTag LE_ABVS_FEATURE_TAG +#define pstsFeatureTag LE_PSTS_FEATURE_TAG +#define halnFeatureTag LE_HALN_FEATURE_TAG +#define cjctFeatureTag LE_CJCT_FEATURE_TAG +#define blwmFeatureTag LE_BLWM_FEATURE_TAG +#define abvmFeatureTag LE_ABVM_FEATURE_TAG +#define distFeatureTag LE_DIST_FEATURE_TAG +#define caltFeatureTag LE_CALT_FEATURE_TAG +#define kernFeatureTag LE_KERN_FEATURE_TAG + +#define loclFeatureMask 0x80000000UL +#define rphfFeatureMask 0x40000000UL +#define blwfFeatureMask 0x20000000UL +#define halfFeatureMask 0x10000000UL +#define pstfFeatureMask 0x08000000UL +#define nuktFeatureMask 0x04000000UL +#define akhnFeatureMask 0x02000000UL +#define vatuFeatureMask 0x01000000UL +#define presFeatureMask 0x00800000UL +#define blwsFeatureMask 0x00400000UL +#define abvsFeatureMask 0x00200000UL +#define pstsFeatureMask 0x00100000UL +#define halnFeatureMask 0x00080000UL +#define blwmFeatureMask 0x00040000UL +#define abvmFeatureMask 0x00020000UL +#define distFeatureMask 0x00010000UL +#define initFeatureMask 0x00008000UL +#define cjctFeatureMask 0x00004000UL +#define rkrfFeatureMask 0x00002000UL +#define caltFeatureMask 0x00001000UL +#define kernFeatureMask 0x00000800UL + +// Syllable structure bits +#define baseConsonantMask 0x00000400UL +#define consonantMask 0x00000200UL +#define halfConsonantMask 0x00000100UL +#define rephConsonantMask 0x00000080UL +#define matraMask 0x00000040UL +#define vowelModifierMask 0x00000020UL +#define markPositionMask 0x00000018UL + +#define postBasePosition 0x00000000UL +#define preBasePosition 0x00000008UL +#define aboveBasePosition 0x00000010UL +#define belowBasePosition 0x00000018UL + +#define repositionedGlyphMask 0x00000002UL + +#define basicShapingFormsMask ( loclFeatureMask | nuktFeatureMask | akhnFeatureMask | rkrfFeatureMask | blwfFeatureMask | halfFeatureMask | vatuFeatureMask | cjctFeatureMask ) +#define positioningFormsMask ( kernFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask ) +#define presentationFormsMask ( presFeatureMask | abvsFeatureMask | blwsFeatureMask | pstsFeatureMask | halnFeatureMask | caltFeatureMask ) + + +#define C_MALAYALAM_VOWEL_SIGN_U 0x0D41 +#define C_DOTTED_CIRCLE 0x25CC +#define NO_GLYPH 0xFFFF + +// Some level of debate as to the proper value for MAX_CONSONANTS_PER_SYLLABLE. Ticket 5588 states that 4 +// is the magic number according to ISCII, but 5 seems to be the more consistent with XP. +#define MAX_CONSONANTS_PER_SYLLABLE 5 + +#define INDIC_BLOCK_SIZE 0x7F + +class IndicReorderingOutput : public UMemory { +private: + le_int32 fSyllableCount; + le_int32 fOutIndex; + LEUnicode *fOutChars; + + LEGlyphStorage &fGlyphStorage; + + LEUnicode fMpre; + le_int32 fMpreIndex; + + LEUnicode fMbelow; + le_int32 fMbelowIndex; + + LEUnicode fMabove; + le_int32 fMaboveIndex; + + LEUnicode fMpost; + le_int32 fMpostIndex; + + LEUnicode fLengthMark; + le_int32 fLengthMarkIndex; + + LEUnicode fAlLakuna; + le_int32 fAlLakunaIndex; + + FeatureMask fMatraFeatures; + + le_int32 fMPreOutIndex; + MPreFixups *fMPreFixups; + + LEUnicode fVMabove; + LEUnicode fVMpost; + le_int32 fVMIndex; + FeatureMask fVMFeatures; + + LEUnicode fSMabove; + LEUnicode fSMbelow; + le_int32 fSMIndex; + FeatureMask fSMFeatures; + + + void saveMatra(LEUnicode matra, le_int32 matraIndex, IndicClassTable::CharClass matraClass) + { + // FIXME: check if already set, or if not a matra... + if (IndicClassTable::isLengthMark(matraClass)) { + fLengthMark = matra; + fLengthMarkIndex = matraIndex; + } else if (IndicClassTable::isAlLakuna(matraClass)) { + fAlLakuna = matra; + fAlLakunaIndex = matraIndex; + } else { + switch (matraClass & CF_POS_MASK) { + case CF_POS_BEFORE: + fMpre = matra; + fMpreIndex = matraIndex; + break; + + case CF_POS_BELOW: + fMbelow = matra; + fMbelowIndex = matraIndex; + break; + + case CF_POS_ABOVE: + fMabove = matra; + fMaboveIndex = matraIndex; + break; + + case CF_POS_AFTER: + fMpost = matra; + fMpostIndex = matraIndex; + break; + + default: + // can't get here... + break; + } + } + } + +public: + IndicReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups) + : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage), + fMpre(0), fMpreIndex(0), fMbelow(0), fMbelowIndex(0), fMabove(0), fMaboveIndex(0), + fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0), fAlLakuna(0), fAlLakunaIndex(0), + fMatraFeatures(0), fMPreOutIndex(-1), fMPreFixups(mpreFixups), + fVMabove(0), fVMpost(0), fVMIndex(0), fVMFeatures(0), + fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0) + { + // nothing else to do... + } + + ~IndicReorderingOutput() + { + // nothing to do here... + } + + void reset() + { + fSyllableCount += 1; + + fMpre = fMbelow = fMabove = fMpost = fLengthMark = fAlLakuna = 0; + fMPreOutIndex = -1; + + fVMabove = fVMpost = 0; + fSMabove = fSMbelow = 0; + } + + void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures) + { + LEErrorCode success = LE_NO_ERROR; + + fOutChars[fOutIndex] = ch; + + fGlyphStorage.setCharIndex(fOutIndex, charIndex, success); + fGlyphStorage.setAuxData(fOutIndex, charFeatures | (fSyllableCount & LE_GLYPH_GROUP_MASK), success); + + fOutIndex += 1; + } + + void setFeatures ( le_uint32 charIndex, FeatureMask charFeatures) + { + LEErrorCode success = LE_NO_ERROR; + + fGlyphStorage.setAuxData( charIndex, charFeatures, success ); + + } + + FeatureMask getFeatures ( le_uint32 charIndex ) + { + LEErrorCode success = LE_NO_ERROR; + return fGlyphStorage.getAuxData(charIndex,success); + } + + void decomposeReorderMatras ( const IndicClassTable *classTable, le_int32 beginSyllable, le_int32 nextSyllable, le_int32 inv_count ) { + le_int32 i; + LEErrorCode success = LE_NO_ERROR; + + for ( i = beginSyllable ; i < nextSyllable ; i++ ) { + if ( classTable->isMatra(fOutChars[i+inv_count])) { + IndicClassTable::CharClass matraClass = classTable->getCharClass(fOutChars[i+inv_count]); + if ( classTable->isSplitMatra(matraClass)) { + le_int32 saveIndex = fGlyphStorage.getCharIndex(i+inv_count,success); + le_uint32 saveAuxData = fGlyphStorage.getAuxData(i+inv_count,success); + const SplitMatra *splitMatra = classTable->getSplitMatra(matraClass); + int j; + for (j = 0 ; j < SM_MAX_PIECES && *(splitMatra)[j] != 0 ; j++) { + LEUnicode piece = (*splitMatra)[j]; + if ( j == 0 ) { + fOutChars[i+inv_count] = piece; + matraClass = classTable->getCharClass(piece); + } else { + insertCharacter(piece,i+1+inv_count,saveIndex,saveAuxData); + nextSyllable++; + } + } + } + + if ((matraClass & CF_POS_MASK) == CF_POS_BEFORE) { + moveCharacter(i+inv_count,beginSyllable+inv_count); + } + } + } + } + + void moveCharacter( le_int32 fromPosition, le_int32 toPosition ) { + le_int32 i,saveIndex; + le_uint32 saveAuxData; + LEUnicode saveChar = fOutChars[fromPosition]; + LEErrorCode success = LE_NO_ERROR; + LEErrorCode success2 = LE_NO_ERROR; + saveIndex = fGlyphStorage.getCharIndex(fromPosition,success); + saveAuxData = fGlyphStorage.getAuxData(fromPosition,success); + + if ( fromPosition > toPosition ) { + for ( i = fromPosition ; i > toPosition ; i-- ) { + fOutChars[i] = fOutChars[i-1]; + fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i-1,success2),success); + fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i-1,success2), success); + + } + } else { + for ( i = fromPosition ; i < toPosition ; i++ ) { + fOutChars[i] = fOutChars[i+1]; + fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i+1,success2),success); + fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i+1,success2), success); + } + + } + fOutChars[toPosition] = saveChar; + fGlyphStorage.setCharIndex(toPosition,saveIndex,success); + fGlyphStorage.setAuxData(toPosition,saveAuxData,success); + + } + void insertCharacter( LEUnicode ch, le_int32 toPosition, le_int32 charIndex, le_uint32 auxData ) { + LEErrorCode success = LE_NO_ERROR; + le_int32 i; + fOutIndex += 1; + + for ( i = fOutIndex ; i > toPosition ; i--) { + fOutChars[i] = fOutChars[i-1]; + fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i-1,success),success); + fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i-1,success), success); + } + + fOutChars[toPosition] = ch; + fGlyphStorage.setCharIndex(toPosition,charIndex,success); + fGlyphStorage.setAuxData(toPosition,auxData,success); + + } + void removeCharacter( le_int32 fromPosition ) { + LEErrorCode success = LE_NO_ERROR; + le_int32 i; + fOutIndex -= 1; + + for ( i = fromPosition ; i < fOutIndex ; i--) { + fOutChars[i] = fOutChars[i+1]; + fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i+1,success),success); + fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i+1,success), success); + } + } + + le_bool noteMatra(const IndicClassTable *classTable, LEUnicode matra, le_uint32 matraIndex, FeatureMask matraFeatures, le_bool wordStart) + { + IndicClassTable::CharClass matraClass = classTable->getCharClass(matra); + + fMatraFeatures = matraFeatures; + + if (wordStart) { + fMatraFeatures |= initFeatureMask; + } + + if (IndicClassTable::isMatra(matraClass)) { + if (IndicClassTable::isSplitMatra(matraClass)) { + const SplitMatra *splitMatra = classTable->getSplitMatra(matraClass); + int i; + + for (i = 0; i < SM_MAX_PIECES && (*splitMatra)[i] != 0; i += 1) { + LEUnicode piece = (*splitMatra)[i]; + IndicClassTable::CharClass pieceClass = classTable->getCharClass(piece); + + saveMatra(piece, matraIndex, pieceClass); + } + } else { + saveMatra(matra, matraIndex, matraClass); + } + + return TRUE; + } + + return FALSE; + } + + void noteVowelModifier(const IndicClassTable *classTable, LEUnicode vowelModifier, le_uint32 vowelModifierIndex, FeatureMask vowelModifierFeatures) + { + IndicClassTable::CharClass vmClass = classTable->getCharClass(vowelModifier); + + fVMIndex = vowelModifierIndex; + fVMFeatures = vowelModifierFeatures; + + if (IndicClassTable::isVowelModifier(vmClass)) { + switch (vmClass & CF_POS_MASK) { + case CF_POS_ABOVE: + fVMabove = vowelModifier; + break; + + case CF_POS_AFTER: + fVMpost = vowelModifier; + break; + + default: + // FIXME: this is an error... + break; + } + } + } + + void noteStressMark(const IndicClassTable *classTable, LEUnicode stressMark, le_uint32 stressMarkIndex, FeatureMask stressMarkFeatures) + { + IndicClassTable::CharClass smClass = classTable->getCharClass(stressMark); + + fSMIndex = stressMarkIndex; + fSMFeatures = stressMarkFeatures; + + if (IndicClassTable::isStressMark(smClass)) { + switch (smClass & CF_POS_MASK) { + case CF_POS_ABOVE: + fSMabove = stressMark; + break; + + case CF_POS_BELOW: + fSMbelow = stressMark; + break; + + default: + // FIXME: this is an error... + break; + } + } + } + + void noteBaseConsonant() + { + if (fMPreFixups != NULL && fMPreOutIndex >= 0) { + fMPreFixups->add(fOutIndex, fMPreOutIndex); + } + } + + // Handles Al-Lakuna in Sinhala split vowels. + void writeAlLakuna() + { + if (fAlLakuna != 0) { + writeChar(fAlLakuna, fAlLakunaIndex, fMatraFeatures); + } + } + + void writeMpre() + { + if (fMpre != 0) { + fMPreOutIndex = fOutIndex; + writeChar(fMpre, fMpreIndex, fMatraFeatures); + } + } + + void writeMbelow() + { + if (fMbelow != 0) { + writeChar(fMbelow, fMbelowIndex, fMatraFeatures); + } + } + + void writeMabove() + { + if (fMabove != 0) { + writeChar(fMabove, fMaboveIndex, fMatraFeatures); + } + } + + void writeMpost() + { + if (fMpost != 0) { + writeChar(fMpost, fMpostIndex, fMatraFeatures); + } + } + + void writeLengthMark() + { + if (fLengthMark != 0) { + writeChar(fLengthMark, fLengthMarkIndex, fMatraFeatures); + } + } + + void writeVMabove() + { + if (fVMabove != 0) { + writeChar(fVMabove, fVMIndex, fVMFeatures); + } + } + + void writeVMpost() + { + if (fVMpost != 0) { + writeChar(fVMpost, fVMIndex, fVMFeatures); + } + } + + void writeSMabove() + { + if (fSMabove != 0) { + writeChar(fSMabove, fSMIndex, fSMFeatures); + } + } + + void writeSMbelow() + { + if (fSMbelow != 0) { + writeChar(fSMbelow, fSMIndex, fSMFeatures); + } + } + + le_int32 getOutputIndex() + { + return fOutIndex; + } +}; + + + +// TODO: Find better names for these! +#define tagArray4 (loclFeatureMask | nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask) +#define tagArray3 (pstfFeatureMask | tagArray4) +#define tagArray2 (halfFeatureMask | tagArray3) +#define tagArray1 (blwfFeatureMask | tagArray2) +#define tagArray0 (rphfFeatureMask | tagArray1) + +static const FeatureMap featureMap[] = { + {loclFeatureTag, loclFeatureMask}, + {initFeatureTag, initFeatureMask}, + {nuktFeatureTag, nuktFeatureMask}, + {akhnFeatureTag, akhnFeatureMask}, + {rphfFeatureTag, rphfFeatureMask}, + {blwfFeatureTag, blwfFeatureMask}, + {halfFeatureTag, halfFeatureMask}, + {pstfFeatureTag, pstfFeatureMask}, + {vatuFeatureTag, vatuFeatureMask}, + {presFeatureTag, presFeatureMask}, + {blwsFeatureTag, blwsFeatureMask}, + {abvsFeatureTag, abvsFeatureMask}, + {pstsFeatureTag, pstsFeatureMask}, + {halnFeatureTag, halnFeatureMask}, + {blwmFeatureTag, blwmFeatureMask}, + {abvmFeatureTag, abvmFeatureMask}, + {distFeatureTag, distFeatureMask} +}; + +static const le_int32 featureCount = LE_ARRAY_SIZE(featureMap); + +static const FeatureMap v2FeatureMap[] = { + {loclFeatureTag, loclFeatureMask}, + {nuktFeatureTag, nuktFeatureMask}, + {akhnFeatureTag, akhnFeatureMask}, + {rphfFeatureTag, rphfFeatureMask}, + {rkrfFeatureTag, rkrfFeatureMask}, + {blwfFeatureTag, blwfFeatureMask}, + {halfFeatureTag, halfFeatureMask}, + {vatuFeatureTag, vatuFeatureMask}, + {cjctFeatureTag, cjctFeatureMask}, + {presFeatureTag, presFeatureMask}, + {abvsFeatureTag, abvsFeatureMask}, + {blwsFeatureTag, blwsFeatureMask}, + {pstsFeatureTag, pstsFeatureMask}, + {halnFeatureTag, halnFeatureMask}, + {caltFeatureTag, caltFeatureMask}, + {kernFeatureTag, kernFeatureMask}, + {distFeatureTag, distFeatureMask}, + {abvmFeatureTag, abvmFeatureMask}, + {blwmFeatureTag, blwmFeatureMask} +}; + +static const le_int32 v2FeatureMapCount = LE_ARRAY_SIZE(v2FeatureMap); + +static const le_int8 stateTable[][CC_COUNT] = +{ +// xx vm sm iv i2 i3 ct cn nu dv s1 s2 s3 vr zw al + { 1, 6, 1, 5, 8, 11, 3, 2, 1, 5, 9, 5, 5, 1, 1, 1}, // 0 - ground state + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 1 - exit state + {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, 12, -1}, // 2 - consonant with nukta + {-1, 6, 1, -1, -1, -1, -1, -1, 2, 5, 9, 5, 5, 4, 12, 13}, // 3 - consonant + {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, 7, -1}, // 4 - consonant virama + {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 5 - dependent vowels + {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 6 - vowel mark + {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, -1, -1}, // 7 - consonant virama ZWJ, consonant ZWJ virama + {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1}, // 8 - independent vowels that can take a virama + {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 5, -1, -1, -1}, // 9 - first part of split vowel + {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1, -1}, // 10 - second part of split vowel + {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, -1, -1}, // 11 - independent vowels that can take an iv + {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, 7}, // 12 - consonant ZWJ (TODO: Take everything else that can be after a consonant?) + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1} // 13 - consonant al-lakuna ZWJ consonant +}; + + +const FeatureMap *IndicReordering::getFeatureMap(le_int32 &count) +{ + count = featureCount; + + return featureMap; +} + +const FeatureMap *IndicReordering::getv2FeatureMap(le_int32 &count) +{ + count = v2FeatureMapCount; + + return v2FeatureMap; +} + +le_int32 IndicReordering::findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount) +{ + le_int32 cursor = prev; + le_int8 state = 0; + le_int8 consonant_count = 0; + + while (cursor < charCount) { + IndicClassTable::CharClass charClass = classTable->getCharClass(chars[cursor]); + + if ( IndicClassTable::isConsonant(charClass) ) { + consonant_count++; + if ( consonant_count > MAX_CONSONANTS_PER_SYLLABLE ) { + break; + } + } + + state = stateTable[state][charClass & CF_CLASS_MASK]; + + if (state < 0) { + break; + } + + cursor += 1; + } + + return cursor; +} + +le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode, + LEUnicode *outChars, LEGlyphStorage &glyphStorage, + MPreFixups **outMPreFixups, LEErrorCode& success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + MPreFixups *mpreFixups = NULL; + const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); + + if (classTable->scriptFlags & SF_MPRE_FIXUP) { + mpreFixups = new MPreFixups(charCount); + if (mpreFixups == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + } + + IndicReorderingOutput output(outChars, glyphStorage, mpreFixups); + le_int32 i, prev = 0; + le_bool lastInWord = FALSE; + + while (prev < charCount) { + le_int32 syllable = findSyllable(classTable, chars, prev, charCount); + le_int32 matra, markStart = syllable; + + output.reset(); + + if (classTable->isStressMark(chars[markStart - 1])) { + markStart -= 1; + output.noteStressMark(classTable, chars[markStart], markStart, tagArray1); + } + + if (markStart != prev && classTable->isVowelModifier(chars[markStart - 1])) { + markStart -= 1; + output.noteVowelModifier(classTable, chars[markStart], markStart, tagArray1); + } + + matra = markStart - 1; + + while (output.noteMatra(classTable, chars[matra], matra, tagArray1, !lastInWord) && matra != prev) { + matra -= 1; + } + + lastInWord = TRUE; + + switch (classTable->getCharClass(chars[prev]) & CF_CLASS_MASK) { + case CC_RESERVED: + lastInWord = FALSE; + /* fall through */ + + case CC_INDEPENDENT_VOWEL: + case CC_ZERO_WIDTH_MARK: + for (i = prev; i < syllable; i += 1) { + output.writeChar(chars[i], i, tagArray1); + } + + break; + + case CC_AL_LAKUNA: + case CC_NUKTA: + output.writeChar(C_DOTTED_CIRCLE, prev, tagArray1); + output.writeChar(chars[prev], prev, tagArray1); + break; + + case CC_VIRAMA: + // A lone virama is illegal unless it follows a + // MALAYALAM_VOWEL_SIGN_U. Such a usage is called + // "samvruthokaram". + if (chars[prev - 1] != C_MALAYALAM_VOWEL_SIGN_U) { + output.writeChar(C_DOTTED_CIRCLE, prev, tagArray1); + } + + output.writeChar(chars[prev], prev, tagArray1); + break; + + case CC_DEPENDENT_VOWEL: + case CC_SPLIT_VOWEL_PIECE_1: + case CC_SPLIT_VOWEL_PIECE_2: + case CC_SPLIT_VOWEL_PIECE_3: + case CC_VOWEL_MODIFIER: + case CC_STRESS_MARK: + output.writeMpre(); + + output.writeChar(C_DOTTED_CIRCLE, prev, tagArray1); + + output.writeMbelow(); + output.writeSMbelow(); + output.writeMabove(); + + if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) != 0) { + output.writeMpost(); + } + + if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) != 0) { + output.writeVMabove(); + output.writeSMabove(); // FIXME: there are no SM's in these scripts... + } + + if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) == 0) { + output.writeMpost(); + } + + output.writeLengthMark(); + output.writeAlLakuna(); + + if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) { + output.writeVMabove(); + output.writeSMabove(); + } + + output.writeVMpost(); + break; + + case CC_INDEPENDENT_VOWEL_2: + case CC_INDEPENDENT_VOWEL_3: + case CC_CONSONANT: + case CC_CONSONANT_WITH_NUKTA: + { + le_uint32 length = markStart - prev; + le_int32 lastConsonant = markStart - 1; + le_int32 baseLimit = prev; + + // Check for REPH at front of syllable + if (length > 2 && classTable->isReph(chars[prev]) && classTable->isVirama(chars[prev + 1]) && chars[prev + 2] != C_SIGN_ZWNJ) { + baseLimit += 2; + + // Check for eyelash RA, if the script supports it + if ((classTable->scriptFlags & SF_EYELASH_RA) != 0 && + chars[baseLimit] == C_SIGN_ZWJ) { + if (length > 3) { + baseLimit += 1; + } else { + baseLimit -= 2; + } + } + } + + while (lastConsonant > baseLimit && !classTable->isConsonant(chars[lastConsonant])) { + lastConsonant -= 1; + } + + IndicClassTable::CharClass charClass = CC_RESERVED; + IndicClassTable::CharClass nextClass = CC_RESERVED; + le_int32 baseConsonant = lastConsonant; + le_int32 postBase = lastConsonant + 1; + le_int32 postBaseLimit = classTable->scriptFlags & SF_POST_BASE_LIMIT_MASK; + le_bool seenVattu = FALSE; + le_bool seenBelowBaseForm = FALSE; + le_bool hasNukta = FALSE; + le_bool hasBelowBaseForm = FALSE; + le_bool hasPostBaseForm = FALSE; + + if (postBase < markStart && classTable->isNukta(chars[postBase])) { + charClass = CC_NUKTA; + postBase += 1; + } + + while (baseConsonant > baseLimit) { + nextClass = charClass; + hasNukta = IndicClassTable::isNukta(nextClass); + charClass = classTable->getCharClass(chars[baseConsonant]); + + hasBelowBaseForm = IndicClassTable::hasBelowBaseForm(charClass) && !hasNukta; + hasPostBaseForm = IndicClassTable::hasPostBaseForm(charClass) && !hasNukta; + + if (IndicClassTable::isConsonant(charClass)) { + if (postBaseLimit == 0 || seenVattu || + (baseConsonant > baseLimit && !classTable->isVirama(chars[baseConsonant - 1])) || + !(hasBelowBaseForm || hasPostBaseForm)) { + break; + } + + // consonants with nuktas are never vattus + seenVattu = IndicClassTable::isVattu(charClass) && !hasNukta; + + // consonants with nuktas never have below- or post-base forms + if (hasPostBaseForm) { + if (seenBelowBaseForm) { + break; + } + + postBase = baseConsonant; + } else if (hasBelowBaseForm) { + seenBelowBaseForm = TRUE; + } + + postBaseLimit -= 1; + } + + baseConsonant -= 1; + } + + // Write Mpre + output.writeMpre(); + + // Write eyelash RA + // NOTE: baseLimit == prev + 3 iff eyelash RA present... + if (baseLimit == prev + 3) { + output.writeChar(chars[prev], prev, tagArray2); + output.writeChar(chars[prev + 1], prev + 1, tagArray2); + output.writeChar(chars[prev + 2], prev + 2, tagArray2); + } + + // write any pre-base consonants + le_bool supressVattu = TRUE; + + for (i = baseLimit; i < baseConsonant; i += 1) { + LEUnicode ch = chars[i]; + // Don't put 'blwf' on first consonant. + FeatureMask features = (i == baseLimit? tagArray2 : tagArray1); + + charClass = classTable->getCharClass(ch); + nextClass = classTable->getCharClass(chars[i + 1]); + hasNukta = IndicClassTable::isNukta(nextClass); + + if (IndicClassTable::isConsonant(charClass)) { + if (IndicClassTable::isVattu(charClass) && !hasNukta && supressVattu) { + features = tagArray4; + } + + supressVattu = IndicClassTable::isVattu(charClass) && !hasNukta; + } else if (IndicClassTable::isVirama(charClass) && chars[i + 1] == C_SIGN_ZWNJ) + { + features = tagArray4; + } + + output.writeChar(ch, i, features); + } + + le_int32 bcSpan = baseConsonant + 1; + + if (bcSpan < markStart && classTable->isNukta(chars[bcSpan])) { + bcSpan += 1; + } + + if (baseConsonant == lastConsonant && bcSpan < markStart && + (classTable->isVirama(chars[bcSpan]) || classTable->isAlLakuna(chars[bcSpan]))) { + bcSpan += 1; + + if (bcSpan < markStart && chars[bcSpan] == C_SIGN_ZWNJ) { + bcSpan += 1; + } + } + + // note the base consonant for post-GSUB fixups + output.noteBaseConsonant(); + + // write base consonant + for (i = baseConsonant; i < bcSpan; i += 1) { + output.writeChar(chars[i], i, tagArray4); + } + + if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) != 0) { + output.writeMbelow(); + output.writeSMbelow(); // FIXME: there are no SMs in these scripts... + output.writeMabove(); + output.writeMpost(); + } + + // write below-base consonants + if (baseConsonant != lastConsonant) { + for (i = bcSpan + 1; i < postBase; i += 1) { + output.writeChar(chars[i], i, tagArray1); + } + + if (postBase > lastConsonant) { + // write halant that was after base consonant + output.writeChar(chars[bcSpan], bcSpan, tagArray1); + } + } + + // write Mbelow, SMbelow, Mabove + if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) == 0) { + output.writeMbelow(); + output.writeSMbelow(); + output.writeMabove(); + } + + if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) != 0) { + if (baseLimit == prev + 2) { + output.writeChar(chars[prev], prev, tagArray0); + output.writeChar(chars[prev + 1], prev + 1, tagArray0); + } + + output.writeVMabove(); + output.writeSMabove(); // FIXME: there are no SM's in these scripts... + } + + // write post-base consonants + // FIXME: does this put the right tags on post-base consonants? + if (baseConsonant != lastConsonant) { + if (postBase <= lastConsonant) { + for (i = postBase; i <= lastConsonant; i += 1) { + output.writeChar(chars[i], i, tagArray3); + } + + // write halant that was after base consonant + output.writeChar(chars[bcSpan], bcSpan, tagArray1); + } + + // write the training halant, if there is one + if (lastConsonant < matra && classTable->isVirama(chars[matra])) { + output.writeChar(chars[matra], matra, tagArray4); + } + } + + // write Mpost + if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) == 0) { + output.writeMpost(); + } + + output.writeLengthMark(); + output.writeAlLakuna(); + + // write reph + if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) { + if (baseLimit == prev + 2) { + output.writeChar(chars[prev], prev, tagArray0); + output.writeChar(chars[prev + 1], prev + 1, tagArray0); + } + + output.writeVMabove(); + output.writeSMabove(); + } + + output.writeVMpost(); + + break; + } + + default: + break; + } + + prev = syllable; + } + + *outMPreFixups = mpreFixups; + + return output.getOutputIndex(); +} + +void IndicReordering::adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage, LEErrorCode& success) +{ + if (mpreFixups != NULL) { + mpreFixups->apply(glyphStorage, success); + + delete mpreFixups; + } +} + +void IndicReordering::applyPresentationForms(LEGlyphStorage &glyphStorage, le_int32 count) +{ + LEErrorCode success = LE_NO_ERROR; + +// This sets us up for 2nd pass of glyph substitution as well as setting the feature masks for the +// GPOS table lookups + + for ( le_int32 i = 0 ; i < count ; i++ ) { + glyphStorage.setAuxData(i, ( presentationFormsMask | positioningFormsMask ), success); + } + +} +void IndicReordering::finalReordering(LEGlyphStorage &glyphStorage, le_int32 count) +{ + LEErrorCode success = LE_NO_ERROR; + + // Reposition REPH as appropriate + + for ( le_int32 i = 0 ; i < count ; i++ ) { + + le_int32 tmpAuxData = glyphStorage.getAuxData(i,success); + LEGlyphID tmpGlyph = glyphStorage.getGlyphID(i,success); + + if ( ( tmpGlyph != NO_GLYPH ) && (tmpAuxData & rephConsonantMask) && !(tmpAuxData & repositionedGlyphMask)) { + + le_bool targetPositionFound = false; + le_int32 targetPosition = i+1; + le_int32 baseConsonantData; + + while (!targetPositionFound) { + tmpGlyph = glyphStorage.getGlyphID(targetPosition,success); + tmpAuxData = glyphStorage.getAuxData(targetPosition,success); + + if ( tmpAuxData & baseConsonantMask ) { + baseConsonantData = tmpAuxData; + targetPositionFound = true; + } else { + targetPosition++; + } + } + + // Make sure we are not putting the reph into an empty hole + + le_bool targetPositionHasGlyph = false; + while (!targetPositionHasGlyph) { + tmpGlyph = glyphStorage.getGlyphID(targetPosition,success); + if ( tmpGlyph != NO_GLYPH ) { + targetPositionHasGlyph = true; + } else { + targetPosition--; + } + } + + // Make sure that REPH is positioned after any above base or post base matras + // + le_bool checkMatraDone = false; + le_int32 checkMatraPosition = targetPosition+1; + while ( !checkMatraDone ) { + tmpAuxData = glyphStorage.getAuxData(checkMatraPosition,success); + if ( checkMatraPosition >= count || ( (tmpAuxData ^ baseConsonantData) & LE_GLYPH_GROUP_MASK)) { + checkMatraDone = true; + continue; + } + if ( (tmpAuxData & matraMask) && + (((tmpAuxData & markPositionMask) == aboveBasePosition) || + ((tmpAuxData & markPositionMask) == postBasePosition))) { + targetPosition = checkMatraPosition; + } + checkMatraPosition++; + } + + glyphStorage.moveGlyph(i,targetPosition,repositionedGlyphMask); + } + } +} + + +le_int32 IndicReordering::v2process(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode, + LEUnicode *outChars, LEGlyphStorage &glyphStorage) +{ + const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); + + DynamicProperties dynProps[INDIC_BLOCK_SIZE]; + IndicReordering::getDynamicProperties(dynProps,classTable); + + IndicReorderingOutput output(outChars, glyphStorage, NULL); + le_int32 i, firstConsonant, baseConsonant, secondConsonant, inv_count = 0, beginSyllable = 0; + //le_bool lastInWord = FALSE; + + while (beginSyllable < charCount) { + le_int32 nextSyllable = findSyllable(classTable, chars, beginSyllable, charCount); + + output.reset(); + + // Find the First Consonant + for ( firstConsonant = beginSyllable ; firstConsonant < nextSyllable ; firstConsonant++ ) { + if ( classTable->isConsonant(chars[firstConsonant]) ) { + break; + } + } + + // Find the base consonant + + baseConsonant = nextSyllable - 1; + secondConsonant = firstConsonant; + + // TODO: Use Dynamic Properties for hasBelowBaseForm and hasPostBaseForm() + + while ( baseConsonant > firstConsonant ) { + if ( classTable->isConsonant(chars[baseConsonant]) && + !classTable->hasBelowBaseForm(chars[baseConsonant]) && + !classTable->hasPostBaseForm(chars[baseConsonant]) ) { + break; + } + else { + if ( classTable->isConsonant(chars[baseConsonant]) ) { + secondConsonant = baseConsonant; + } + baseConsonant--; + } + } + + // If the syllable starts with Ra + Halant ( in a script that has Reph ) and has more than one + // consonant, Ra is excluced from candidates for base consonants + + if ( classTable->isReph(chars[beginSyllable]) && + beginSyllable+1 < nextSyllable && classTable->isVirama(chars[beginSyllable+1]) && + secondConsonant != firstConsonant) { + baseConsonant = secondConsonant; + } + + // Populate the output + for ( i = beginSyllable ; i < nextSyllable ; i++ ) { + + // Handle invalid combinartions + + if ( classTable->isVirama(chars[beginSyllable]) || + classTable->isMatra(chars[beginSyllable]) || + classTable->isVowelModifier(chars[beginSyllable]) || + classTable->isNukta(chars[beginSyllable]) ) { + output.writeChar(C_DOTTED_CIRCLE,beginSyllable,basicShapingFormsMask); + inv_count++; + } + output.writeChar(chars[i],i, basicShapingFormsMask); + + } + + // Adjust features and set syllable structure bits + + for ( i = beginSyllable ; i < nextSyllable ; i++ ) { + + FeatureMask outMask = output.getFeatures(i+inv_count); + FeatureMask saveMask = outMask; + + // Since reph can only validly occur at the beginning of a syllable + // We only apply it to the first 2 characters in the syllable, to keep it from + // conflicting with other features ( i.e. rkrf ) + + // TODO : Use the dynamic property for determining isREPH + if ( i == beginSyllable && i < baseConsonant && classTable->isReph(chars[i]) && + i+1 < nextSyllable && classTable->isVirama(chars[i+1])) { + outMask |= rphfFeatureMask; + outMask |= rephConsonantMask; + output.setFeatures(i+1+inv_count,outMask); + + } + + if ( i == baseConsonant ) { + outMask |= baseConsonantMask; + } + + if ( classTable->isMatra(chars[i])) { + outMask |= matraMask; + if ( classTable->hasAboveBaseForm(chars[i])) { + outMask |= aboveBasePosition; + } else if ( classTable->hasBelowBaseForm(chars[i])) { + outMask |= belowBasePosition; + } + } + + // Don't apply half form to virama that stands alone at the end of a syllable + // to prevent half forms from forming when syllable ends with virama + + if ( classTable->isVirama(chars[i]) && (i+1 == nextSyllable) ) { + outMask ^= halfFeatureMask; + if ( classTable->isConsonant(chars[i-1]) ) { + FeatureMask tmp = output.getFeatures(i-1+inv_count); + tmp ^= halfFeatureMask; + output.setFeatures(i-1+inv_count,tmp); + } + } + + if ( outMask != saveMask ) { + output.setFeatures(i+inv_count,outMask); + } + } + + output.decomposeReorderMatras(classTable,beginSyllable,nextSyllable,inv_count); + + beginSyllable = nextSyllable; + } + + + return output.getOutputIndex(); +} + + +void IndicReordering::getDynamicProperties( DynamicProperties */*dProps*/, const IndicClassTable *classTable ) { + + + LEUnicode currentChar; + LEUnicode workChars[2]; + LEGlyphStorage workGlyphs; + + IndicReorderingOutput workOutput(workChars, workGlyphs, NULL); + + //le_int32 offset = 0; + +#if 0 +// TODO: Should this section of code have actually been doing something? + // First find the relevant virama for the script we are dealing with + LEUnicode virama; + for ( currentChar = classTable->firstChar ; currentChar <= classTable->lastChar ; currentChar++ ) { + if ( classTable->isVirama(currentChar)) { + virama = currentChar; + break; + } + } +#endif + + for ( currentChar = classTable->firstChar ; currentChar <= classTable->lastChar ; currentChar++ ) { + if ( classTable->isConsonant(currentChar)) { + workOutput.reset(); + } + } + + +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/IndicReordering.h b/Build/source/libs/icu/icu-50.1/layout/IndicReordering.h new file mode 100644 index 00000000000..4d61c525220 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/IndicReordering.h @@ -0,0 +1,345 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved + * + */ + +#ifndef __INDICREORDERING_H +#define __INDICREORDERING_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +// Characters that get refered to by name... +#define C_SIGN_ZWNJ 0x200C +#define C_SIGN_ZWJ 0x200D + +// Character class values +#define CC_RESERVED 0U +#define CC_VOWEL_MODIFIER 1U +#define CC_STRESS_MARK 2U +#define CC_INDEPENDENT_VOWEL 3U +#define CC_INDEPENDENT_VOWEL_2 4U +#define CC_INDEPENDENT_VOWEL_3 5U +#define CC_CONSONANT 6U +#define CC_CONSONANT_WITH_NUKTA 7U +#define CC_NUKTA 8U +#define CC_DEPENDENT_VOWEL 9U +#define CC_SPLIT_VOWEL_PIECE_1 10U +#define CC_SPLIT_VOWEL_PIECE_2 11U +#define CC_SPLIT_VOWEL_PIECE_3 12U +#define CC_VIRAMA 13U +#define CC_ZERO_WIDTH_MARK 14U +#define CC_AL_LAKUNA 15U +#define CC_COUNT 16U + +// Character class flags +#define CF_CLASS_MASK 0x0000FFFFU + +#define CF_CONSONANT 0x80000000U + +#define CF_REPH 0x40000000U +#define CF_VATTU 0x20000000U +#define CF_BELOW_BASE 0x10000000U +#define CF_POST_BASE 0x08000000U +#define CF_LENGTH_MARK 0x04000000U + +#define CF_POS_BEFORE 0x00300000U +#define CF_POS_BELOW 0x00200000U +#define CF_POS_ABOVE 0x00100000U +#define CF_POS_AFTER 0x00000000U +#define CF_POS_MASK 0x00300000U + +#define CF_INDEX_MASK 0x000F0000U +#define CF_INDEX_SHIFT 16 + +// Script flag bits +#define SF_MATRAS_AFTER_BASE 0x80000000U +#define SF_REPH_AFTER_BELOW 0x40000000U +#define SF_EYELASH_RA 0x20000000U +#define SF_MPRE_FIXUP 0x10000000U +#define SF_FILTER_ZERO_WIDTH 0x08000000U + +#define SF_POST_BASE_LIMIT_MASK 0x0000FFFFU +#define SF_NO_POST_BASE_LIMIT 0x00007FFFU + +#define SM_MAX_PIECES 3 + +typedef LEUnicode SplitMatra[SM_MAX_PIECES]; + +class MPreFixups; +class LEGlyphStorage; + +// Dynamic Properties ( v2 fonts only ) +typedef le_uint32 DynamicProperties; + +#define DP_REPH 0x80000000U +#define DP_HALF 0x40000000U +#define DP_PREF 0x20000000U +#define DP_BLWF 0x10000000U +#define DP_PSTF 0x08000000U + +struct IndicClassTable +{ + typedef le_uint32 CharClass; + typedef le_uint32 ScriptFlags; + + LEUnicode firstChar; + LEUnicode lastChar; + le_int32 worstCaseExpansion; + ScriptFlags scriptFlags; + const CharClass *classTable; + const SplitMatra *splitMatraTable; + + inline le_int32 getWorstCaseExpansion() const; + inline le_bool getFilterZeroWidth() const; + + CharClass getCharClass(LEUnicode ch) const; + + inline const SplitMatra *getSplitMatra(CharClass charClass) const; + + inline le_bool isVowelModifier(LEUnicode ch) const; + inline le_bool isStressMark(LEUnicode ch) const; + inline le_bool isConsonant(LEUnicode ch) const; + inline le_bool isReph(LEUnicode ch) const; + inline le_bool isVirama(LEUnicode ch) const; + inline le_bool isAlLakuna(LEUnicode ch) const; + inline le_bool isNukta(LEUnicode ch) const; + inline le_bool isVattu(LEUnicode ch) const; + inline le_bool isMatra(LEUnicode ch) const; + inline le_bool isSplitMatra(LEUnicode ch) const; + inline le_bool isLengthMark(LEUnicode ch) const; + inline le_bool hasPostOrBelowBaseForm(LEUnicode ch) const; + inline le_bool hasPostBaseForm(LEUnicode ch) const; + inline le_bool hasBelowBaseForm(LEUnicode ch) const; + inline le_bool hasAboveBaseForm(LEUnicode ch) const; + + inline static le_bool isVowelModifier(CharClass charClass); + inline static le_bool isStressMark(CharClass charClass); + inline static le_bool isConsonant(CharClass charClass); + inline static le_bool isReph(CharClass charClass); + inline static le_bool isVirama(CharClass charClass); + inline static le_bool isAlLakuna(CharClass charClass); + inline static le_bool isNukta(CharClass charClass); + inline static le_bool isVattu(CharClass charClass); + inline static le_bool isMatra(CharClass charClass); + inline static le_bool isSplitMatra(CharClass charClass); + inline static le_bool isLengthMark(CharClass charClass); + inline static le_bool hasPostOrBelowBaseForm(CharClass charClass); + inline static le_bool hasPostBaseForm(CharClass charClass); + inline static le_bool hasBelowBaseForm(CharClass charClass); + inline static le_bool hasAboveBaseForm(CharClass charClass); + + static const IndicClassTable *getScriptClassTable(le_int32 scriptCode); +}; + +class IndicReordering /* not : public UObject because all methods are static */ { +public: + static le_int32 getWorstCaseExpansion(le_int32 scriptCode); + + static le_bool getFilterZeroWidth(le_int32 scriptCode); + + static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, + LEUnicode *outChars, LEGlyphStorage &glyphStorage, + MPreFixups **outMPreFixups, LEErrorCode& success); + + static void adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage, LEErrorCode& success); + + static le_int32 v2process(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, + LEUnicode *outChars, LEGlyphStorage &glyphStorage); + + static const FeatureMap *getFeatureMap(le_int32 &count); + + static const FeatureMap *getv2FeatureMap(le_int32 &count); + + static void applyPresentationForms(LEGlyphStorage &glyphStorage, le_int32 count); + + static void finalReordering(LEGlyphStorage &glyphStorage, le_int32 count); + + static void getDynamicProperties(DynamicProperties *dProps, const IndicClassTable *classTable); + +private: + // do not instantiate + IndicReordering(); + + static le_int32 findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount); + +}; + +inline le_int32 IndicClassTable::getWorstCaseExpansion() const +{ + return worstCaseExpansion; +} + +inline le_bool IndicClassTable::getFilterZeroWidth() const +{ + return (scriptFlags & SF_FILTER_ZERO_WIDTH) != 0; +} + +inline const SplitMatra *IndicClassTable::getSplitMatra(CharClass charClass) const +{ + le_int32 index = (charClass & CF_INDEX_MASK) >> CF_INDEX_SHIFT; + + return &splitMatraTable[index - 1]; +} + +inline le_bool IndicClassTable::isVowelModifier(CharClass charClass) +{ + return (charClass & CF_CLASS_MASK) == CC_VOWEL_MODIFIER; +} + +inline le_bool IndicClassTable::isStressMark(CharClass charClass) +{ + return (charClass & CF_CLASS_MASK) == CC_STRESS_MARK; +} + +inline le_bool IndicClassTable::isConsonant(CharClass charClass) +{ + return (charClass & CF_CONSONANT) != 0; +} + +inline le_bool IndicClassTable::isReph(CharClass charClass) +{ + return (charClass & CF_REPH) != 0; +} + +inline le_bool IndicClassTable::isNukta(CharClass charClass) +{ + return (charClass & CF_CLASS_MASK) == CC_NUKTA; +} + +inline le_bool IndicClassTable::isVirama(CharClass charClass) +{ + return (charClass & CF_CLASS_MASK) == CC_VIRAMA; +} + +inline le_bool IndicClassTable::isAlLakuna(CharClass charClass) +{ + return (charClass & CF_CLASS_MASK) == CC_AL_LAKUNA; +} + +inline le_bool IndicClassTable::isVattu(CharClass charClass) +{ + return (charClass & CF_VATTU) != 0; +} + +inline le_bool IndicClassTable::isMatra(CharClass charClass) +{ + charClass &= CF_CLASS_MASK; + + return charClass >= CC_DEPENDENT_VOWEL && charClass <= CC_SPLIT_VOWEL_PIECE_3; +} + +inline le_bool IndicClassTable::isSplitMatra(CharClass charClass) +{ + return (charClass & CF_INDEX_MASK) != 0; +} + +inline le_bool IndicClassTable::isLengthMark(CharClass charClass) +{ + return (charClass & CF_LENGTH_MARK) != 0; +} + +inline le_bool IndicClassTable::hasPostOrBelowBaseForm(CharClass charClass) +{ + return (charClass & (CF_POST_BASE | CF_BELOW_BASE)) != 0; +} + +inline le_bool IndicClassTable::hasPostBaseForm(CharClass charClass) +{ + return (charClass & CF_POST_BASE) != 0; +} + +inline le_bool IndicClassTable::hasBelowBaseForm(CharClass charClass) +{ + return (charClass & CF_BELOW_BASE) != 0; +} + +inline le_bool IndicClassTable::hasAboveBaseForm(CharClass charClass) +{ + return ((charClass & CF_POS_MASK) == CF_POS_ABOVE); +} + +inline le_bool IndicClassTable::isVowelModifier(LEUnicode ch) const +{ + return isVowelModifier(getCharClass(ch)); +} + +inline le_bool IndicClassTable::isStressMark(LEUnicode ch) const +{ + return isStressMark(getCharClass(ch)); +} + +inline le_bool IndicClassTable::isConsonant(LEUnicode ch) const +{ + return isConsonant(getCharClass(ch)); +} + +inline le_bool IndicClassTable::isReph(LEUnicode ch) const +{ + return isReph(getCharClass(ch)); +} + +inline le_bool IndicClassTable::isVirama(LEUnicode ch) const +{ + return isVirama(getCharClass(ch)); +} + +inline le_bool IndicClassTable::isAlLakuna(LEUnicode ch) const +{ + return isAlLakuna(getCharClass(ch)); +} + +inline le_bool IndicClassTable::isNukta(LEUnicode ch) const +{ + return isNukta(getCharClass(ch)); +} + +inline le_bool IndicClassTable::isVattu(LEUnicode ch) const +{ + return isVattu(getCharClass(ch)); +} + +inline le_bool IndicClassTable::isMatra(LEUnicode ch) const +{ + return isMatra(getCharClass(ch)); +} + +inline le_bool IndicClassTable::isSplitMatra(LEUnicode ch) const +{ + return isSplitMatra(getCharClass(ch)); +} + +inline le_bool IndicClassTable::isLengthMark(LEUnicode ch) const +{ + return isLengthMark(getCharClass(ch)); +} + +inline le_bool IndicClassTable::hasPostOrBelowBaseForm(LEUnicode ch) const +{ + return hasPostOrBelowBaseForm(getCharClass(ch)); +} + +inline le_bool IndicClassTable::hasPostBaseForm(LEUnicode ch) const +{ + return hasPostBaseForm(getCharClass(ch)); +} + +inline le_bool IndicClassTable::hasBelowBaseForm(LEUnicode ch) const +{ + return hasBelowBaseForm(getCharClass(ch)); +} + +inline le_bool IndicClassTable::hasAboveBaseForm(LEUnicode ch) const +{ + return hasAboveBaseForm(getCharClass(ch)); +} +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/KernTable.cpp b/Build/source/libs/icu/icu-50.1/layout/KernTable.cpp new file mode 100644 index 00000000000..45ce091d440 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/KernTable.cpp @@ -0,0 +1,231 @@ +/* + * @(#)KernTable.cpp 1.1 04/10/13 + * + * (C) Copyright IBM Corp. 2004-2007 - All Rights Reserved + * + */ + +#include "KernTable.h" +#include "LEFontInstance.h" +#include "LEGlyphStorage.h" + +#include "LESwaps.h" +#include "OpenTypeUtilities.h" + +#include <stdio.h> + +#define DEBUG 0 + +U_NAMESPACE_BEGIN + +struct PairInfo { + le_uint16 left; // left glyph of kern pair + le_uint16 right; // right glyph of kern pair + le_int16 value; // fword, kern value in funits +}; +#define KERN_PAIRINFO_SIZE 6 + +#define SWAP_KEY(p) (((le_uint32) SWAPW((p)->left) << 16) | SWAPW((p)->right)) + +struct Subtable_0 { + le_uint16 nPairs; + le_uint16 searchRange; + le_uint16 entrySelector; + le_uint16 rangeShift; +}; +#define KERN_SUBTABLE_0_HEADER_SIZE 8 + +// Kern table version 0 only +struct SubtableHeader { + le_uint16 version; + le_uint16 length; + le_uint16 coverage; +}; +#define KERN_SUBTABLE_HEADER_SIZE 6 + +// Version 0 only, version 1 has different layout +struct KernTableHeader { + le_uint16 version; + le_uint16 nTables; +}; +#define KERN_TABLE_HEADER_SIZE 4 + +#define COVERAGE_HORIZONTAL 0x1 +#define COVERAGE_MINIMUM 0x2 +#define COVERAGE_CROSS 0x4 +#define COVERAGE_OVERRIDE 0x8 + +/* + * This implementation has support for only one subtable, so if the font has + * multiple subtables, only the first will be used. If this turns out to + * be a problem in practice we should add it. + * + * This also supports only version 0 of the kern table header, only + * Apple supports the latter. + * + * This implementation isn't careful about the kern table flags, and + * might invoke kerning when it is not supposed to. That too I'm + * leaving for a bug fix. + * + * TODO: support multiple subtables + * TODO: respect header flags + */ +KernTable::KernTable(const LEFontInstance* font, const void* tableData) + : pairs(0), font(font) +{ + const KernTableHeader* header = (const KernTableHeader*)tableData; + if (header == 0) { +#if DEBUG + fprintf(stderr, "no kern data\n"); +#endif + return; + } + +#if DEBUG + // dump first 32 bytes of header + for (int i = 0; i < 64; ++i) { + fprintf(stderr, "%0.2x ", ((const char*)tableData)[i]&0xff); + if (((i+1)&0xf) == 0) { + fprintf(stderr, "\n"); + } else if (((i+1)&0x7) == 0) { + fprintf(stderr, " "); + } + } +#endif + + if (header->version == 0 && SWAPW(header->nTables) > 0) { + const SubtableHeader* subhead = (const SubtableHeader*)((char*)tableData + KERN_TABLE_HEADER_SIZE); + + if (subhead->version == 0) { + coverage = SWAPW(subhead->coverage); + + if (coverage & COVERAGE_HORIZONTAL) { // only handle horizontal kerning + const Subtable_0* table = (const Subtable_0*)((char*)subhead + KERN_SUBTABLE_HEADER_SIZE); + + nPairs = SWAPW(table->nPairs); + +#if 0 // some old fonts have bad values here... + searchRange = SWAPW(table->searchRange); + entrySelector = SWAPW(table->entrySelector); + rangeShift = SWAPW(table->rangeShift); +#else + entrySelector = OpenTypeUtilities::highBit(nPairs); + searchRange = (1 << entrySelector) * KERN_PAIRINFO_SIZE; + rangeShift = (nPairs * KERN_PAIRINFO_SIZE) - searchRange; +#endif + + pairs = (const PairInfo*)((char*)table + KERN_SUBTABLE_0_HEADER_SIZE); + +#if DEBUG + fprintf(stderr, "coverage: %0.4x nPairs: %d pairs 0x%x\n", coverage, nPairs, pairs); + fprintf(stderr, " searchRange: %d entrySelector: %d rangeShift: %d\n", searchRange, entrySelector, rangeShift); + + { + // dump part of the pair list + char ids[256]; + + for (int i = 256; --i >= 0;) { + LEGlyphID id = font->mapCharToGlyph(i); + + if (id < 256) { + ids[id] = (char)i; + } + } + + const PairInfo* p = pairs; + + for (i = 0; i < nPairs; ++i, p = (const PairInfo*)((char*)p+KERN_PAIRINFO_SIZE)) { + le_uint16 left = p->left; + le_uint16 right = p->right; + + if (left < 256 && right < 256) { + char c = ids[left]; + + if (c > 0x20 && c < 0x7f) { + fprintf(stderr, "%c/", c & 0xff); + } else { + printf(stderr, "%0.2x/", c & 0xff); + } + + c = ids[right]; + if (c > 0x20 && c < 0x7f) { + fprintf(stderr, "%c ", c & 0xff); + } else { + fprintf(stderr, "%0.2x ", c & 0xff); + } + } + } + } +#endif + } + } + } +} + + +/* + * Process the glyph positions. The positions array has two floats for each + * glyph, plus a trailing pair to mark the end of the last glyph. + */ +void KernTable::process(LEGlyphStorage& storage) +{ + if (pairs) { + LEErrorCode success = LE_NO_ERROR; + + le_uint32 key = storage[0]; // no need to mask off high bits + float adjust = 0; + + for (int i = 1, e = storage.getGlyphCount(); i < e; ++i) { + key = key << 16 | (storage[i] & 0xffff); + + // argh, to do a binary search, we need to have the pair list in sorted order + // but it is not in sorted order on win32 platforms because of the endianness difference + // so either I have to swap the element each time I examine it, or I have to swap + // all the elements ahead of time and store them in the font + + const PairInfo* p = pairs; + const PairInfo* tp = (const PairInfo*)((char*)p + rangeShift); + + if (key > SWAP_KEY(tp)) { + p = tp; + } + +#if DEBUG + fprintf(stderr, "binary search for %0.8x\n", key); +#endif + + le_uint32 probe = searchRange; + + while (probe > KERN_PAIRINFO_SIZE) { + probe >>= 1; + tp = (const PairInfo*)((char*)p + probe); + + le_uint32 tkey = SWAP_KEY(tp); +#if DEBUG + fprintf(stdout, " %.3d (%0.8x)\n", ((char*)tp - (char*)pairs)/KERN_PAIRINFO_SIZE, tkey); +#endif + if (tkey <= key) { + if (tkey == key) { + le_int16 value = SWAPW(tp->value); +#if DEBUG + fprintf(stdout, "binary found kerning pair %x:%x at %d, value: 0x%x (%g)\n", + storage[i-1], storage[i], i, value & 0xffff, font->xUnitsToPoints(value)); + fflush(stdout); +#endif + adjust += font->xUnitsToPoints(value); + break; + } + + p = tp; + } + } + + storage.adjustPosition(i, adjust, 0, success); + } + + storage.adjustPosition(storage.getGlyphCount(), adjust, 0, success); + } +} + +U_NAMESPACE_END + diff --git a/Build/source/libs/icu/icu-50.1/layout/KernTable.h b/Build/source/libs/icu/icu-50.1/layout/KernTable.h new file mode 100644 index 00000000000..b8322cf1fe6 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/KernTable.h @@ -0,0 +1,51 @@ +/* + * @(#)KernTable.h 1.1 04/10/13 + * + * (C) Copyright IBM Corp. 2004-2005 - All Rights Reserved + * + */ + +#ifndef __KERNTABLE_H +#define __KERNTABLE_H + +#ifndef __LETYPES_H +#include "LETypes.h" +#endif + +#include "LETypes.h" +//#include "LEFontInstance.h" +//#include "LEGlyphStorage.h" + +#include <stdio.h> + +U_NAMESPACE_BEGIN +struct PairInfo; +class LEFontInstance; +class LEGlyphStorage; + +/** + * Windows type 0 kerning table support only for now. + */ +class U_LAYOUT_API KernTable +{ + private: + le_uint16 coverage; + le_uint16 nPairs; + const PairInfo* pairs; + const LEFontInstance* font; + le_uint16 searchRange; + le_uint16 entrySelector; + le_uint16 rangeShift; + + public: + KernTable(const LEFontInstance* font, const void* tableData); + + /* + * Process the glyph positions. + */ + void process(LEGlyphStorage& storage); +}; + +U_NAMESPACE_END + +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/KhmerLayoutEngine.cpp b/Build/source/libs/icu/icu-50.1/layout/KhmerLayoutEngine.cpp new file mode 100644 index 00000000000..f4bbb603735 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/KhmerLayoutEngine.cpp @@ -0,0 +1,81 @@ + +/* + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + * This file is a modification of the ICU file IndicLayoutEngine.cpp + * by Jens Herden and Javier Sola for Khmer language + * + */ + + +#include "OpenTypeLayoutEngine.h" +#include "KhmerLayoutEngine.h" +#include "LEGlyphStorage.h" +#include "KhmerReordering.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(KhmerOpenTypeLayoutEngine) + +KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) +{ + fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; +} + +KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) +{ + fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; +} + +KhmerOpenTypeLayoutEngine::~KhmerOpenTypeLayoutEngine() +{ + // nothing to do +} + +// Input: characters +// Output: characters, char indices, tags +// Returns: output character count +le_int32 KhmerOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + le_int32 worstCase = count * 3; // worst case is 3 for Khmer TODO check if 2 is enough + + outChars = LE_NEW_ARRAY(LEUnicode, worstCase); + + if (outChars == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); + glyphStorage.allocateAuxData(success); + + if (LE_FAILURE(success)) { + LE_DELETE_ARRAY(outChars); + return 0; + } + + // NOTE: assumes this allocates featureTags... + // (probably better than doing the worst case stuff here...) + le_int32 outCharCount = KhmerReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage); + + glyphStorage.adoptGlyphCount(outCharCount); + return outCharCount; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/KhmerLayoutEngine.h b/Build/source/libs/icu/icu-50.1/layout/KhmerLayoutEngine.h new file mode 100644 index 00000000000..60a34f6066c --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/KhmerLayoutEngine.h @@ -0,0 +1,131 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + * This file is a modification of the ICU file IndicLayoutEngine.h + * by Jens Herden and Javier Sola for Khmer language + * + */ + +#ifndef __KHMERLAYOUTENGINE_H +#define __KHMERLAYOUTENGINE_H + +// #include "LETypes.h" +// #include "LEFontInstance.h" +// #include "LEGlyphFilter.h" +// #include "LayoutEngine.h" +// #include "OpenTypeLayoutEngine.h" + +// #include "GlyphSubstitutionTables.h" +// #include "GlyphDefinitionTables.h" +// #include "GlyphPositioningTables.h" + +U_NAMESPACE_BEGIN + +// class MPreFixups; +// class LEGlyphStorage; + +/** + * This class implements OpenType layout for Khmer OpenType fonts, as + * specified by Microsoft in "Creating and Supporting OpenType Fonts for + * Khmer Scripts" (http://www.microsoft.com/typography/otspec/indicot/default.htm) TODO: change url + * + * This class overrides the characterProcessing method to do Khmer character processing + * and reordering (See the MS spec. for more details) + * + * @internal + */ +class KhmerOpenTypeLayoutEngine : public OpenTypeLayoutEngine +{ +public: + /** + * This is the main constructor. It constructs an instance of KhmerOpenTypeLayoutEngine for + * a particular font, script and language. It takes the GSUB table as a parameter since + * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an + * Khmer OpenType font. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param gsubTable - the GSUB table + * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see OpenTypeLayoutEngine + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ + KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known + * until after this constructor has been invoked. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param success - set to an error code if the operation fails + * + * @see OpenTypeLayoutEngine + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ + KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. + * + * @internal + */ + virtual ~KhmerOpenTypeLayoutEngine(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +protected: + + /** + * This method does Khmer OpenType character processing. It assigns the OpenType feature + * tags to the characters, and may generate output characters which have been reordered. + * It may also split some vowels, resulting in more output characters than input characters. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run + * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. + * the auxillary data array will be set to the feature tags. + * + * Output parameters: + * @param success - set to an error code if the operation fails + * + * @return the output character count + * + * @internal + */ + virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/KhmerReordering.cpp b/Build/source/libs/icu/icu-50.1/layout/KhmerReordering.cpp new file mode 100644 index 00000000000..20c2ed4a18a --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/KhmerReordering.cpp @@ -0,0 +1,499 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved + * + * This file is a modification of the ICU file IndicReordering.cpp + * by Jens Herden and Javier Sola for Khmer language + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "KhmerReordering.h" +#include "LEGlyphStorage.h" + + +U_NAMESPACE_BEGIN + +// Characters that get refered to by name... +enum +{ + C_SIGN_ZWNJ = 0x200C, + C_SIGN_ZWJ = 0x200D, + C_DOTTED_CIRCLE = 0x25CC, + C_RO = 0x179A, + C_VOWEL_AA = 0x17B6, + C_SIGN_NIKAHIT = 0x17C6, + C_VOWEL_E = 0x17C1, + C_COENG = 0x17D2 +}; + + +enum +{ + // simple classes, they are used in the statetable (in this file) to control the length of a syllable + // they are also used to know where a character should be placed (location in reference to the base character) + // and also to know if a character, when independtly displayed, should be displayed with a dotted-circle to + // indicate error in syllable construction + _xx = KhmerClassTable::CC_RESERVED, + _sa = KhmerClassTable::CC_SIGN_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_POS_ABOVE, + _sp = KhmerClassTable::CC_SIGN_AFTER | KhmerClassTable::CF_DOTTED_CIRCLE| KhmerClassTable::CF_POS_AFTER, + _c1 = KhmerClassTable::CC_CONSONANT | KhmerClassTable::CF_CONSONANT, + _c2 = KhmerClassTable::CC_CONSONANT2 | KhmerClassTable::CF_CONSONANT, + _c3 = KhmerClassTable::CC_CONSONANT3 | KhmerClassTable::CF_CONSONANT, + _rb = KhmerClassTable::CC_ROBAT | KhmerClassTable::CF_POS_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE, + _cs = KhmerClassTable::CC_CONSONANT_SHIFTER | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_SHIFTER, + _dl = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BEFORE | KhmerClassTable::CF_DOTTED_CIRCLE, + _db = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BELOW | KhmerClassTable::CF_DOTTED_CIRCLE, + _da = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_ABOVE_VOWEL, + _dr = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_AFTER | KhmerClassTable::CF_DOTTED_CIRCLE, + _co = KhmerClassTable::CC_COENG | KhmerClassTable::CF_COENG | KhmerClassTable::CF_DOTTED_CIRCLE, + + // split vowel + _va = _da | KhmerClassTable::CF_SPLIT_VOWEL, + _vr = _dr | KhmerClassTable::CF_SPLIT_VOWEL +}; + + +// Character class tables +// _xx character does not combine into syllable, such as numbers, puntuation marks, non-Khmer signs... +// _sa Sign placed above the base +// _sp Sign placed after the base +// _c1 Consonant of type 1 or independent vowel (independent vowels behave as type 1 consonants) +// _c2 Consonant of type 2 (only RO) +// _c3 Consonant of type 3 +// _rb Khmer sign robat u17CC. combining mark for subscript consonants +// _cd Consonant-shifter +// _dl Dependent vowel placed before the base (left of the base) +// _db Dependent vowel placed below the base +// _da Dependent vowel placed above the base +// _dr Dependent vowel placed behind the base (right of the base) +// _co Khmer combining mark COENG u17D2, combines with the consonant or independent vowel following +// it to create a subscript consonant or independent vowel +// _va Khmer split vowel in wich the first part is before the base and the second one above the base +// _vr Khmer split vowel in wich the first part is before the base and the second one behind (right of) the base + +static const KhmerClassTable::CharClass khmerCharClasses[] = +{ + _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, // 1780 - 178F + _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c2, _c1, _c1, _c1, _c3, _c3, // 1790 - 179F + _c1, _c3, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, // 17A0 - 17AF + _c1, _c1, _c1, _c1, _dr, _dr, _dr, _da, _da, _da, _da, _db, _db, _db, _va, _vr, // 17B0 - 17BF + _vr, _dl, _dl, _dl, _vr, _vr, _sa, _sp, _sp, _cs, _cs, _sa, _rb, _sa, _sa, _sa, // 17C0 - 17CF + _sa, _sa, _co, _sa, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _sa, _xx, _xx, // 17D0 - 17DF +}; + + +// +// Khmer Class Tables +// + +// +// The range of characters defined in the above table is defined here. FOr Khmer 1780 to 17DF +// Even if the Khmer range is bigger, all other characters are not combinable, and therefore treated +// as _xx +static const KhmerClassTable khmerClassTable = {0x1780, 0x17df, khmerCharClasses}; + + +// Below we define how a character in the input string is either in the khmerCharClasses table +// (in which case we get its type back), a ZWJ or ZWNJ (two characters that may appear +// within the syllable, but are not in the table) we also get their type back, or an unknown object +// in which case we get _xx (CC_RESERVED) back +KhmerClassTable::CharClass KhmerClassTable::getCharClass(LEUnicode ch) const +{ + + if (ch == C_SIGN_ZWJ) { + return CC_ZERO_WIDTH_J_MARK; + } + + if (ch == C_SIGN_ZWNJ) { + return CC_ZERO_WIDTH_NJ_MARK; + } + + if (ch < firstChar || ch > lastChar) { + return CC_RESERVED; + } + + return classTable[ch - firstChar]; +} + +const KhmerClassTable *KhmerClassTable::getKhmerClassTable() +{ + return &khmerClassTable; +} + + + +class KhmerReorderingOutput : public UMemory { +private: + le_int32 fSyllableCount; + le_int32 fOutIndex; + LEUnicode *fOutChars; + + LEGlyphStorage &fGlyphStorage; + + +public: + KhmerReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage) + : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage) + { + // nothing else to do... + } + + ~KhmerReorderingOutput() + { + // nothing to do here... + } + + void reset() + { + fSyllableCount += 1; + } + + void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures) + { + LEErrorCode success = LE_NO_ERROR; + + fOutChars[fOutIndex] = ch; + + fGlyphStorage.setCharIndex(fOutIndex, charIndex, success); + fGlyphStorage.setAuxData(fOutIndex, charFeatures | (fSyllableCount & LE_GLYPH_GROUP_MASK), success); + + fOutIndex += 1; + } + + le_int32 getOutputIndex() + { + return fOutIndex; + } +}; + + +#define blwfFeatureTag LE_BLWF_FEATURE_TAG +#define pstfFeatureTag LE_PSTF_FEATURE_TAG +#define presFeatureTag LE_PRES_FEATURE_TAG +#define blwsFeatureTag LE_BLWS_FEATURE_TAG +#define abvsFeatureTag LE_ABVS_FEATURE_TAG +#define pstsFeatureTag LE_PSTS_FEATURE_TAG + +#define blwmFeatureTag LE_BLWM_FEATURE_TAG +#define abvmFeatureTag LE_ABVM_FEATURE_TAG +#define distFeatureTag LE_DIST_FEATURE_TAG + +#define prefFeatureTag LE_PREF_FEATURE_TAG +#define abvfFeatureTag LE_ABVF_FEATURE_TAG +#define cligFeatureTag LE_CLIG_FEATURE_TAG +#define mkmkFeatureTag LE_MKMK_FEATURE_TAG + +#define prefFeatureMask 0x80000000UL +#define blwfFeatureMask 0x40000000UL +#define abvfFeatureMask 0x20000000UL +#define pstfFeatureMask 0x10000000UL +#define presFeatureMask 0x08000000UL +#define blwsFeatureMask 0x04000000UL +#define abvsFeatureMask 0x02000000UL +#define pstsFeatureMask 0x01000000UL +#define cligFeatureMask 0x00800000UL +#define distFeatureMask 0x00400000UL +#define blwmFeatureMask 0x00200000UL +#define abvmFeatureMask 0x00100000UL +#define mkmkFeatureMask 0x00080000UL + +#define tagPref (prefFeatureMask | presFeatureMask | cligFeatureMask | distFeatureMask) +#define tagAbvf (abvfFeatureMask | abvsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | mkmkFeatureMask) +#define tagPstf (blwfFeatureMask | blwsFeatureMask | prefFeatureMask | presFeatureMask | pstfFeatureMask | pstsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask) +#define tagBlwf (blwfFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask | mkmkFeatureMask) +#define tagDefault (prefFeatureMask | blwfFeatureMask | presFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask | mkmkFeatureMask) + + + +// These are in the order in which the features need to be applied +// for correct processing +static const FeatureMap featureMap[] = +{ + // Shaping features + {prefFeatureTag, prefFeatureMask}, + {blwfFeatureTag, blwfFeatureMask}, + {abvfFeatureTag, abvfFeatureMask}, + {pstfFeatureTag, pstfFeatureMask}, + {presFeatureTag, presFeatureMask}, + {blwsFeatureTag, blwsFeatureMask}, + {abvsFeatureTag, abvsFeatureMask}, + {pstsFeatureTag, pstsFeatureMask}, + {cligFeatureTag, cligFeatureMask}, + + // Positioning features + {distFeatureTag, distFeatureMask}, + {blwmFeatureTag, blwmFeatureMask}, + {abvmFeatureTag, abvmFeatureMask}, + {mkmkFeatureTag, mkmkFeatureMask}, +}; + +static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); + +// The stateTable is used to calculate the end (the length) of a well +// formed Khmer Syllable. +// +// Each horizontal line is ordered exactly the same way as the values in KhmerClassTable +// CharClassValues in KhmerReordering.h This coincidence of values allows the +// follow up of the table. +// +// Each line corresponds to a state, which does not necessarily need to be a type +// of component... for example, state 2 is a base, with is always a first character +// in the syllable, but the state could be produced a consonant of any type when +// it is the first character that is analysed (in ground state). +// +// Differentiating 3 types of consonants is necessary in order to +// forbid the use of certain combinations, such as having a second +// coeng after a coeng RO, +// The inexistent possibility of having a type 3 after another type 3 is permitted, +// eliminating it would very much complicate the table, and it does not create typing +// problems, as the case above. +// +// The table is quite complex, in order to limit the number of coeng consonants +// to 2 (by means of the table). +// +// There a peculiarity, as far as Unicode is concerned: +// - The consonant-shifter is considered in two possible different +// locations, the one considered in Unicode 3.0 and the one considered in +// Unicode 4.0. (there is a backwards compatibility problem in this standard). + + +// xx independent character, such as a number, punctuation sign or non-khmer char +// +// c1 Khmer consonant of type 1 or an independent vowel +// that is, a letter in which the subscript for is only under the +// base, not taking any space to the right or to the left +// +// c2 Khmer consonant of type 2, the coeng form takes space under +// and to the left of the base (only RO is of this type) +// +// c3 Khmer consonant of type 3. Its subscript form takes space under +// and to the right of the base. +// +// cs Khmer consonant shifter +// +// rb Khmer robat +// +// co coeng character (u17D2) +// +// dv dependent vowel (including split vowels, they are treated in the same way). +// even if dv is not defined above, the component that is really tested for is +// KhmerClassTable::CC_DEPENDENT_VOWEL, which is common to all dependent vowels +// +// zwj Zero Width joiner +// +// zwnj Zero width non joiner +// +// sa above sign +// +// sp post sign +// +// there are lines with equal content but for an easier understanding +// (and maybe change in the future) we did not join them +// +static const le_int8 khmerStateTable[][KhmerClassTable::CC_COUNT] = +{ + +// xx c1 c2 c3 zwnj cs rb co dv sa sp zwj + { 1, 2, 2, 2, 1, 1, 1, 6, 1, 1, 1, 2}, // 0 - ground state + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 1 - exit state (or sign to the right of the syllable) + {-1, -1, -1, -1, 3, 4, 5, 6, 16, 17, 1, -1}, // 2 - Base consonant + {-1, -1, -1, -1, -1, 4, -1, -1, 16, -1, -1, -1}, // 3 - First ZWNJ before a register shifter + // It can only be followed by a shifter or a vowel + {-1, -1, -1, -1, 15, -1, -1, 6, 16, 17, 1, 14}, // 4 - First register shifter + {-1, -1, -1, -1, -1, -1, -1, -1, 20, -1, 1, -1}, // 5 - Robat + {-1, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1}, // 6 - First Coeng + {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, // 7 - First consonant of type 1 after coeng + {-1, -1, -1, -1, 12, 13, -1, -1, 16, 17, 1, 14}, // 8 - First consonant of type 2 after coeng + {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, // 9 - First consonant or type 3 after ceong + {-1, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1}, // 10 - Second Coeng (no register shifter before) + {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 11 - Second coeng consonant (or ind. vowel) no register shifter before + {-1, -1, -1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, // 12 - Second ZWNJ before a register shifter + {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 13 - Second register shifter + {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, // 14 - ZWJ before vowel + {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, // 15 - ZWNJ before vowel + {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 1, 18}, // 16 - dependent vowel + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 18}, // 17 - sign above + {-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1}, // 18 - ZWJ after vowel + {-1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1}, // 19 - Third coeng + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, // 20 - dependent vowel after a Robat + +}; + + +const FeatureMap *KhmerReordering::getFeatureMap(le_int32 &count) +{ + count = featureMapCount; + + return featureMap; +} + + +// Given an input string of characters and a location in which to start looking +// calculate, using the state table, which one is the last character of the syllable +// that starts in the starting position. +le_int32 KhmerReordering::findSyllable(const KhmerClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount) +{ + le_int32 cursor = prev; + le_int8 state = 0; + + while (cursor < charCount) { + KhmerClassTable::CharClass charClass = (classTable->getCharClass(chars[cursor]) & KhmerClassTable::CF_CLASS_MASK); + + state = khmerStateTable[state][charClass]; + + if (state < 0) { + break; + } + + cursor += 1; + } + + return cursor; +} + + +// This is the real reordering function as applied to the Khmer language + +le_int32 KhmerReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32 /*scriptCode*/, + LEUnicode *outChars, LEGlyphStorage &glyphStorage) +{ + const KhmerClassTable *classTable = KhmerClassTable::getKhmerClassTable(); + + KhmerReorderingOutput output(outChars, glyphStorage); + KhmerClassTable::CharClass charClass; + le_int32 i, prev = 0, coengRo; + + + // This loop only exits when we reach the end of a run, which may contain + // several syllables. + while (prev < charCount) { + le_int32 syllable = findSyllable(classTable, chars, prev, charCount); + + output.reset(); + + // write a pre vowel or the pre part of a split vowel first + // and look out for coeng + ro. RO is the only vowel of type 2, and + // therefore the only one that requires saving space before the base. + coengRo = -1; // There is no Coeng Ro, if found this value will change + for (i = prev; i < syllable; i += 1) { + charClass = classTable->getCharClass(chars[i]); + + // if a split vowel, write the pre part. In Khmer the pre part + // is the same for all split vowels, same glyph as pre vowel C_VOWEL_E + if (charClass & KhmerClassTable::CF_SPLIT_VOWEL) { + output.writeChar(C_VOWEL_E, i, tagPref); + break; // there can be only one vowel + } + + // if a vowel with pos before write it out + if (charClass & KhmerClassTable::CF_POS_BEFORE) { + output.writeChar(chars[i], i, tagPref); + break; // there can be only one vowel + } + + // look for coeng + ro and remember position + // works because coeng + ro is always in front of a vowel (if there is a vowel) + // and because CC_CONSONANT2 is enough to identify it, as it is the only consonant + // with this flag + if ( (charClass & KhmerClassTable::CF_COENG) && (i + 1 < syllable) && + ( (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_CLASS_MASK) == KhmerClassTable::CC_CONSONANT2) ) + { + coengRo = i; + } + } + + // write coeng + ro if found + if (coengRo > -1) { + output.writeChar(C_COENG, coengRo, tagPref); + output.writeChar(C_RO, coengRo + 1, tagPref); + } + + // shall we add a dotted circle? + // If in the position in which the base should be (first char in the string) there is + // a character that has the Dotted circle flag (a character that cannot be a base) + // then write a dotted circle + if (classTable->getCharClass(chars[prev]) & KhmerClassTable::CF_DOTTED_CIRCLE) { + output.writeChar(C_DOTTED_CIRCLE, prev, tagDefault); + } + + // copy what is left to the output, skipping before vowels and coeng Ro if they are present + for (i = prev; i < syllable; i += 1) { + charClass = classTable->getCharClass(chars[i]); + + // skip a before vowel, it was already processed + if (charClass & KhmerClassTable::CF_POS_BEFORE) { + continue; + } + + // skip coeng + ro, it was already processed + if (i == coengRo) { + i += 1; + continue; + } + + switch (charClass & KhmerClassTable::CF_POS_MASK) { + case KhmerClassTable::CF_POS_ABOVE : + output.writeChar(chars[i], i, tagAbvf); + break; + + case KhmerClassTable::CF_POS_AFTER : + output.writeChar(chars[i], i, tagPstf); + break; + + case KhmerClassTable::CF_POS_BELOW : + output.writeChar(chars[i], i, tagBlwf); + break; + + default: + // assign the correct flags to a coeng consonant + // Consonants of type 3 are taged as Post forms and those type 1 as below forms + if ( (charClass & KhmerClassTable::CF_COENG) && i + 1 < syllable ) { + if ( (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_CLASS_MASK) + == KhmerClassTable::CC_CONSONANT3) { + output.writeChar(chars[i], i, tagPstf); + i += 1; + output.writeChar(chars[i], i, tagPstf); + } + else { + output.writeChar(chars[i], i, tagBlwf); + i += 1; + output.writeChar(chars[i], i, tagBlwf); + } + break; + } + // if a shifter is followed by an above vowel change the shifter to below form, + // an above vowel can have two possible positions i + 1 or i + 3 + // (position i+1 corresponds to unicode 3, position i+3 to Unicode 4) + // and there is an extra rule for C_VOWEL_AA + C_SIGN_NIKAHIT also for two + // different positions, right after the shifter or after a vowel (Unicode 4) + if ( (charClass & KhmerClassTable::CF_SHIFTER) && (i + 1 < syllable) ) { + if ((classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_ABOVE_VOWEL) + || (i + 2 < syllable + && ( (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA) + && ( (classTable->getCharClass(chars[i + 2]) & KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT)) + || (i + 3 < syllable && (classTable->getCharClass(chars[i + 3]) & KhmerClassTable::CF_ABOVE_VOWEL)) + || (i + 4 < syllable + && ( (classTable->getCharClass(chars[i + 3]) & KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA) + && ( (classTable->getCharClass(chars[i + 4]) & KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT) ) ) + { + output.writeChar(chars[i], i, tagBlwf); + break; + } + + } + // default - any other characters + output.writeChar(chars[i], i, tagDefault); + break; + } // switch + } // for + + prev = syllable; // move the pointer to the start of next syllable + } + + return output.getOutputIndex(); +} + + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/KhmerReordering.h b/Build/source/libs/icu/icu-50.1/layout/KhmerReordering.h new file mode 100644 index 00000000000..eecd12dff63 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/KhmerReordering.h @@ -0,0 +1,132 @@ +/* + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + * This file is a modification of the ICU file IndicReordering.h + * by Jens Herden and Javier Sola for Khmer language + * + */ + +#ifndef __KHMERREORDERING_H +#define __KHMERREORDERING_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +// Vocabulary +// Base -> A consonant or an independent vowel in its full (not subscript) form. It is the +// center of the syllable, it can be souranded by coeng (subscript) consonants, vowels, +// split vowels, signs... but there is only one base in a syllable, it has to be coded as +// the first character of the syllable. +// split vowel --> vowel that has two parts placed separately (e.g. Before and after the consonant). +// Khmer language has five of them. Khmer split vowels either have one part before the +// base and one after the base or they have a part before the base and a part above the base. +// The first part of all Khmer split vowels is the same character, identical to +// the glyph of Khmer dependent vowel SRA EI +// coeng --> modifier used in Khmer to construct coeng (subscript) consonants +// Differently than indian languages, the coeng modifies the consonant that follows it, +// not the one preceding it Each consonant has two forms, the base form and the subscript form +// the base form is the normal one (using the consonants code-point), the subscript form is +// displayed when the combination coeng + consonant is encountered. +// Consonant of type 1 -> A consonant which has subscript for that only occupies space under a base consonant +// Consonant of type 2.-> Its subscript form occupies space under and before the base (only one, RO) +// Consonant of Type 3 -> Its subscript form occupies space under and after the base (KHO, CHHO, THHO, BA, YO, SA) +// Consonant shifter -> Khmer has to series of consonants. The same dependent vowel has different sounds +// if it is attached to a consonant of the first series or a consonant of the second series +// Most consonants have an equivalent in the other series, but some of theme exist only in +// one series (for example SA). If we want to use the consonant SA with a vowel sound that +// can only be done with a vowel sound that corresponds to a vowel accompanying a consonant +// of the other series, then we need to use a consonant shifter: TRIISAP or MUSIKATOAN +// x17C9 y x17CA. TRIISAP changes a first series consonant to second series sound and +// MUSIKATOAN a second series consonant to have a first series vowel sound. +// Consonant shifter are both normally supercript marks, but, when they are followed by a +// superscript, they change shape and take the form of subscript dependent vowel SRA U. +// If they are in the same syllable as a coeng consonant, Unicode 3.0 says that they +// should be typed before the coeng. Unicode 4.0 breaks the standard and says that it should +// be placed after the coeng consonant. +// Dependent vowel -> In khmer dependent vowels can be placed above, below, before or after the base +// Each vowel has its own position. Only one vowel per syllable is allowed. +// Signs -> Khmer has above signs and post signs. Only one above sign and/or one post sign are +// Allowed in a syllable. +// +// + +struct KhmerClassTable // This list must include all types of components that can be used inside a syllable +{ + enum CharClassValues // order is important here! This order must be the same that is found in each horizontal + // line in the statetable for Khmer (file KhmerReordering.cpp). + { + CC_RESERVED = 0, + CC_CONSONANT = 1, // consonant of type 1 or independent vowel + CC_CONSONANT2 = 2, // Consonant of type 2 + CC_CONSONANT3 = 3, // Consonant of type 3 + CC_ZERO_WIDTH_NJ_MARK = 4, // Zero Width non joiner character (0x200C) + CC_CONSONANT_SHIFTER = 5, + CC_ROBAT = 6, // Khmer special diacritic accent -treated differently in state table + CC_COENG = 7, // Subscript consonant combining character + CC_DEPENDENT_VOWEL = 8, + CC_SIGN_ABOVE = 9, + CC_SIGN_AFTER = 10, + CC_ZERO_WIDTH_J_MARK = 11, // Zero width joiner character + CC_COUNT = 12 // This is the number of character classes + }; + + enum CharClassFlags + { + CF_CLASS_MASK = 0x0000FFFF, + + CF_CONSONANT = 0x01000000, // flag to speed up comparing + CF_SPLIT_VOWEL = 0x02000000, // flag for a split vowel -> the first part is added in front of the syllable + CF_DOTTED_CIRCLE = 0x04000000, // add a dotted circle if a character with this flag is the first in a syllable + CF_COENG = 0x08000000, // flag to speed up comparing + CF_SHIFTER = 0x10000000, // flag to speed up comparing + CF_ABOVE_VOWEL = 0x20000000, // flag to speed up comparing + + // position flags + CF_POS_BEFORE = 0x00080000, + CF_POS_BELOW = 0x00040000, + CF_POS_ABOVE = 0x00020000, + CF_POS_AFTER = 0x00010000, + CF_POS_MASK = 0x000f0000 + }; + + typedef le_uint32 CharClass; + + typedef le_int32 ScriptFlags; + + LEUnicode firstChar; // for Khmer this will become x1780 + LEUnicode lastChar; // and this x17DF + const CharClass *classTable; + + CharClass getCharClass(LEUnicode ch) const; + + static const KhmerClassTable *getKhmerClassTable(); +}; + + +class KhmerReordering /* not : public UObject because all methods are static */ { +public: + static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, + LEUnicode *outChars, LEGlyphStorage &glyphStorage); + + static const FeatureMap *getFeatureMap(le_int32 &count); + +private: + // do not instantiate + KhmerReordering(); + + static le_int32 findSyllable(const KhmerClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount); + +}; + + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/LEFontInstance.cpp b/Build/source/libs/icu/icu-50.1/layout/LEFontInstance.cpp new file mode 100644 index 00000000000..eaca51a51b3 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LEFontInstance.cpp @@ -0,0 +1,154 @@ +/* + ******************************************************************************* + * + * Copyright (C) 1999-2007, International Business Machines + * Corporation and others. All Rights Reserved. + * + ******************************************************************************* + * file name: LEFontInstance.cpp + * + * created on: 02/06/2003 + * created by: Eric R. Mader + */ + +#include "LETypes.h" +#include "LEScripts.h" +#include "LEFontInstance.h" +#include "LEGlyphStorage.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEFontInstance) + +LECharMapper::~LECharMapper() +{ + // nothing to do. +} + +LEFontInstance::~LEFontInstance() +{ + // nothing to do +} + +const LEFontInstance *LEFontInstance::getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, + le_int32 script, LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return NULL; + } + + if (chars == NULL || *offset < 0 || limit < 0 || *offset >= limit || script < 0 || script >= scriptCodeCount) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + + *offset = limit; + return this; +} + +void LEFontInstance::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, + le_bool reverse, const LECharMapper *mapper, le_bool filterZeroWidth, LEGlyphStorage &glyphStorage) const +{ + le_int32 i, out = 0, dir = 1; + + if (reverse) { + out = count - 1; + dir = -1; + } + + for (i = offset; i < offset + count; i += 1, out += dir) { + LEUnicode16 high = chars[i]; + LEUnicode32 code = high; + + if (i < offset + count - 1 && high >= 0xD800 && high <= 0xDBFF) { + LEUnicode16 low = chars[i + 1]; + + if (low >= 0xDC00 && low <= 0xDFFF) { + code = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000; + } + } + + glyphStorage[out] = mapCharToGlyph(code, mapper, filterZeroWidth); + + if (code >= 0x10000) { + i += 1; + glyphStorage[out += dir] = 0xFFFF; + } + } +} + +LEGlyphID LEFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const +{ + return mapCharToGlyph(ch, mapper, TRUE); +} + +LEGlyphID LEFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const +{ + LEUnicode32 mappedChar = mapper->mapChar(ch); + + if (mappedChar == 0xFFFE || mappedChar == 0xFFFF) { + return 0xFFFF; + } + + if (filterZeroWidth && (mappedChar == 0x200C || mappedChar == 0x200D)) { + return canDisplay(mappedChar)? 0x0001 : 0xFFFF; + } + + return mapCharToGlyph(mappedChar); +} + +le_bool LEFontInstance::canDisplay(LEUnicode32 ch) const +{ + return LE_GET_GLYPH(mapCharToGlyph(ch)) != 0; +} + +float LEFontInstance::xUnitsToPoints(float xUnits) const +{ + return (xUnits * getXPixelsPerEm()) / (float) getUnitsPerEM(); +} + +float LEFontInstance::yUnitsToPoints(float yUnits) const +{ + return (yUnits * getYPixelsPerEm()) / (float) getUnitsPerEM(); +} + +void LEFontInstance::unitsToPoints(LEPoint &units, LEPoint &points) const +{ + points.fX = xUnitsToPoints(units.fX); + points.fY = yUnitsToPoints(units.fY); +} + +float LEFontInstance::xPixelsToUnits(float xPixels) const +{ + return (xPixels * getUnitsPerEM()) / (float) getXPixelsPerEm(); +} + +float LEFontInstance::yPixelsToUnits(float yPixels) const +{ + return (yPixels * getUnitsPerEM()) / (float) getYPixelsPerEm(); +} + +void LEFontInstance::pixelsToUnits(LEPoint &pixels, LEPoint &units) const +{ + units.fX = xPixelsToUnits(pixels.fX); + units.fY = yPixelsToUnits(pixels.fY); +} + +void LEFontInstance::transformFunits(float xFunits, float yFunits, LEPoint &pixels) const +{ + pixels.fX = xUnitsToPoints(xFunits) * getScaleFactorX(); + pixels.fY = yUnitsToPoints(yFunits) * getScaleFactorY(); +} + +le_int32 LEFontInstance::getLineHeight() const +{ + return getAscent() + getDescent() + getLeading(); +} + +void LEFontInstance::getKernPair(LEGlyphID leftGlyph, LEGlyphID rightGlyph, LEPoint &kern) const +{ + kern.fX = kern.fY = 0; +} + +U_NAMESPACE_END + diff --git a/Build/source/libs/icu/icu-50.1/layout/LEFontInstance.h b/Build/source/libs/icu/icu-50.1/layout/LEFontInstance.h new file mode 100644 index 00000000000..5d6318d7f6d --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LEFontInstance.h @@ -0,0 +1,541 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved + * + */ + +#ifndef __LEFONTINSTANCE_H +#define __LEFONTINSTANCE_H + +#include "LETypes.h" +/** + * \file + * \brief C++ API: Layout Engine Font Instance object + */ + +U_NAMESPACE_BEGIN + +/** + * Instances of this class are used by <code>LEFontInstance::mapCharsToGlyphs</code> and + * <code>LEFontInstance::mapCharToGlyph</code> to adjust character codes before the character + * to glyph mapping process. Examples of this are filtering out control characters + * and character mirroring - replacing a character which has both a left and a right + * hand form with the opposite form. + * + * @stable ICU 3.2 + */ +class LECharMapper /* not : public UObject because this is an interface/mixin class */ +{ +public: + /** + * Destructor. + * @stable ICU 3.2 + */ + virtual ~LECharMapper(); + + /** + * This method does the adjustments. + * + * @param ch - the input character + * + * @return the adjusted character + * + * @stable ICU 2.8 + */ + virtual LEUnicode32 mapChar(LEUnicode32 ch) const = 0; +}; + +/** + * This is a forward reference to the class which holds the per-glyph + * storage. + * + * @stable ICU 3.0 + */ +class LEGlyphStorage; + +/** + * This is a virtual base class that serves as the interface between a LayoutEngine + * and the platform font environment. It allows a LayoutEngine to access font tables, do + * character to glyph mapping, and obtain metrics information without knowing any platform + * specific details. There are also a few utility methods for converting between points, + * pixels and funits. (font design units) + * + * An instance of an <code>LEFontInstance</code> represents a font at a particular point + * size. Each instance can represent either a single physical font, or a composite font. + * A composite font is a collection of physical fonts, each of which contains a subset of + * the characters contained in the composite font. + * + * Note: with the exception of <code>getSubFont</code>, the methods in this class only + * make sense for a physical font. If you have an <code>LEFontInstance</code> which + * represents a composite font you should only call the methods below which have + * an <code>LEGlyphID</code>, an <code>LEUnicode</code> or an <code>LEUnicode32</code> + * as one of the arguments because these can be used to select a particular subfont. + * + * Subclasses which implement composite fonts should supply an implementation of these + * methods with some default behavior such as returning constant values, or using the + * values from the first subfont. + * + * @stable ICU 3.0 + */ +class U_LAYOUT_API LEFontInstance : public UObject +{ +public: + + /** + * This virtual destructor is here so that the subclass + * destructors can be invoked through the base class. + * + * @stable ICU 2.8 + */ + virtual ~LEFontInstance(); + + /** + * Get a physical font which can render the given text. For composite fonts, + * if there is no single physical font which can render all of the text, + * return a physical font which can render an initial substring of the text, + * and set the <code>offset</code> parameter to the end of that substring. + * + * Internally, the LayoutEngine works with runs of text all in the same + * font and script, so it is best to call this method with text which is + * in a single script, passing the script code in as a hint. If you don't + * know the script of the text, you can use zero, which is the script code + * for characters used in more than one script. + * + * The default implementation of this method is intended for instances of + * <code>LEFontInstance</code> which represent a physical font. It returns + * <code>this</code> and indicates that the entire string can be rendered. + * + * This method will return a valid <code>LEFontInstance</code> unless you + * have passed illegal parameters, or an internal error has been encountered. + * For composite fonts, it may return the warning <code>LE_NO_SUBFONT_WARNING</code> + * to indicate that the returned font may not be able to render all of + * the text. Whenever a valid font is returned, the <code>offset</code> parameter + * will be advanced by at least one. + * + * Subclasses which implement composite fonts must override this method. + * Where it makes sense, they should use the script code as a hint to render + * characters from the COMMON script in the font which is used for the given + * script. For example, if the input text is a series of Arabic words separated + * by spaces, and the script code passed in is <code>arabScriptCode</code> you + * should return the font used for Arabic characters for all of the input text, + * including the spaces. If, on the other hand, the input text contains characters + * which cannot be rendered by the font used for Arabic characters, but which can + * be rendered by another font, you should return that font for those characters. + * + * @param chars - the array of Unicode characters. + * @param offset - a pointer to the starting offset in the text. On exit this + * will be set the the limit offset of the text which can be + * rendered using the returned font. + * @param limit - the limit offset for the input text. + * @param script - the script hint. + * @param success - set to an error code if the arguments are illegal, or no font + * can be returned for some reason. May also be set to + * <code>LE_NO_SUBFONT_WARNING</code> if the subfont which + * was returned cannot render all of the text. + * + * @return an <code>LEFontInstance</code> for the sub font which can render the characters, or + * <code>NULL</code> if there is an error. + * + * @see LEScripts.h + * + * @stable ICU 3.2 + */ + virtual const LEFontInstance *getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, le_int32 script, LEErrorCode &success) const; + + // + // Font file access + // + + /** + * This method reads a table from the font. Note that in general, + * it only makes sense to call this method on an <code>LEFontInstance</code> + * which represents a physical font - i.e. one which has been returned by + * <code>getSubFont()</code>. This is because each subfont in a composite font + * will have different tables, and there's no way to know which subfont to access. + * + * Subclasses which represent composite fonts should always return <code>NULL</code>. + * + * @param tableTag - the four byte table tag. (e.g. 'cmap') + * + * @return the address of the table in memory, or <code>NULL</code> + * if the table doesn't exist. + * + * @stable ICU 2.8 + */ + virtual const void *getFontTable(LETag tableTag) const = 0; + + /** + * This method is used to determine if the font can + * render the given character. This can usually be done + * by looking the character up in the font's character + * to glyph mapping. + * + * The default implementation of this method will return + * <code>TRUE</code> if <code>mapCharToGlyph(ch)</code> + * returns a non-zero value. + * + * @param ch - the character to be tested + * + * @return <code>TRUE</code> if the font can render ch. + * + * @stable ICU 3.2 + */ + virtual le_bool canDisplay(LEUnicode32 ch) const; + + /** + * This method returns the number of design units in + * the font's EM square. + * + * @return the number of design units pre EM. + * + * @stable ICU 2.8 + */ + virtual le_int32 getUnitsPerEM() const = 0; + + /** + * This method maps an array of character codes to an array of glyph + * indices, using the font's character to glyph map. + * + * The default implementation iterates over all of the characters and calls + * <code>mapCharToGlyph(ch, mapper)</code> on each one. It also handles surrogate + * characters, storing the glyph ID for the high surrogate, and a deleted glyph (0xFFFF) + * for the low surrogate. + * + * Most sublcasses will not need to implement this method. + * + * @param chars - the character array + * @param offset - the index of the first character + * @param count - the number of characters + * @param reverse - if <code>TRUE</code>, store the glyph indices in reverse order. + * @param mapper - the character mapper. + * @param filterZeroWidth - <code>TRUE</code> if ZWJ / ZWNJ characters should map to a glyph w/ no contours. + * @param glyphStorage - the object which contains the output glyph array + * + * @see LECharMapper + * + * @stable ICU 3.6 + */ + virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, le_bool filterZeroWidth, LEGlyphStorage &glyphStorage) const; + + /** + * This method maps a single character to a glyph index, using the + * font's character to glyph map. The default implementation of this + * method calls the mapper, and then calls <code>mapCharToGlyph(mappedCh)</code>. + * + * @param ch - the character + * @param mapper - the character mapper + * @param filterZeroWidth - <code>TRUE</code> if ZWJ / ZWNJ characters should map to a glyph w/ no contours. + * + * @return the glyph index + * + * @see LECharMapper + * + * @stable ICU 3.6 + */ + virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const; + + /** + * This method maps a single character to a glyph index, using the + * font's character to glyph map. The default implementation of this + * method calls the mapper, and then calls <code>mapCharToGlyph(mappedCh)</code>. + * + * @param ch - the character + * @param mapper - the character mapper + * + * @return the glyph index + * + * @see LECharMapper + * + * @stable ICU 3.2 + */ + virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const; + + /** + * This method maps a single character to a glyph index, using the + * font's character to glyph map. There is no default implementation + * of this method because it requires information about the platform + * font implementation. + * + * @param ch - the character + * + * @return the glyph index + * + * @stable ICU 3.2 + */ + virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch) const = 0; + + // + // Metrics + // + + /** + * This method gets the X and Y advance of a particular glyph, in pixels. + * + * @param glyph - the glyph index + * @param advance - the X and Y pixel values will be stored here + * + * @stable ICU 3.2 + */ + virtual void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const = 0; + + /** + * This method gets the hinted X and Y pixel coordinates of a particular + * point in the outline of the given glyph. + * + * @param glyph - the glyph index + * @param pointNumber - the number of the point + * @param point - the point's X and Y pixel values will be stored here + * + * @return <code>TRUE</code> if the point coordinates could be stored. + * + * @stable ICU 2.8 + */ + virtual le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const = 0; + + /** + * This method returns the width of the font's EM square + * in pixels. + * + * @return the pixel width of the EM square + * + * @stable ICU 2.8 + */ + virtual float getXPixelsPerEm() const = 0; + + /** + * This method returns the height of the font's EM square + * in pixels. + * + * @return the pixel height of the EM square + * + * @stable ICU 2.8 + */ + virtual float getYPixelsPerEm() const = 0; + + /** + * This method converts font design units in the + * X direction to points. + * + * @param xUnits - design units in the X direction + * + * @return points in the X direction + * + * @stable ICU 3.2 + */ + virtual float xUnitsToPoints(float xUnits) const; + + /** + * This method converts font design units in the + * Y direction to points. + * + * @param yUnits - design units in the Y direction + * + * @return points in the Y direction + * + * @stable ICU 3.2 + */ + virtual float yUnitsToPoints(float yUnits) const; + + /** + * This method converts font design units to points. + * + * @param units - X and Y design units + * @param points - set to X and Y points + * + * @stable ICU 3.2 + */ + virtual void unitsToPoints(LEPoint &units, LEPoint &points) const; + + /** + * This method converts pixels in the + * X direction to font design units. + * + * @param xPixels - pixels in the X direction + * + * @return font design units in the X direction + * + * @stable ICU 3.2 + */ + virtual float xPixelsToUnits(float xPixels) const; + + /** + * This method converts pixels in the + * Y direction to font design units. + * + * @param yPixels - pixels in the Y direction + * + * @return font design units in the Y direction + * + * @stable ICU 3.2 + */ + virtual float yPixelsToUnits(float yPixels) const; + + /** + * This method converts pixels to font design units. + * + * @param pixels - X and Y pixel + * @param units - set to X and Y font design units + * + * @stable ICU 3.2 + */ + virtual void pixelsToUnits(LEPoint &pixels, LEPoint &units) const; + + /** + * Get the X scale factor from the font's transform. The default + * implementation of <code>transformFunits()</code> will call this method. + * + * @return the X scale factor. + * + * + * @see transformFunits + * + * @stable ICU 3.2 + */ + virtual float getScaleFactorX() const = 0; + + /** + * Get the Y scale factor from the font's transform. The default + * implementation of <code>transformFunits()</code> will call this method. + * + * @return the Yscale factor. + * + * @see transformFunits + * + * @stable ICU 3.2 + */ + virtual float getScaleFactorY() const = 0; + + /** + * This method transforms an X, Y point in font design units to a + * pixel coordinate, applying the font's transform. The default + * implementation of this method calls <code>getScaleFactorX()</code> + * and <code>getScaleFactorY()</code>. + * + * @param xFunits - the X coordinate in font design units + * @param yFunits - the Y coordinate in font design units + * @param pixels - the tranformed co-ordinate in pixels + * + * @see getScaleFactorX + * @see getScaleFactorY + * + * @stable ICU 3.2 + */ + virtual void transformFunits(float xFunits, float yFunits, LEPoint &pixels) const; + + /** + * This is a convenience method used to convert + * values in a 16.16 fixed point format to floating point. + * + * @param fixed - the fixed point value + * + * @return the floating point value + * + * @stable ICU 2.8 + */ + static inline float fixedToFloat(le_int32 fixed); + + /** + * This is a convenience method used to convert + * floating point values to 16.16 fixed point format. + * + * @param theFloat - the floating point value + * + * @return the fixed point value + * + * @stable ICU 2.8 + */ + static inline le_int32 floatToFixed(float theFloat); + + // + // These methods won't ever be called by the LayoutEngine, + // but are useful for clients of <code>LEFontInstance</code> who + // need to render text. + // + + /** + * Get the font's ascent. + * + * @return the font's ascent, in points. This value + * will always be positive. + * + * @stable ICU 3.2 + */ + virtual le_int32 getAscent() const = 0; + + /** + * Get the font's descent. + * + * @return the font's descent, in points. This value + * will always be positive. + * + * @stable ICU 3.2 + */ + virtual le_int32 getDescent() const = 0; + + /** + * Get the font's leading. + * + * @return the font's leading, in points. This value + * will always be positive. + * + * @stable ICU 3.2 + */ + virtual le_int32 getLeading() const = 0; + + /** + * Get the line height required to display text in + * this font. The default implementation of this method + * returns the sum of the ascent, descent, and leading. + * + * @return the line height, in points. This vaule will + * always be positive. + * + * @stable ICU 3.2 + */ + virtual le_int32 getLineHeight() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 3.2 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 3.2 + */ + static UClassID getStaticClassID(); + + /** + * Returns kern value for a glyph pair, if the font has a kern pair list. + */ + virtual void getKernPair(LEGlyphID leftGlyph, LEGlyphID rightGlyph, LEPoint &kern) const; + + /** + * Returns true if writing direction is vertical. + */ + virtual inline bool getLayoutDirVertical() const; +}; + +inline float LEFontInstance::fixedToFloat(le_int32 fixed) +{ + return (float) (fixed / 65536.0); +} + +inline le_int32 LEFontInstance::floatToFixed(float theFloat) +{ + return (le_int32) (theFloat * 65536.0); +} + +inline bool LEFontInstance::getLayoutDirVertical() const +{ + return false; +} + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/LEGlyphFilter.h b/Build/source/libs/icu/icu-50.1/layout/LEGlyphFilter.h new file mode 100644 index 00000000000..6dcfa7d2776 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LEGlyphFilter.h @@ -0,0 +1,45 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved + * + */ + +#ifndef __LEGLYPHFILTER__H +#define __LEGLYPHFILTER__H + +#include "LETypes.h" + +U_NAMESPACE_BEGIN + +#ifndef U_HIDE_INTERNAL_API +/** + * This is a helper class that is used to + * recognize a set of glyph indices. + * + * @internal + */ +class LEGlyphFilter /* not : public UObject because this is an interface/mixin class */ { +public: + /** + * Destructor. + * @internal + */ + virtual ~LEGlyphFilter(); + + /** + * This method is used to test a particular + * glyph index to see if it is in the set + * recognized by the filter. + * + * @param glyph - the glyph index to be tested + * + * @return TRUE if the glyph index is in the set. + * + * @internal + */ + virtual le_bool accept(LEGlyphID glyph) const = 0; +}; +#endif /* U_HIDE_INTERNAL_API */ + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/LEGlyphStorage.cpp b/Build/source/libs/icu/icu-50.1/layout/LEGlyphStorage.cpp new file mode 100644 index 00000000000..95521f5f9bb --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LEGlyphStorage.cpp @@ -0,0 +1,719 @@ +/* + ********************************************************************** + * Copyright (C) 1998-2009, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ + +#include "LETypes.h" +#include "LEInsertionList.h" +#include "LEGlyphStorage.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEGlyphStorage) + +LEInsertionCallback::~LEInsertionCallback() +{ + // nothing to do... +} + +LEGlyphStorage::LEGlyphStorage() + : fGlyphCount(0), fGlyphs(NULL), fCharIndices(NULL), fPositions(NULL), + fAuxData(NULL), fAuxParam(NULL), fInsertionList(NULL), fSrcIndex(0), fDestIndex(0) +{ + // nothing else to do! +} + +LEGlyphStorage::~LEGlyphStorage() +{ + reset(); +} + +void LEGlyphStorage::reset() +{ + fGlyphCount = 0; + + if (fPositions != NULL) { + LE_DELETE_ARRAY(fPositions); + fPositions = NULL; + } + + if (fAuxData != NULL) { + LE_DELETE_ARRAY(fAuxData); + fAuxData = NULL; + } + + if (fAuxParam != NULL) { + LE_DELETE_ARRAY(fAuxParam); + fAuxParam = NULL; + } + + if (fInsertionList != NULL) { + delete fInsertionList; + fInsertionList = NULL; + } + + if (fCharIndices != NULL) { + LE_DELETE_ARRAY(fCharIndices); + fCharIndices = NULL; + } + + if (fGlyphs != NULL) { + LE_DELETE_ARRAY(fGlyphs); + fGlyphs = NULL; + } +} + +// FIXME: This might get called more than once, for various reasons. Is +// testing for pre-existing glyph and charIndices arrays good enough? +void LEGlyphStorage::allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (initialGlyphCount <= 0) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fGlyphs == NULL) { + fGlyphCount = initialGlyphCount; + fGlyphs = LE_NEW_ARRAY(LEGlyphID, fGlyphCount); + + if (fGlyphs == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return; + } + } + + if (fCharIndices == NULL) { + fCharIndices = LE_NEW_ARRAY(le_int32, fGlyphCount); + + if (fCharIndices == NULL) { + LE_DELETE_ARRAY(fGlyphs); + fGlyphs = NULL; + success = LE_MEMORY_ALLOCATION_ERROR; + return; + } + + // Initialize the charIndices array + le_int32 i, count = fGlyphCount, dir = 1, out = 0; + + if (rightToLeft) { + out = fGlyphCount - 1; + dir = -1; + } + + for (i = 0; i < count; i += 1, out += dir) { + fCharIndices[out] = i; + } + } + + if (fInsertionList == NULL) { + // FIXME: check this for failure? + fInsertionList = new LEInsertionList(rightToLeft); + if (fInsertionList == NULL) { + LE_DELETE_ARRAY(fCharIndices); + fCharIndices = NULL; + + LE_DELETE_ARRAY(fGlyphs); + fGlyphs = NULL; + + success = LE_MEMORY_ALLOCATION_ERROR; + return; + } + } +} + +// FIXME: do we want to initialize the positions to [0, 0]? +le_int32 LEGlyphStorage::allocatePositions(LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return -1; + } + + if (fPositions != NULL) { + success = LE_INTERNAL_ERROR; + return -1; + } + + fPositions = LE_NEW_ARRAY(float, 2 * (fGlyphCount + 1)); + + if (fPositions == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return -1; + } + + return fGlyphCount; +} + +// FIXME: do we want to initialize the aux data to NULL? +le_int32 LEGlyphStorage::allocateAuxData(LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return -1; + } + + if (fAuxData != NULL || fAuxParam != NULL) { + success = LE_INTERNAL_ERROR; + return -1; + } + + fAuxData = LE_NEW_ARRAY(le_uint32, fGlyphCount); + fAuxParam = LE_NEW_ARRAY(void *, fGlyphCount); + + if (fAuxData == NULL || fAuxParam == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return -1; + } + + return fGlyphCount; +} + +void LEGlyphStorage::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const +{ + le_int32 i; + + if (LE_FAILURE(success)) { + return; + } + + if (charIndices == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fCharIndices == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + for (i = 0; i < fGlyphCount; i += 1) { + charIndices[i] = fCharIndices[i] + indexBase; + } +} + +void LEGlyphStorage::getCharIndices(le_int32 charIndices[], LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return; + } + + if (charIndices == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fCharIndices == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + LE_ARRAY_COPY(charIndices, fCharIndices, fGlyphCount); +} + +// Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits +void LEGlyphStorage::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const +{ + le_int32 i; + + if (LE_FAILURE(success)) { + return; + } + + if (glyphs == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fGlyphs == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + for (i = 0; i < fGlyphCount; i += 1) { + glyphs[i] = fGlyphs[i] | extraBits; + } +} + +void LEGlyphStorage::getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return; + } + + if (glyphs == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fGlyphs == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + LE_ARRAY_COPY(glyphs, fGlyphs, fGlyphCount); +} + +LEGlyphID LEGlyphStorage::getGlyphID(le_int32 glyphIndex, LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return 0xFFFF; + } + + if (fGlyphs == NULL) { + success = LE_NO_LAYOUT_ERROR; + return 0xFFFF; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return 0xFFFF; + } + + return fGlyphs[glyphIndex]; +} + +void LEGlyphStorage::setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (fGlyphs == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + fGlyphs[glyphIndex] = glyphID; +} + +le_int32 LEGlyphStorage::getCharIndex(le_int32 glyphIndex, LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return -1; + } + + if (fCharIndices == NULL) { + success = LE_NO_LAYOUT_ERROR; + return -1; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return -1; + } + + return fCharIndices[glyphIndex]; +} + +void LEGlyphStorage::setCharIndex(le_int32 glyphIndex, le_int32 charIndex, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (fCharIndices == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + fCharIndices[glyphIndex] = charIndex; +} + +void LEGlyphStorage::getAuxData(le_uint32 auxData[], LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return; + } + + if (auxData == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fAuxData == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + LE_ARRAY_COPY(auxData, fAuxData, fGlyphCount); +} + +le_uint32 LEGlyphStorage::getAuxData(le_int32 glyphIndex, LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (fAuxData == NULL) { + success = LE_NO_LAYOUT_ERROR; + return 0; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return 0; + } + + return fAuxData[glyphIndex]; +} + +void *LEGlyphStorage::getAuxParam(le_int32 glyphIndex, LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return NULL; + } + + if (fAuxParam == NULL) { + success = LE_NO_LAYOUT_ERROR; + return NULL; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return NULL; + } + + return fAuxParam[glyphIndex]; +} + +void LEGlyphStorage::setAuxData(le_int32 glyphIndex, le_uint32 auxData, void *auxParam, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (fAuxData == NULL || fAuxParam == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + fAuxData[glyphIndex] = auxData; + fAuxParam[glyphIndex] = auxParam; +} + +void LEGlyphStorage::getGlyphPositions(float positions[], LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return; + } + + if (positions == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fPositions == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + LE_ARRAY_COPY(positions, fPositions, fGlyphCount * 2 + 2); +} + +void LEGlyphStorage::getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const +{ + if (LE_FAILURE(success)) { + return; + } + + if (glyphIndex < 0 || glyphIndex > fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + if (fPositions == NULL) { + success = LE_NO_LAYOUT_ERROR; + return; + } + + x = fPositions[glyphIndex * 2]; + y = fPositions[glyphIndex * 2 + 1]; +} + +void LEGlyphStorage::setPosition(le_int32 glyphIndex, float x, float y, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (glyphIndex < 0 || glyphIndex > fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + fPositions[glyphIndex * 2] = x; + fPositions[glyphIndex * 2 + 1] = y; +} + +void LEGlyphStorage::adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (glyphIndex < 0 || glyphIndex > fGlyphCount) { + success = LE_INDEX_OUT_OF_BOUNDS_ERROR; + return; + } + + fPositions[glyphIndex * 2] += xAdjust; + fPositions[glyphIndex * 2 + 1] += yAdjust; +} + +void LEGlyphStorage::adoptGlyphArray(LEGlyphStorage &from) +{ + if (fGlyphs != NULL) { + LE_DELETE_ARRAY(fGlyphs); + } + + fGlyphs = from.fGlyphs; + from.fGlyphs = NULL; + + if (fInsertionList != NULL) { + delete fInsertionList; + } + + fInsertionList = from.fInsertionList; + from.fInsertionList = NULL; +} + +void LEGlyphStorage::adoptCharIndicesArray(LEGlyphStorage &from) +{ + if (fCharIndices != NULL) { + LE_DELETE_ARRAY(fCharIndices); + } + + fCharIndices = from.fCharIndices; + from.fCharIndices = NULL; +} + +void LEGlyphStorage::adoptPositionArray(LEGlyphStorage &from) +{ + if (fPositions != NULL) { + LE_DELETE_ARRAY(fPositions); + } + + fPositions = from.fPositions; + from.fPositions = NULL; +} + +void LEGlyphStorage::adoptAuxDataArray(LEGlyphStorage &from) +{ + if (fAuxData != NULL) { + LE_DELETE_ARRAY(fAuxData); + } + + if (fAuxParam != NULL) { + LE_DELETE_ARRAY(fAuxParam); + } + + fAuxData = from.fAuxData; + from.fAuxData = NULL; + fAuxParam = from.fAuxParam; + from.fAuxParam = NULL; +} + +void LEGlyphStorage::adoptGlyphCount(LEGlyphStorage &from) +{ + fGlyphCount = from.fGlyphCount; +} + +void LEGlyphStorage::adoptGlyphCount(le_int32 newGlyphCount) +{ + fGlyphCount = newGlyphCount; +} + +// Move a glyph to a different position in the LEGlyphStorage ( used for Indic v2 processing ) + +void LEGlyphStorage::moveGlyph(le_int32 fromPosition, le_int32 toPosition, le_uint32 marker ) +{ + + LEErrorCode success = LE_NO_ERROR; + + LEGlyphID holdGlyph = getGlyphID(fromPosition,success); + le_int32 holdCharIndex = getCharIndex(fromPosition,success); + le_uint32 holdAuxData = getAuxData(fromPosition,success); + + if ( fromPosition < toPosition ) { + for ( le_int32 i = fromPosition ; i < toPosition ; i++ ) { + setGlyphID(i,getGlyphID(i+1,success),success); + setCharIndex(i,getCharIndex(i+1,success),success); + setAuxData(i,getAuxData(i+1,success),success); + } + } else { + for ( le_int32 i = toPosition ; i > fromPosition ; i-- ) { + setGlyphID(i,getGlyphID(i-1,success),success); + setCharIndex(i,getCharIndex(i-1,success),success); + setAuxData(i,getAuxData(i-1,success),success); + + } + } + + setGlyphID(toPosition,holdGlyph,success); + setCharIndex(toPosition,holdCharIndex,success); + setAuxData(toPosition,holdAuxData | marker,success); + +} + +// Glue code for existing stable API +LEGlyphID *LEGlyphStorage::insertGlyphs(le_int32 atIndex, le_int32 insertCount) +{ + LEErrorCode ignored = LE_NO_LAYOUT_ERROR; + return insertGlyphs(atIndex, insertCount, ignored); +} + +// FIXME: add error checking? +LEGlyphID *LEGlyphStorage::insertGlyphs(le_int32 atIndex, le_int32 insertCount, LEErrorCode& success) +{ + return fInsertionList->insert(atIndex, insertCount, success); +} + +le_int32 LEGlyphStorage::applyInsertions() +{ + le_int32 growAmount = fInsertionList->getGrowAmount(); + + if (growAmount == 0) { + return fGlyphCount; + } + + le_int32 newGlyphCount = fGlyphCount + growAmount; + + LEGlyphID *newGlyphs = (LEGlyphID *) LE_GROW_ARRAY(fGlyphs, newGlyphCount); + if (newGlyphs == NULL) { + // Could not grow the glyph array + return fGlyphCount; + } + fGlyphs = newGlyphs; + + le_int32 *newCharIndices = (le_int32 *) LE_GROW_ARRAY(fCharIndices, newGlyphCount); + if (newCharIndices == NULL) { + // Could not grow the glyph array + return fGlyphCount; + } + fCharIndices = newCharIndices; + + if (fAuxData != NULL) { + le_uint32 *newAuxData = (le_uint32 *) LE_GROW_ARRAY(fAuxData, newGlyphCount); + if (newAuxData == NULL) { + // could not grow the aux data array + return fGlyphCount; + } + fAuxData = (le_uint32 *)newAuxData; + } + + if (fAuxParam != NULL) { + void **newAuxParam = (void **) LE_GROW_ARRAY(fAuxParam, newGlyphCount); + if (newAuxParam == NULL) { + // could not grow the aux param array + return fGlyphCount; + } + fAuxParam = (void **)newAuxParam; + } + + fSrcIndex = fGlyphCount - 1; + fDestIndex = newGlyphCount - 1; + +#if 0 + // If the current position is at the end of the array + // update it to point to the end of the new array. The + // insertion callback will handle all other cases. + // FIXME: this is left over from GlyphIterator, but there's no easy + // way to implement this here... it seems that GlyphIterator doesn't + // really need it 'cause the insertions don't get applied until after a + // complete pass over the glyphs, after which the iterator gets reset anyhow... + // probably better to just document that for LEGlyphStorage and GlyphIterator... + if (position == glyphCount) { + position = newGlyphCount; + } +#endif + + fInsertionList->applyInsertions(this); + + fInsertionList->reset(); + + return fGlyphCount = newGlyphCount; +} + +le_bool LEGlyphStorage::applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]) +{ +#if 0 + // if the current position is within the block we're shifting + // it needs to be updated to the current glyph's + // new location. + // FIXME: this is left over from GlyphIterator, but there's no easy + // way to implement this here... it seems that GlyphIterator doesn't + // really need it 'cause the insertions don't get applied until after a + // complete pass over the glyphs, after which the iterator gets reset anyhow... + // probably better to just document that for LEGlyphStorage and GlyphIterator... + if (position >= atPosition && position <= fSrcIndex) { + position += fDestIndex - fSrcIndex; + } +#endif + + if (fAuxData != NULL) { + le_int32 src = fSrcIndex, dest = fDestIndex; + + while (src > atPosition) { + fAuxData[dest--] = fAuxData[src--]; + } + + for (le_int32 i = count - 1; i >= 0; i -= 1) { + fAuxData[dest--] = fAuxData[atPosition]; + } + } + + if (fAuxParam != NULL) { + le_int32 src = fSrcIndex, dest = fDestIndex; + + while (src > atPosition) { + fAuxParam[dest--] = fAuxParam[src--]; + } + + for (le_int32 i = count - 1; i >= 0; i -= 1) { + fAuxParam[dest--] = fAuxParam[atPosition]; + } + } + + while (fSrcIndex > atPosition) { + fGlyphs[fDestIndex] = fGlyphs[fSrcIndex]; + fCharIndices[fDestIndex] = fCharIndices[fSrcIndex]; + + fDestIndex -= 1; + fSrcIndex -= 1; + } + + for (le_int32 i = count - 1; i >= 0; i -= 1) { + fGlyphs[fDestIndex] = newGlyphs[i]; + fCharIndices[fDestIndex] = fCharIndices[atPosition]; + + fDestIndex -= 1; + } + + // the source glyph we're pointing at + // just got replaced by the insertion + fSrcIndex -= 1; + + return FALSE; +} + +U_NAMESPACE_END + diff --git a/Build/source/libs/icu/icu-50.1/layout/LEGlyphStorage.h b/Build/source/libs/icu/icu-50.1/layout/LEGlyphStorage.h new file mode 100644 index 00000000000..76604085dfd --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LEGlyphStorage.h @@ -0,0 +1,556 @@ +/* + ********************************************************************** + * Copyright (C) 1998-2010, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ + +#ifndef __LEGLYPHSTORAGE_H +#define __LEGLYPHSTORAGE_H + +#include "LETypes.h" +#include "LEInsertionList.h" + +/** + * \file + * \brief C++ API: This class encapsulates the per-glyph storage used by the ICU LayoutEngine. + */ + +U_NAMESPACE_BEGIN + +/** + * This class encapsulates the per-glyph storage used by the ICU LayoutEngine. + * For each glyph it holds the glyph ID, the index of the backing store character + * which produced the glyph, the X and Y position of the glyph and an auxillary data + * pointer. + * + * The storage is growable using the <code>LEInsertionList</code> class. + * + * + * @see LEInsertionList.h + * + * @stable ICU 3.6 + */ +class U_LAYOUT_API LEGlyphStorage : public UObject, protected LEInsertionCallback +{ +private: + /** + * The number of entries in the per-glyph arrays. + * + * @internal + */ + le_int32 fGlyphCount; + + /** + * The glyph ID array. + * + * @internal + */ + LEGlyphID *fGlyphs; + + /** + * The char indices array. + * + * @internal + */ + le_int32 *fCharIndices; + + /** + * The glyph positions array. + * + * @internal + */ + float *fPositions; + + /** + * The auxiliary data arrays. + * + * @internal + */ + le_uint32 *fAuxData; + void **fAuxParam; + + /** + * The insertion list, used to grow the above arrays. + * + * @internal + */ + LEInsertionList *fInsertionList; + + /** + * The source index while growing the data arrays. + * + * @internal + */ + le_int32 fSrcIndex; + + /** + * The destination index used while growing the data arrays. + * + * @internal + */ + le_int32 fDestIndex; + +protected: + /** + * This implements <code>LEInsertionCallback</code>. The <code>LEInsertionList</code> + * will call this method once for each insertion. + * + * @param atPosition the position of the insertion + * @param count the number of glyphs being inserted + * @param newGlyphs the address of the new glyph IDs + * + * @return <code>true</code> if <code>LEInsertionList</code> should stop + * processing the insertion list after this insertion. + * + * @see LEInsertionList.h + * + * @stable ICU 3.0 + */ + virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]); + +public: + + /** + * Allocates an empty <code>LEGlyphStorage</code> object. You must call + * <code>allocateGlyphArray, allocatePositions and allocateAuxData</code> + * to allocate the data. + * + * @stable ICU 3.0 + */ + LEGlyphStorage(); + + /** + * The destructor. This will deallocate all of the arrays. + * + * @stable ICU 3.0 + */ + ~LEGlyphStorage(); + + /** + * This method returns the number of glyphs in the glyph array. + * + * @return the number of glyphs in the glyph array + * + * @stable ICU 3.0 + */ + inline le_int32 getGlyphCount() const; + + /** + * This method copies the glyph array into a caller supplied array. + * The caller must ensure that the array is large enough to hold all + * the glyphs. + * + * @param glyphs - the destiniation glyph array + * @param success - set to an error code if the operation fails + * + * @stable ICU 3.0 + */ + void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const; + + /** + * This method copies the glyph array into a caller supplied array, + * ORing in extra bits. (This functionality is needed by the JDK, + * which uses 32 bits pre glyph idex, with the high 16 bits encoding + * the composite font slot number) + * + * @param glyphs - the destination (32 bit) glyph array + * @param extraBits - this value will be ORed with each glyph index + * @param success - set to an error code if the operation fails + * + * @stable ICU 3.0 + */ + void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const; + + /** + * This method copies the character index array into a caller supplied array. + * The caller must ensure that the array is large enough to hold a + * character index for each glyph. + * + * @param charIndices - the destiniation character index array + * @param success - set to an error code if the operation fails + * + * @stable ICU 3.0 + */ + void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const; + + /** + * This method copies the character index array into a caller supplied array. + * The caller must ensure that the array is large enough to hold a + * character index for each glyph. + * + * @param charIndices - the destiniation character index array + * @param indexBase - an offset which will be added to each index + * @param success - set to an error code if the operation fails + * + * @stable ICU 3.0 + */ + void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const; + + /** + * This method copies the position array into a caller supplied array. + * The caller must ensure that the array is large enough to hold an + * X and Y position for each glyph, plus an extra X and Y for the + * advance of the last glyph. + * + * @param positions - the destiniation position array + * @param success - set to an error code if the operation fails + * + * @stable ICU 3.0 + */ + void getGlyphPositions(float positions[], LEErrorCode &success) const; + + /** + * This method returns the X and Y position of the glyph at + * the given index. + * + * Input parameters: + * @param glyphIndex - the index of the glyph + * + * Output parameters: + * @param x - the glyph's X position + * @param y - the glyph's Y position + * @param success - set to an error code if the operation fails + * + * @stable ICU 3.0 + */ + void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const; + + /** + * This method allocates the glyph array, the char indices array and the insertion list. You + * must call this method before using the object. This method also initializes the char indices + * array. + * + * @param initialGlyphCount the initial size of the glyph and char indices arrays. + * @param rightToLeft <code>true</code> if the original input text is right to left. + * @param success set to an error code if the storage cannot be allocated of if the initial + * glyph count is not positive. + * + * @stable ICU 3.0 + */ + void allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, LEErrorCode &success); + + /** + * This method allocates the storage for the glyph positions. It allocates one extra X, Y + * position pair for the position just after the last glyph. + * + * @param success set to an error code if the positions array cannot be allocated. + * + * @return the number of X, Y position pairs allocated. + * + * @stable ICU 3.0 + */ + le_int32 allocatePositions(LEErrorCode &success); + + /** + * This method allocates the storage for the auxillary glyph data. + * + * @param success set to an error code if the aulillary data array cannot be allocated. + * + * @return the size of the auxillary data array. + * + * @stable ICU 3.6 + */ + le_int32 allocateAuxData(LEErrorCode &success); + + /** + * Copy the entire auxillary data array. + * + * @param auxData the auxillary data array will be copied to this address + * @param success set to an error code if the data cannot be copied + * + * @stable ICU 3.6 + */ + void getAuxData(le_uint32 auxData[], LEErrorCode &success) const; + + /** + * Get the glyph ID for a particular glyph. + * + * @param glyphIndex the index into the glyph array + * @param success set to an error code if the glyph ID cannot be retrieved. + * + * @return the glyph ID + * + * @stable ICU 3.0 + */ + LEGlyphID getGlyphID(le_int32 glyphIndex, LEErrorCode &success) const; + + /** + * Get the char index for a particular glyph. + * + * @param glyphIndex the index into the glyph array + * @param success set to an error code if the char index cannot be retrieved. + * + * @return the character index + * + * @stable ICU 3.0 + */ + le_int32 getCharIndex(le_int32 glyphIndex, LEErrorCode &success) const; + + + /** + * Get the auxillary data for a particular glyph. + * + * @param glyphIndex the index into the glyph array + * @param success set to an error code if the auxillary data cannot be retrieved. + * + * @return the auxillary data + * + * @stable ICU 3.6 + */ + le_uint32 getAuxData(le_int32 glyphIndex, LEErrorCode &success) const; + void *getAuxParam(le_int32 glyphIndex, LEErrorCode &success) const; + + /** + * This operator allows direct access to the glyph array + * using the index operator. + * + * @param glyphIndex the index into the glyph array + * + * @return a reference to the given location in the glyph array + * + * @stable ICU 3.0 + */ + inline LEGlyphID &operator[](le_int32 glyphIndex) const; + + /** + * Call this method to replace a single glyph in the glyph array + * with multiple glyphs. This method uses the <code>LEInsertionList</code> + * to do the insertion. It returns the address of storage where the new + * glyph IDs can be stored. They will not actually be inserted into the + * glyph array until <code>applyInsertions</code> is called. + * + * @param atIndex the index of the glyph to be replaced + * @param insertCount the number of glyphs to replace it with + * @param success set to an error code if the auxillary data cannot be retrieved. + * + * @return the address at which to store the replacement glyphs. + * + * @see LEInsertionList.h + * + * @stable ICU 4.2 + */ + LEGlyphID *insertGlyphs(le_int32 atIndex, le_int32 insertCount, LEErrorCode& success); + + /** + * Call this method to replace a single glyph in the glyph array + * with multiple glyphs. This method uses the <code>LEInsertionList</code> + * to do the insertion. It returns the address of storage where the new + * glyph IDs can be stored. They will not actually be inserted into the + * glyph array until <code>applyInsertions</code> is called. + * + * Note: Don't use this version, use the other version of this function which has an error code. + * + * @param atIndex the index of the glyph to be replaced + * @param insertCount the number of glyphs to replace it with + * + * @return the address at which to store the replacement glyphs. + * + * @see LEInsertionList.h + * + * @stable ICU 3.0 + */ + LEGlyphID *insertGlyphs(le_int32 atIndex, le_int32 insertCount); + + /** + * This method is used to reposition glyphs during Indic v2 processing. It moves + * all of the relevant glyph information ( glyph, indices, positions, and auxData ), + * from the source position to the target position, and also allows for a marker bit + * to be set in the target glyph's auxData so that it won't be reprocessed later in the + * cycle. + * + * @param fromPosition - position of the glyph to be moved + * @param toPosition - target position of the glyph + * @param marker marker bit + * + * @stable ICU 4.2 + */ + void moveGlyph(le_int32 fromPosition, le_int32 toPosition, le_uint32 marker); + + /** + * This method causes all of the glyph insertions recorded by + * <code>insertGlyphs</code> to be applied to the glyph array. The + * new slots in the char indices and the auxillary data arrays + * will be filled in with the values for the glyph being replaced. + * + * @return the new size of the glyph array + * + * @see LEInsertionList.h + * + * @stable ICU 3.0 + */ + le_int32 applyInsertions(); + + /** + * Set the glyph ID for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param glyphID the new glyph ID + * @param success will be set to an error code if the glyph ID cannot be set. + * + * @stable ICU 3.0 + */ + void setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, LEErrorCode &success); + + /** + * Set the char index for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param charIndex the new char index + * @param success will be set to an error code if the char index cannot be set. + * + * @stable ICU 3.0 + */ + void setCharIndex(le_int32 glyphIndex, le_int32 charIndex, LEErrorCode &success); + + /** + * Set the X, Y position for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param x the new X position + * @param y the new Y position + * @param success will be set to an error code if the position cannot be set. + * + * @stable ICU 3.0 + */ + void setPosition(le_int32 glyphIndex, float x, float y, LEErrorCode &success); + + /** + * Adjust the X, Y position for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param xAdjust the adjustment to the glyph's X position + * @param yAdjust the adjustment to the glyph's Y position + * @param success will be set to an error code if the glyph's position cannot be adjusted. + * + * @stable ICU 3.0 + */ + void adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success); + + /** + * Set the auxiliary data for a particular glyph. + * + * @param glyphIndex the index of the glyph + * @param auxData the new auxiliary data + * @param auxParam the new secondary auxiliary data (parameter) + * @param success will be set to an error code if the auxiliary data cannot be set. + * + * @stable ICU 3.6 - mod for XeTeX + */ + void setAuxData(le_int32 glyphIndex, le_uint32 auxData, void *auxParam, LEErrorCode &success); + /** + * The common case when @param auxParam is <code>NULL</code>. + */ + inline void setAuxData(le_int32 glyphIndex, le_uint32 auxData, LEErrorCode &success); + + /** + * Delete the glyph array and replace it with the one + * in <code>from</code>. Set the glyph array pointer + * in <code>from</code> to <code>NULL</code>. + * + * @param from the <code>LEGlyphStorage</code> object from which + * to get the new glyph array. + * + * @stable ICU 3.0 + */ + void adoptGlyphArray(LEGlyphStorage &from); + + /** + * Delete the char indices array and replace it with the one + * in <code>from</code>. Set the char indices array pointer + * in <code>from</code> to <code>NULL</code>. + * + * @param from the <code>LEGlyphStorage</code> object from which + * to get the new char indices array. + * + * @stable ICU 3.0 + */ + void adoptCharIndicesArray(LEGlyphStorage &from); + + /** + * Delete the position array and replace it with the one + * in <code>from</code>. Set the position array pointer + * in <code>from</code> to <code>NULL</code>. + * + * @param from the <code>LEGlyphStorage</code> object from which + * to get the new position array. + * + * @stable ICU 3.0 + */ + void adoptPositionArray(LEGlyphStorage &from); + + /** + * Delete the auxillary data array and replace it with the one + * in <code>from</code>. Set the auxillary data array pointer + * in <code>from</code> to <code>NULL</code>. + * + * @param from the <code>LEGlyphStorage</code> object from which + * to get the new auxillary data array. + * + * @stable ICU 3.0 + */ + void adoptAuxDataArray(LEGlyphStorage &from); + + /** + * Change the glyph count of this object to be the same + * as the one in <code>from</code>. + * + * @param from the <code>LEGlyphStorage</code> object from which + * to get the new glyph count. + * + * @stable ICU 3.0 + */ + void adoptGlyphCount(LEGlyphStorage &from); + + /** + * Change the glyph count of this object to the given value. + * + * @param newGlyphCount the new glyph count. + * + * @stable ICU 3.0 + */ + void adoptGlyphCount(le_int32 newGlyphCount); + + /** + * This method frees the glyph, character index, position and + * auxillary data arrays so that the LayoutEngine can be reused + * to layout a different characer array. (This method is also called + * by the destructor) + * + * @stable ICU 3.0 + */ + void reset(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 3.0 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 3.0 + */ + static UClassID getStaticClassID(); +}; + +inline le_int32 LEGlyphStorage::getGlyphCount() const +{ + return fGlyphCount; +} + +inline LEGlyphID &LEGlyphStorage::operator[](le_int32 glyphIndex) const +{ + return fGlyphs[glyphIndex]; +} + +inline void LEGlyphStorage::setAuxData(le_int32 glyphIndex, le_uint32 auxData, LEErrorCode &success) +{ + setAuxData(glyphIndex, auxData, NULL, success); +} + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/LEInsertionList.cpp b/Build/source/libs/icu/icu-50.1/layout/LEInsertionList.cpp new file mode 100644 index 00000000000..c64b8a198dc --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LEInsertionList.cpp @@ -0,0 +1,96 @@ +/* + ********************************************************************** + * Copyright (C) 1998-2008, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ + +#include "LETypes.h" +#include "LEInsertionList.h" + +U_NAMESPACE_BEGIN + +#define ANY_NUMBER 1 + +struct InsertionRecord +{ + InsertionRecord *next; + le_int32 position; + le_int32 count; + LEGlyphID glyphs[ANY_NUMBER]; +}; + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEInsertionList) + +LEInsertionList::LEInsertionList(le_bool rightToLeft) +: head(NULL), tail(NULL), growAmount(0), append(rightToLeft) +{ + tail = (InsertionRecord *) &head; +} + +LEInsertionList::~LEInsertionList() +{ + reset(); +} + +void LEInsertionList::reset() +{ + while (head != NULL) { + InsertionRecord *record = head; + + head = head->next; + LE_DELETE_ARRAY(record); + } + + tail = (InsertionRecord *) &head; + growAmount = 0; +} + +le_int32 LEInsertionList::getGrowAmount() +{ + return growAmount; +} + +LEGlyphID *LEInsertionList::insert(le_int32 position, le_int32 count, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + InsertionRecord *insertion = (InsertionRecord *) LE_NEW_ARRAY(char, sizeof(InsertionRecord) + (count - ANY_NUMBER) * sizeof (LEGlyphID)); + if (insertion == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + insertion->position = position; + insertion->count = count; + + growAmount += count - 1; + + if (append) { + // insert on end of list... + insertion->next = NULL; + tail->next = insertion; + tail = insertion; + } else { + // insert on front of list... + insertion->next = head; + head = insertion; + } + + return insertion->glyphs; +} + +le_bool LEInsertionList::applyInsertions(LEInsertionCallback *callback) +{ + for (InsertionRecord *rec = head; rec != NULL; rec = rec->next) { + if (callback->applyInsertion(rec->position, rec->count, rec->glyphs)) { + return TRUE; + } + } + + return FALSE; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/LEInsertionList.h b/Build/source/libs/icu/icu-50.1/layout/LEInsertionList.h new file mode 100644 index 00000000000..0dce5984ea5 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LEInsertionList.h @@ -0,0 +1,177 @@ +/* + ********************************************************************** + * Copyright (C) 1998-2011, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ + +#ifndef __LEINSERTIONLIST_H +#define __LEINSERTIONLIST_H + +#include "LETypes.h" + +U_NAMESPACE_BEGIN + +struct InsertionRecord; + +#ifndef U_HIDE_INTERNAL_API +/** + * This class encapsulates the callback used by <code>LEInsertionList</code> + * to apply an insertion from the insertion list. + * + * @internal + */ +class U_LAYOUT_API LEInsertionCallback +{ +public: + /** + * This method will be called by <code>LEInsertionList::applyInsertions</code> for each + * entry on the insertion list. + * + * @param atPosition the position of the insertion + * @param count the number of glyphs to insert + * @param newGlyphs the address of the glyphs to insert + * + * @return <code>TRUE</code> if <code>LEInsertions::applyInsertions</code> should + * stop after applying this insertion. + * + * @internal + */ + virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]) = 0; + + /** + * The destructor + */ + virtual ~LEInsertionCallback(); +}; + +/** + * This class is used to keep track of insertions to an array of + * <code>LEGlyphIDs</code>. The insertions are kept on a linked + * list of <code>InsertionRecords</code> so that the glyph array + * doesn't have to be grown for each insertion. The insertions are + * stored on the list from leftmost to rightmost to make it easier + * to do the insertions. + * + * The insertions are applied to the array by calling the + * <code>applyInsertions</code> method, which calls a client + * supplied <code>LEInsertionCallback</code> object to actually + * apply the individual insertions. + * + * @internal + */ +class LEInsertionList : public UObject +{ +public: + /** + * Construct an empty insertion list. + * + * @param rightToLeft <code>TRUE</code> if the glyphs are stored + * in the array in right to left order. + * + * @internal + */ + LEInsertionList(le_bool rightToLeft); + + /** + * The destructor. + */ + ~LEInsertionList(); + + /** + * Add an entry to the insertion list. + * + * @param position the glyph at this position in the array will be + * replaced by the new glyphs. + * @param count the number of new glyphs + * @param success set to an error code if the auxillary data cannot be retrieved. + * + * @return the address of an array in which to store the new glyphs. This will + * <em>not</em> be in the glyph array. + * + * @internal + */ + LEGlyphID *insert(le_int32 position, le_int32 count, LEErrorCode &success); + + /** + * Return the number of new glyphs that have been inserted. + * + * @return the number of new glyphs which have been inserted + * + * @internal + */ + le_int32 getGrowAmount(); + + /** + * Call the <code>LEInsertionCallback</code> once for each + * entry on the insertion list. + * + * @param callback the <code>LEInsertionCallback</code> to call for each insertion. + * + * @return <code>TRUE</code> if <code>callback</code> returned <code>TRUE</code> to + * terminate the insertion list processing. + * + * @internal + */ + le_bool applyInsertions(LEInsertionCallback *callback); + + /** + * Empty the insertion list and free all associated + * storage. + * + * @internal + */ + void reset(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +private: + + /** + * The head of the insertion list. + * + * @internal + */ + InsertionRecord *head; + + /** + * The tail of the insertion list. + * + * @internal + */ + InsertionRecord *tail; + + /** + * The total number of new glyphs on the insertion list. + * + * @internal + */ + le_int32 growAmount; + + /** + * Set to <code>TRUE</code> if the glyphs are in right + * to left order. Since we want the rightmost insertion + * to be first on the list, we need to append the + * insertions in this case. Otherwise they're prepended. + * + * @internal + */ + le_bool append; +}; +#endif /* U_HIDE_INTERNAL_API */ + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/LELanguages.h b/Build/source/libs/icu/icu-50.1/layout/LELanguages.h new file mode 100644 index 00000000000..6ec166b8dfd --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LELanguages.h @@ -0,0 +1,111 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. + * + * Generated on: 10/26/2010 02:53:33 PM PDT + */ + +#ifndef __LELANGUAGES_H +#define __LELANGUAGES_H + +#include "LETypes.h" + +/** + * \file + * \brief C++ API: List of language codes for LayoutEngine + */ + +U_NAMESPACE_BEGIN + +/** + * A provisional list of language codes. For now, + * this is just a list of languages which the LayoutEngine + * supports. + * + * @stable ICU 2.6 + */ + +enum LanguageCodes { + nullLanguageCode = 0, + araLanguageCode = 1, + asmLanguageCode = 2, + benLanguageCode = 3, + farLanguageCode = 4, + gujLanguageCode = 5, + hinLanguageCode = 6, + iwrLanguageCode = 7, + jiiLanguageCode = 8, + janLanguageCode = 9, + kanLanguageCode = 10, + kokLanguageCode = 11, + korLanguageCode = 12, + kshLanguageCode = 13, + malLanguageCode = 14, + marLanguageCode = 15, + mlrLanguageCode = 16, + mniLanguageCode = 17, + oriLanguageCode = 18, + sanLanguageCode = 19, + sndLanguageCode = 20, + snhLanguageCode = 21, + syrLanguageCode = 22, + tamLanguageCode = 23, + telLanguageCode = 24, + thaLanguageCode = 25, + urdLanguageCode = 26, + zhpLanguageCode = 27, + zhsLanguageCode = 28, + zhtLanguageCode = 29, + + /** New language codes added 03/13/2008 @stable ICU 4.0 */ + afkLanguageCode = 30, + belLanguageCode = 31, + bgrLanguageCode = 32, + catLanguageCode = 33, + cheLanguageCode = 34, + copLanguageCode = 35, + csyLanguageCode = 36, + danLanguageCode = 37, + deuLanguageCode = 38, + dznLanguageCode = 39, + ellLanguageCode = 40, + engLanguageCode = 41, + espLanguageCode = 42, + etiLanguageCode = 43, + euqLanguageCode = 44, + finLanguageCode = 45, + fraLanguageCode = 46, + gaeLanguageCode = 47, + hauLanguageCode = 48, + hrvLanguageCode = 49, + hunLanguageCode = 50, + hyeLanguageCode = 51, + indLanguageCode = 52, + itaLanguageCode = 53, + khmLanguageCode = 54, + mngLanguageCode = 55, + mtsLanguageCode = 56, + nepLanguageCode = 57, + nldLanguageCode = 58, + pasLanguageCode = 59, + plkLanguageCode = 60, + ptgLanguageCode = 61, + romLanguageCode = 62, + rusLanguageCode = 63, + skyLanguageCode = 64, + slvLanguageCode = 65, + sqiLanguageCode = 66, + srbLanguageCode = 67, + sveLanguageCode = 68, + tibLanguageCode = 69, + trkLanguageCode = 70, + welLanguageCode = 71, + + languageCodeCount = 72 +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/LEScripts.h b/Build/source/libs/icu/icu-50.1/layout/LEScripts.h new file mode 100644 index 00000000000..6dc68ffcfd2 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LEScripts.h @@ -0,0 +1,243 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2012. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. + * + * Generated on: 11/01/2011 04:08:09 PM PDT + */ + +#ifndef __LESCRIPTS_H +#define __LESCRIPTS_H + +#include "LETypes.h" + +/** + * \file + * \brief C++ API: Constants for Unicode script values + */ + +U_NAMESPACE_BEGIN + +/** + * Constants for Unicode script values, generated using + * ICU4J's <code>UScript</code> class. + * + * @stable ICU 2.2 + */ + +enum ScriptCodes { + zyyyScriptCode = 0, + zinhScriptCode = 1, + qaaiScriptCode = zinhScriptCode, /* manually added alias, for API stability */ + arabScriptCode = 2, + armnScriptCode = 3, + bengScriptCode = 4, + bopoScriptCode = 5, + cherScriptCode = 6, + coptScriptCode = 7, + cyrlScriptCode = 8, + dsrtScriptCode = 9, + devaScriptCode = 10, + ethiScriptCode = 11, + georScriptCode = 12, + gothScriptCode = 13, + grekScriptCode = 14, + gujrScriptCode = 15, + guruScriptCode = 16, + haniScriptCode = 17, + hangScriptCode = 18, + hebrScriptCode = 19, + hiraScriptCode = 20, + kndaScriptCode = 21, + kanaScriptCode = 22, + khmrScriptCode = 23, + laooScriptCode = 24, + latnScriptCode = 25, + mlymScriptCode = 26, + mongScriptCode = 27, + mymrScriptCode = 28, + ogamScriptCode = 29, + italScriptCode = 30, + oryaScriptCode = 31, + runrScriptCode = 32, + sinhScriptCode = 33, + syrcScriptCode = 34, + tamlScriptCode = 35, + teluScriptCode = 36, + thaaScriptCode = 37, + thaiScriptCode = 38, + tibtScriptCode = 39, +/** + * @stable ICU 2.6 + */ + + cansScriptCode = 40, +/** + * @stable ICU 2.2 + */ + + yiiiScriptCode = 41, + tglgScriptCode = 42, + hanoScriptCode = 43, + buhdScriptCode = 44, + tagbScriptCode = 45, +/** + * @stable ICU 2.6 + */ + + braiScriptCode = 46, + cprtScriptCode = 47, + limbScriptCode = 48, + linbScriptCode = 49, + osmaScriptCode = 50, + shawScriptCode = 51, + taleScriptCode = 52, + ugarScriptCode = 53, +/** + * @stable ICU 3.0 + */ + + hrktScriptCode = 54, +/** + * @stable ICU 3.4 + */ + + bugiScriptCode = 55, + glagScriptCode = 56, + kharScriptCode = 57, + syloScriptCode = 58, + taluScriptCode = 59, + tfngScriptCode = 60, + xpeoScriptCode = 61, +/** + * @stable ICU 3.6 + */ + + baliScriptCode = 62, + batkScriptCode = 63, + blisScriptCode = 64, + brahScriptCode = 65, + chamScriptCode = 66, + cirtScriptCode = 67, + cyrsScriptCode = 68, + egydScriptCode = 69, + egyhScriptCode = 70, + egypScriptCode = 71, + geokScriptCode = 72, + hansScriptCode = 73, + hantScriptCode = 74, + hmngScriptCode = 75, + hungScriptCode = 76, + indsScriptCode = 77, + javaScriptCode = 78, + kaliScriptCode = 79, + latfScriptCode = 80, + latgScriptCode = 81, + lepcScriptCode = 82, + linaScriptCode = 83, + mandScriptCode = 84, + mayaScriptCode = 85, + meroScriptCode = 86, + nkooScriptCode = 87, + orkhScriptCode = 88, + permScriptCode = 89, + phagScriptCode = 90, + phnxScriptCode = 91, + plrdScriptCode = 92, + roroScriptCode = 93, + saraScriptCode = 94, + syreScriptCode = 95, + syrjScriptCode = 96, + syrnScriptCode = 97, + tengScriptCode = 98, + vaiiScriptCode = 99, + vispScriptCode = 100, + xsuxScriptCode = 101, + zxxxScriptCode = 102, + zzzzScriptCode = 103, +/** + * @stable ICU 3.8 + */ + + cariScriptCode = 104, + jpanScriptCode = 105, + lanaScriptCode = 106, + lyciScriptCode = 107, + lydiScriptCode = 108, + olckScriptCode = 109, + rjngScriptCode = 110, + saurScriptCode = 111, + sgnwScriptCode = 112, + sundScriptCode = 113, + moonScriptCode = 114, + mteiScriptCode = 115, +/** + * @stable ICU 4.0 + */ + + armiScriptCode = 116, + avstScriptCode = 117, + cakmScriptCode = 118, + koreScriptCode = 119, + kthiScriptCode = 120, + maniScriptCode = 121, + phliScriptCode = 122, + phlpScriptCode = 123, + phlvScriptCode = 124, + prtiScriptCode = 125, + samrScriptCode = 126, + tavtScriptCode = 127, + zmthScriptCode = 128, + zsymScriptCode = 129, +/** + * @stable ICU 4.4 + */ + + bamuScriptCode = 130, + lisuScriptCode = 131, + nkgbScriptCode = 132, + sarbScriptCode = 133, +/** + * @stable ICU 4.6 + */ + + bassScriptCode = 134, + duplScriptCode = 135, + elbaScriptCode = 136, + granScriptCode = 137, + kpelScriptCode = 138, + lomaScriptCode = 139, + mendScriptCode = 140, + mercScriptCode = 141, + narbScriptCode = 142, + nbatScriptCode = 143, + palmScriptCode = 144, + sindScriptCode = 145, + waraScriptCode = 146, +/** + * @stable ICU 4.8 + */ + + afakScriptCode = 147, + jurcScriptCode = 148, + mrooScriptCode = 149, + nshuScriptCode = 150, + shrdScriptCode = 151, + soraScriptCode = 152, + takrScriptCode = 153, + tangScriptCode = 154, + woleScriptCode = 155, +/** + * @stable ICU 49 + */ + + khojScriptCode = 156, + tirhScriptCode = 157, + + scriptCodeCount = 158 +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/LESwaps.h b/Build/source/libs/icu/icu-50.1/layout/LESwaps.h new file mode 100644 index 00000000000..b9b133f4f72 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LESwaps.h @@ -0,0 +1,100 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved + * + */ + +#ifndef __LESWAPS_H +#define __LESWAPS_H + +#include "LETypes.h" + +/** + * \file + * \brief C++ API: Endian independent access to data for LayoutEngine + */ + +U_NAMESPACE_BEGIN + +/** + * A convenience macro which invokes the swapWord member function + * from a concise call. + * + * @stable ICU 2.8 + */ +#define SWAPW(value) LESwaps::swapWord((le_uint16)(value)) + +/** + * A convenience macro which invokes the swapLong member function + * from a concise call. + * + * @stable ICU 2.8 + */ +#define SWAPL(value) LESwaps::swapLong((le_uint32)(value)) + +/** + * This class is used to access data which stored in big endian order + * regardless of the conventions of the platform. + * + * All methods are static and inline in an attempt to induce the compiler + * to do most of the calculations at compile time. + * + * @stable ICU 2.8 + */ +class U_LAYOUT_API LESwaps /* not : public UObject because all methods are static */ { +public: + + /** + * Reads a big-endian 16-bit word and returns a native-endian value. + * No-op on a big-endian platform, byte-swaps on a little-endian platform. + * + * @param value - the word to be byte swapped + * + * @return the byte swapped word + * + * @stable ICU 2.8 + */ + static le_uint16 swapWord(le_uint16 value) + { +#if (defined(U_IS_BIG_ENDIAN) && U_IS_BIG_ENDIAN) || \ + (defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN)) || \ + defined(__BIG_ENDIAN__) + // Fastpath when we know that the platform is big-endian. + return value; +#else + // Reads a big-endian value on any platform. + const le_uint8 *p = reinterpret_cast<const le_uint8 *>(&value); + return (le_uint16)((p[0] << 8) | p[1]); +#endif + }; + + /** + * Reads a big-endian 32-bit word and returns a native-endian value. + * No-op on a big-endian platform, byte-swaps on a little-endian platform. + * + * @param value - the long to be byte swapped + * + * @return the byte swapped long + * + * @stable ICU 2.8 + */ + static le_uint32 swapLong(le_uint32 value) + { +#if (defined(U_IS_BIG_ENDIAN) && U_IS_BIG_ENDIAN) || \ + (defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN)) || \ + defined(__BIG_ENDIAN__) + // Fastpath when we know that the platform is big-endian. + return value; +#else + // Reads a big-endian value on any platform. + const le_uint8 *p = reinterpret_cast<const le_uint8 *>(&value); + return (le_uint32)((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); +#endif + }; + +private: + LESwaps() {} // private - forbid instantiation +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/LETypes.h b/Build/source/libs/icu/icu-50.1/layout/LETypes.h new file mode 100644 index 00000000000..0540493bd26 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LETypes.h @@ -0,0 +1,572 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved + * + */ + +#ifndef __LETYPES_H +#define __LETYPES_H + +#if !defined(LE_USE_CMEMORY) && (defined(U_LAYOUT_IMPLEMENTATION) || defined(U_LAYOUTEX_IMPLEMENTATION) || defined(U_STATIC_IMPLEMENTATION) || defined(U_COMBINED_IMPLEMENTATION)) +#define LE_USE_CMEMORY +#endif + +#include "unicode/utypes.h" + +#ifdef __cplusplus +#include "unicode/uobject.h" +#endif + +#ifdef LE_USE_CMEMORY +#include "cmemory.h" +#endif + +/*! + * \file + * \brief C API: Basic definitions for the ICU LayoutEngine + */ + +/** + * A type used for signed, 32-bit integers. + * + * @stable ICU 2.4 + */ +typedef int32_t le_int32; + +/** + * A type used for unsigned, 32-bit integers. + * + * @stable ICU 2.4 + */ +typedef uint32_t le_uint32; + +/** + * A type used for signed, 16-bit integers. + * + * @stable ICU 2.4 + */ +typedef int16_t le_int16; + +/** + * A type used for unsigned, 16-bit integers. + * + * @stable ICU 2.4 + */ +typedef uint16_t le_uint16; + +/** + * A type used for signed, 8-bit integers. + * + * @stable ICU 2.4 + */ +typedef int8_t le_int8; + +/** + * A type used for unsigned, 8-bit integers. + * + * @stable ICU 2.4 + */ +typedef uint8_t le_uint8; + + +/** + * A type used for boolean values. + * + * @stable ICU 2.4 + */ +typedef UBool le_bool; + +#ifndef NULL +/** + * Used to represent empty pointers. + * + * @stable ICU 2.4 + */ +#define NULL 0 +#endif + +/** + * Used for four character tags. + * + * @stable ICU 2.4 + */ +typedef le_uint32 LETag; + +/** + * Used for 16-bit glyph indices as they're represented + * in TrueType font tables. + * + * @stable ICU 3.2 + */ +typedef le_uint16 TTGlyphID; + +/** + * Used for glyph indices. The low-order 16 bits are + * the glyph ID within the font. The next 8 bits are + * the sub-font ID within a compound font. The high- + * order 8 bits are client defined. The LayoutEngine + * will never change or look at the client defined bits. + * + * @stable ICU 3.2 + */ +typedef le_uint32 LEGlyphID; + +/** + * Used to mask off the glyph ID part of an LEGlyphID. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_GLYPH_MASK 0x0000FFFF + +/** + * Used to shift the glyph ID part of an LEGlyphID + * into the low-order bits. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_GLYPH_SHIFT 0 + + +/** + * Used to mask off the sub-font ID part of an LEGlyphID. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_SUB_FONT_MASK 0x00FF0000 + +/** + * Used to shift the sub-font ID part of an LEGlyphID + * into the low-order bits. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_SUB_FONT_SHIFT 16 + + +/** + * Used to mask off the client-defined part of an LEGlyphID. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_CLIENT_MASK 0xFF000000 + +/** + * Used to shift the sub-font ID part of an LEGlyphID + * into the low-order bits. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_CLIENT_SHIFT 24 + + +/** + * A convenience macro to get the Glyph ID part of an LEGlyphID. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_GET_GLYPH(gid) ((gid & LE_GLYPH_MASK) >> LE_GLYPH_SHIFT) + +/** + * A convenience macro to get the sub-font ID part of an LEGlyphID. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_GET_SUB_FONT(gid) ((gid & LE_SUB_FONT_MASK) >> LE_SUB_FONT_SHIFT) + +/** + * A convenience macro to get the client-defined part of an LEGlyphID. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_GET_CLIENT(gid) ((gid & LE_CLIENT_MASK) >> LE_CLIENT_SHIFT) + + +/** + * A convenience macro to set the Glyph ID part of an LEGlyphID. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_SET_GLYPH(gid, glyph) ((gid & ~LE_GLYPH_MASK) | ((glyph << LE_GLYPH_SHIFT) & LE_GLYPH_MASK)) + +/** + * A convenience macro to set the sub-font ID part of an LEGlyphID. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_SET_SUB_FONT(gid, font) ((gid & ~LE_SUB_FONT_MASK) | ((font << LE_SUB_FONT_SHIFT) & LE_SUB_FONT_MASK)) + +/** + * A convenience macro to set the client-defined part of an LEGlyphID. + * + * @see LEGlyphID + * @stable ICU 3.2 + */ +#define LE_SET_CLIENT(gid, client) ((gid & ~LE_CLIENT_MASK) | ((client << LE_CLIENT_SHIFT) & LE_CLIENT_MASK)) + + +/** + * Used to represent 16-bit Unicode code points. + * + * @stable ICU 2.4 + */ +typedef UChar LEUnicode16; + +/** + * Used to represent 32-bit Unicode code points. + * + * @stable ICU 2.4 + */ +typedef UChar32 LEUnicode32; + +#ifndef U_HIDE_DEPRECATED_API +/** + * Used to represent 16-bit Unicode code points. + * + * @deprecated since ICU 2.4. Use LEUnicode16 instead + */ +typedef UChar LEUnicode; +#endif /* U_HIDE_DEPRECATED_API */ + +/** + * Used to hold a pair of (x, y) values which represent a point. + * + * @stable ICU 2.4 + */ +struct LEPoint +{ + /** + * The x coordinate of the point. + * + * @stable ICU 2.4 + */ + float fX; + + /** + * The y coordinate of the point. + * + * @stable ICU 2.4 + */ + float fY; +}; + +#ifndef __cplusplus +/** + * Used to hold a pair of (x, y) values which represent a point. + * + * @stable ICU 2.4 + */ +typedef struct LEPoint LEPoint; +#endif + + +#ifndef U_HIDE_INTERNAL_API +/** + * A convenience macro to get the length of an array. + * + * @internal + */ +#define LE_ARRAY_SIZE(array) (sizeof array / sizeof array[0]) + +#ifdef LE_USE_CMEMORY +/** + * A convenience macro for copying an array. + * + * @internal + */ +#define LE_ARRAY_COPY(dst, src, count) uprv_memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0]) + +/** + * Allocate an array of basic types. This is used to isolate the rest of + * the LayoutEngine code from cmemory.h. + * + * @internal + */ +#define LE_NEW_ARRAY(type, count) (type *) uprv_malloc((count) * sizeof(type)) + +/** + * Re-allocate an array of basic types. This is used to isolate the rest of + * the LayoutEngine code from cmemory.h. + * + * @internal + */ +#define LE_GROW_ARRAY(array, newSize) uprv_realloc((void *) (array), (newSize) * sizeof (array)[0]) + + /** + * Free an array of basic types. This is used to isolate the rest of + * the LayoutEngine code from cmemory.h. + * + * @internal + */ +#define LE_DELETE_ARRAY(array) uprv_free((void *) (array)) +#endif +#endif /* U_HIDE_INTERNAL_API */ + +/** + * A macro to construct the four-letter tags used to + * label TrueType tables, and for script, language and + * feature tags in OpenType tables. + * + * WARNING: THIS MACRO WILL ONLY WORK CORRECTLY IF + * THE ARGUMENT CHARACTERS ARE ASCII. + * + * @stable ICU 3.2 + */ +#define LE_MAKE_TAG(a, b, c, d) \ + (((le_uint32)(a) << 24) | \ + ((le_uint32)(b) << 16) | \ + ((le_uint32)(c) << 8) | \ + (le_uint32)(d)) + +/** + * This enumeration defines constants for the standard + * TrueType, OpenType and AAT table tags. + * + * @stable ICU 3.2 + */ +enum LETableTags { + LE_ACNT_TABLE_TAG = 0x61636E74UL, /**< 'acnt' */ + LE_AVAR_TABLE_TAG = 0x61766172UL, /**< 'avar' */ + LE_BASE_TABLE_TAG = 0x42415345UL, /**< 'BASE' */ + LE_BDAT_TABLE_TAG = 0x62646174UL, /**< 'bdat' */ + LE_BHED_TABLE_TAG = 0x62686564UL, /**< 'bhed' */ + LE_BLOC_TABLE_TAG = 0x626C6F63UL, /**< 'bloc' */ + LE_BSLN_TABLE_TAG = 0x62736C6EUL, /**< 'bsln' */ + LE_CFF__TABLE_TAG = 0x43464620UL, /**< 'CFF ' */ + LE_CMAP_TABLE_TAG = 0x636D6170UL, /**< 'cmap' */ + LE_CVAR_TABLE_TAG = 0x63766172UL, /**< 'cvar' */ + LE_CVT__TABLE_TAG = 0x63767420UL, /**< 'cvt ' */ + LE_DSIG_TABLE_TAG = 0x44534947UL, /**< 'DSIG' */ + LE_EBDT_TABLE_TAG = 0x45424454UL, /**< 'EBDT' */ + LE_EBLC_TABLE_TAG = 0x45424C43UL, /**< 'EBLC' */ + LE_EBSC_TABLE_TAG = 0x45425343UL, /**< 'EBSC' */ + LE_FDSC_TABLE_TAG = 0x66647363UL, /**< 'fdsc' */ + LE_FEAT_TABLE_TAG = 0x66656174UL, /**< 'feat' */ + LE_FMTX_TABLE_TAG = 0x666D7478UL, /**< 'fmtx' */ + LE_FPGM_TABLE_TAG = 0x6670676DUL, /**< 'fpgm' */ + LE_FVAR_TABLE_TAG = 0x66766172UL, /**< 'fvar' */ + LE_GASP_TABLE_TAG = 0x67617370UL, /**< 'gasp' */ + LE_GDEF_TABLE_TAG = 0x47444546UL, /**< 'GDEF' */ + LE_GLYF_TABLE_TAG = 0x676C7966UL, /**< 'glyf' */ + LE_GPOS_TABLE_TAG = 0x47504F53UL, /**< 'GPOS' */ + LE_GSUB_TABLE_TAG = 0x47535542UL, /**< 'GSUB' */ + LE_GVAR_TABLE_TAG = 0x67766172UL, /**< 'gvar' */ + LE_HDMX_TABLE_TAG = 0x68646D78UL, /**< 'hdmx' */ + LE_HEAD_TABLE_TAG = 0x68656164UL, /**< 'head' */ + LE_HHEA_TABLE_TAG = 0x68686561UL, /**< 'hhea' */ + LE_HMTX_TABLE_TAG = 0x686D7478UL, /**< 'hmtx' */ + LE_HSTY_TABLE_TAG = 0x68737479UL, /**< 'hsty' */ + LE_JUST_TABLE_TAG = 0x6A757374UL, /**< 'just' */ + LE_JSTF_TABLE_TAG = 0x4A535446UL, /**< 'JSTF' */ + LE_KERN_TABLE_TAG = 0x6B65726EUL, /**< 'kern' */ + LE_LCAR_TABLE_TAG = 0x6C636172UL, /**< 'lcar' */ + LE_LOCA_TABLE_TAG = 0x6C6F6361UL, /**< 'loca' */ + LE_LTSH_TABLE_TAG = 0x4C545348UL, /**< 'LTSH' */ + LE_MAXP_TABLE_TAG = 0x6D617870UL, /**< 'maxp' */ + LE_MORT_TABLE_TAG = 0x6D6F7274UL, /**< 'mort' */ + LE_MORX_TABLE_TAG = 0x6D6F7278UL, /**< 'morx' */ + LE_NAME_TABLE_TAG = 0x6E616D65UL, /**< 'name' */ + LE_OPBD_TABLE_TAG = 0x6F706264UL, /**< 'opbd' */ + LE_OS_2_TABLE_TAG = 0x4F532F32UL, /**< 'OS/2' */ + LE_PCLT_TABLE_TAG = 0x50434C54UL, /**< 'PCLT' */ + LE_POST_TABLE_TAG = 0x706F7374UL, /**< 'post' */ + LE_PREP_TABLE_TAG = 0x70726570UL, /**< 'prep' */ + LE_PROP_TABLE_TAG = 0x70726F70UL, /**< 'prop' */ + LE_TRAK_TABLE_TAG = 0x7472616BUL, /**< 'trak' */ + LE_VDMX_TABLE_TAG = 0x56444D58UL, /**< 'VDMX' */ + LE_VHEA_TABLE_TAG = 0x76686561UL, /**< 'vhea' */ + LE_VMTX_TABLE_TAG = 0x766D7478UL, /**< 'vmtx' */ + LE_VORG_TABLE_TAG = 0x564F5247UL, /**< 'VORG' */ + LE_ZAPF_TABLE_TAG = 0x5A617066UL /**< 'Zapf' */ +}; + +/** + * This enumeration defines constants for all + * the common OpenType feature tags. + * + * @stable ICU 3.2 + */ +enum LEFeatureTags { + LE_AALT_FEATURE_TAG = 0x61616C74UL, /**< 'aalt' */ + LE_ABVF_FEATURE_TAG = 0x61627666UL, /**< 'abvf' */ + LE_ABVM_FEATURE_TAG = 0x6162766DUL, /**< 'abvm' */ + LE_ABVS_FEATURE_TAG = 0x61627673UL, /**< 'abvs' */ + LE_AFRC_FEATURE_TAG = 0x61667263UL, /**< 'afrc' */ + LE_AKHN_FEATURE_TAG = 0x616B686EUL, /**< 'akhn' */ + LE_BLWF_FEATURE_TAG = 0x626C7766UL, /**< 'blwf' */ + LE_BLWM_FEATURE_TAG = 0x626C776DUL, /**< 'blwm' */ + LE_BLWS_FEATURE_TAG = 0x626C7773UL, /**< 'blws' */ + LE_CALT_FEATURE_TAG = 0x63616C74UL, /**< 'calt' */ + LE_CASE_FEATURE_TAG = 0x63617365UL, /**< 'case' */ + LE_CCMP_FEATURE_TAG = 0x63636D70UL, /**< 'ccmp' */ + LE_CJCT_FEATURE_TAG = 0x636A6374UL, /**< 'cjct' */ + LE_CLIG_FEATURE_TAG = 0x636C6967UL, /**< 'clig' */ + LE_CPSP_FEATURE_TAG = 0x63707370UL, /**< 'cpsp' */ + LE_CSWH_FEATURE_TAG = 0x63737768UL, /**< 'cswh' */ + LE_CURS_FEATURE_TAG = 0x63757273UL, /**< 'curs' */ + LE_C2SC_FEATURE_TAG = 0x63327363UL, /**< 'c2sc' */ + LE_C2PC_FEATURE_TAG = 0x63327063UL, /**< 'c2pc' */ + LE_DIST_FEATURE_TAG = 0x64697374UL, /**< 'dist' */ + LE_DLIG_FEATURE_TAG = 0x646C6967UL, /**< 'dlig' */ + LE_DNOM_FEATURE_TAG = 0x646E6F6DUL, /**< 'dnom' */ + LE_EXPT_FEATURE_TAG = 0x65787074UL, /**< 'expt' */ + LE_FALT_FEATURE_TAG = 0x66616C74UL, /**< 'falt' */ + LE_FIN2_FEATURE_TAG = 0x66696E32UL, /**< 'fin2' */ + LE_FIN3_FEATURE_TAG = 0x66696E33UL, /**< 'fin3' */ + LE_FINA_FEATURE_TAG = 0x66696E61UL, /**< 'fina' */ + LE_FRAC_FEATURE_TAG = 0x66726163UL, /**< 'frac' */ + LE_FWID_FEATURE_TAG = 0x66776964UL, /**< 'fwid' */ + LE_HALF_FEATURE_TAG = 0x68616C66UL, /**< 'half' */ + LE_HALN_FEATURE_TAG = 0x68616C6EUL, /**< 'haln' */ + LE_HALT_FEATURE_TAG = 0x68616C74UL, /**< 'halt' */ + LE_HIST_FEATURE_TAG = 0x68697374UL, /**< 'hist' */ + LE_HKNA_FEATURE_TAG = 0x686B6E61UL, /**< 'hkna' */ + LE_HLIG_FEATURE_TAG = 0x686C6967UL, /**< 'hlig' */ + LE_HNGL_FEATURE_TAG = 0x686E676CUL, /**< 'hngl' */ + LE_HWID_FEATURE_TAG = 0x68776964UL, /**< 'hwid' */ + LE_INIT_FEATURE_TAG = 0x696E6974UL, /**< 'init' */ + LE_ISOL_FEATURE_TAG = 0x69736F6CUL, /**< 'isol' */ + LE_ITAL_FEATURE_TAG = 0x6974616CUL, /**< 'ital' */ + LE_JALT_FEATURE_TAG = 0x6A616C74UL, /**< 'jalt' */ + LE_JP78_FEATURE_TAG = 0x6A703738UL, /**< 'jp78' */ + LE_JP83_FEATURE_TAG = 0x6A703833UL, /**< 'jp83' */ + LE_JP90_FEATURE_TAG = 0x6A703930UL, /**< 'jp90' */ + LE_KERN_FEATURE_TAG = 0x6B65726EUL, /**< 'kern' */ + LE_LFBD_FEATURE_TAG = 0x6C666264UL, /**< 'lfbd' */ + LE_LIGA_FEATURE_TAG = 0x6C696761UL, /**< 'liga' */ + LE_LJMO_FEATURE_TAG = 0x6C6A6D6FUL, /**< 'ljmo' */ + LE_LNUM_FEATURE_TAG = 0x6C6E756DUL, /**< 'lnum' */ + LE_LOCL_FEATURE_TAG = 0x6C6F636CUL, /**< 'locl' */ + LE_MARK_FEATURE_TAG = 0x6D61726BUL, /**< 'mark' */ + LE_MED2_FEATURE_TAG = 0x6D656432UL, /**< 'med2' */ + LE_MEDI_FEATURE_TAG = 0x6D656469UL, /**< 'medi' */ + LE_MGRK_FEATURE_TAG = 0x6D67726BUL, /**< 'mgrk' */ + LE_MKMK_FEATURE_TAG = 0x6D6B6D6BUL, /**< 'mkmk' */ + LE_MSET_FEATURE_TAG = 0x6D736574UL, /**< 'mset' */ + LE_NALT_FEATURE_TAG = 0x6E616C74UL, /**< 'nalt' */ + LE_NLCK_FEATURE_TAG = 0x6E6C636BUL, /**< 'nlck' */ + LE_NUKT_FEATURE_TAG = 0x6E756B74UL, /**< 'nukt' */ + LE_NUMR_FEATURE_TAG = 0x6E756D72UL, /**< 'numr' */ + LE_ONUM_FEATURE_TAG = 0x6F6E756DUL, /**< 'onum' */ + LE_OPBD_FEATURE_TAG = 0x6F706264UL, /**< 'opbd' */ + LE_ORDN_FEATURE_TAG = 0x6F72646EUL, /**< 'ordn' */ + LE_ORNM_FEATURE_TAG = 0x6F726E6DUL, /**< 'ornm' */ + LE_PALT_FEATURE_TAG = 0x70616C74UL, /**< 'palt' */ + LE_PCAP_FEATURE_TAG = 0x70636170UL, /**< 'pcap' */ + LE_PNUM_FEATURE_TAG = 0x706E756DUL, /**< 'pnum' */ + LE_PREF_FEATURE_TAG = 0x70726566UL, /**< 'pref' */ + LE_PRES_FEATURE_TAG = 0x70726573UL, /**< 'pres' */ + LE_PSTF_FEATURE_TAG = 0x70737466UL, /**< 'pstf' */ + LE_PSTS_FEATURE_TAG = 0x70737473UL, /**< 'psts' */ + LE_PWID_FEATURE_TAG = 0x70776964UL, /**< 'pwid' */ + LE_QWID_FEATURE_TAG = 0x71776964UL, /**< 'qwid' */ + LE_RAND_FEATURE_TAG = 0x72616E64UL, /**< 'rand' */ + LE_RLIG_FEATURE_TAG = 0x726C6967UL, /**< 'rlig' */ + LE_RPHF_FEATURE_TAG = 0x72706866UL, /**< 'rphf' */ + LE_RKRF_FEATURE_TAG = 0x726B7266UL, /**< 'rkrf' */ + LE_RTBD_FEATURE_TAG = 0x72746264UL, /**< 'rtbd' */ + LE_RTLA_FEATURE_TAG = 0x72746C61UL, /**< 'rtla' */ + LE_RUBY_FEATURE_TAG = 0x72756279UL, /**< 'ruby' */ + LE_SALT_FEATURE_TAG = 0x73616C74UL, /**< 'salt' */ + LE_SINF_FEATURE_TAG = 0x73696E66UL, /**< 'sinf' */ + LE_SIZE_FEATURE_TAG = 0x73697A65UL, /**< 'size' */ + LE_SMCP_FEATURE_TAG = 0x736D6370UL, /**< 'smcp' */ + LE_SMPL_FEATURE_TAG = 0x736D706CUL, /**< 'smpl' */ + LE_SS01_FEATURE_TAG = 0x73733031UL, /**< 'ss01' */ + LE_SS02_FEATURE_TAG = 0x73733032UL, /**< 'ss02' */ + LE_SS03_FEATURE_TAG = 0x73733033UL, /**< 'ss03' */ + LE_SS04_FEATURE_TAG = 0x73733034UL, /**< 'ss04' */ + LE_SS05_FEATURE_TAG = 0x73733035UL, /**< 'ss05' */ + LE_SS06_FEATURE_TAG = 0x73733036UL, /**< 'ss06' */ + LE_SS07_FEATURE_TAG = 0x73733037UL, /**< 'ss07' */ + LE_SS08_FEATURE_TAG = 0x73733038UL, /**< 'ss08' */ + LE_SS09_FEATURE_TAG = 0x73733039UL, /**< 'ss09' */ + LE_SS10_FEATURE_TAG = 0x73733130UL, /**< 'ss10' */ + LE_SS11_FEATURE_TAG = 0x73733131UL, /**< 'ss11' */ + LE_SS12_FEATURE_TAG = 0x73733132UL, /**< 'ss12' */ + LE_SS13_FEATURE_TAG = 0x73733133UL, /**< 'ss13' */ + LE_SS14_FEATURE_TAG = 0x73733134UL, /**< 'ss14' */ + LE_SS15_FEATURE_TAG = 0x73733135UL, /**< 'ss15' */ + LE_SS16_FEATURE_TAG = 0x73733136UL, /**< 'ss16' */ + LE_SS17_FEATURE_TAG = 0x73733137UL, /**< 'ss17' */ + LE_SS18_FEATURE_TAG = 0x73733138UL, /**< 'ss18' */ + LE_SS19_FEATURE_TAG = 0x73733139UL, /**< 'ss19' */ + LE_SS20_FEATURE_TAG = 0x73733230UL, /**< 'ss20' */ + LE_SUBS_FEATURE_TAG = 0x73756273UL, /**< 'subs' */ + LE_SUPS_FEATURE_TAG = 0x73757073UL, /**< 'sups' */ + LE_SWSH_FEATURE_TAG = 0x73777368UL, /**< 'swsh' */ + LE_TITL_FEATURE_TAG = 0x7469746CUL, /**< 'titl' */ + LE_TJMO_FEATURE_TAG = 0x746A6D6FUL, /**< 'tjmo' */ + LE_TNAM_FEATURE_TAG = 0x746E616DUL, /**< 'tnam' */ + LE_TNUM_FEATURE_TAG = 0x746E756DUL, /**< 'tnum' */ + LE_TRAD_FEATURE_TAG = 0x74726164UL, /**< 'trad' */ + LE_TWID_FEATURE_TAG = 0x74776964UL, /**< 'twid' */ + LE_UNIC_FEATURE_TAG = 0x756E6963UL, /**< 'unic' */ + LE_VALT_FEATURE_TAG = 0x76616C74UL, /**< 'valt' */ + LE_VATU_FEATURE_TAG = 0x76617475UL, /**< 'vatu' */ + LE_VERT_FEATURE_TAG = 0x76657274UL, /**< 'vert' */ + LE_VHAL_FEATURE_TAG = 0x7668616CUL, /**< 'vhal' */ + LE_VJMO_FEATURE_TAG = 0x766A6D6FUL, /**< 'vjmo' */ + LE_VKNA_FEATURE_TAG = 0x766B6E61UL, /**< 'vkna' */ + LE_VKRN_FEATURE_TAG = 0x766B726EUL, /**< 'vkrn' */ + LE_VPAL_FEATURE_TAG = 0x7670616CUL, /**< 'vpal' */ + LE_VRT2_FEATURE_TAG = 0x76727432UL, /**< 'vrt2' */ + LE_ZERO_FEATURE_TAG = 0x7A65726FUL /**< 'zero' */ +}; + +/** + * Error codes returned by the LayoutEngine. + * + * @stable ICU 2.4 + */ +enum LEErrorCode { + /* informational */ + LE_NO_SUBFONT_WARNING = U_USING_DEFAULT_WARNING, /**< The font does not contain subfonts. */ + + /* success */ + LE_NO_ERROR = U_ZERO_ERROR, /**< No error, no warning. */ + + /* failures */ + LE_ILLEGAL_ARGUMENT_ERROR = U_ILLEGAL_ARGUMENT_ERROR, /**< An illegal argument was detected. */ + LE_MEMORY_ALLOCATION_ERROR = U_MEMORY_ALLOCATION_ERROR, /**< Memory allocation error. */ + LE_INDEX_OUT_OF_BOUNDS_ERROR = U_INDEX_OUTOFBOUNDS_ERROR, /**< Trying to access an index that is out of bounds. */ + LE_NO_LAYOUT_ERROR = U_UNSUPPORTED_ERROR, /**< You must call layoutChars() first. */ + LE_INTERNAL_ERROR = U_INTERNAL_PROGRAM_ERROR, /**< An internal error was encountered. */ + LE_FONT_FILE_NOT_FOUND_ERROR = U_FILE_ACCESS_ERROR, /**< The requested font file cannot be opened. */ + LE_MISSING_FONT_TABLE_ERROR = U_MISSING_RESOURCE_ERROR /**< The requested font table does not exist. */ +}; + +#ifndef __cplusplus +/** + * Error codes returned by the LayoutEngine. + * + * @stable ICU 2.4 + */ +typedef enum LEErrorCode LEErrorCode; +#endif + +/** + * A convenience macro to test for the success of a LayoutEngine call. + * + * @stable ICU 2.4 + */ +#define LE_SUCCESS(code) (U_SUCCESS((UErrorCode)code)) + +/** + * A convenience macro to test for the failure of a LayoutEngine call. + * + * @stable ICU 2.4 + */ +#define LE_FAILURE(code) (U_FAILURE((UErrorCode)code)) + +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/LayoutEngine.cpp b/Build/source/libs/icu/icu-50.1/layout/LayoutEngine.cpp new file mode 100644 index 00000000000..b4ec7383c5a --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LayoutEngine.cpp @@ -0,0 +1,678 @@ +/* + * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved + */ + +#include "LETypes.h" +#include "LEScripts.h" +#include "LELanguages.h" + +#include "LayoutEngine.h" +#include "ArabicLayoutEngine.h" +#include "CanonShaping.h" +#include "HanLayoutEngine.h" +#include "HangulLayoutEngine.h" +#include "IndicLayoutEngine.h" +#include "KhmerLayoutEngine.h" +#include "ThaiLayoutEngine.h" +#include "TibetanLayoutEngine.h" +#include "GXLayoutEngine.h" +#include "ScriptAndLanguageTags.h" +#include "CharSubstitutionFilter.h" + +#include "LEGlyphStorage.h" + +#include "OpenTypeUtilities.h" +#include "GlyphSubstitutionTables.h" +#include "GlyphDefinitionTables.h" +#include "MorphTables.h" + +#include "DefaultCharMapper.h" + +#include "KernTable.h" + +U_NAMESPACE_BEGIN + +/* Leave this copyright notice here! It needs to go somewhere in this library. */ +static const char copyright[] = U_COPYRIGHT_STRING; + +const le_int32 LayoutEngine::kTypoFlagKern = 0x1; +const le_int32 LayoutEngine::kTypoFlagLiga = 0x2; + +const LEUnicode32 DefaultCharMapper::controlChars[] = { + 0x0009, 0x000A, 0x000D, + /*0x200C, 0x200D,*/ 0x200E, 0x200F, + 0x2028, 0x2029, 0x202A, 0x202B, 0x202C, 0x202D, 0x202E, + 0x206A, 0x206B, 0x206C, 0x206D, 0x206E, 0x206F +}; + +const le_int32 DefaultCharMapper::controlCharsCount = LE_ARRAY_SIZE(controlChars); + +LEUnicode32 DefaultCharMapper::mapChar(LEUnicode32 ch) const +{ + if (fFilterControls) { + le_int32 index = OpenTypeUtilities::search((le_uint32)ch, (le_uint32 *)controlChars, controlCharsCount); + + if (controlChars[index] == ch) { + return 0xFFFF; + } + } + + if (fMirror) { + le_int32 index = OpenTypeUtilities::search((le_uint32) ch, (le_uint32 *)DefaultCharMapper::mirroredChars, DefaultCharMapper::mirroredCharsCount); + + if (mirroredChars[index] == ch) { + return DefaultCharMapper::srahCderorrim[index]; + } + } + + return ch; +} + +// This is here to get it out of LEGlyphFilter.h. +// No particular reason to put it here, other than +// this is a good central location... +LEGlyphFilter::~LEGlyphFilter() +{ + // nothing to do +} + +CharSubstitutionFilter::CharSubstitutionFilter(const LEFontInstance *fontInstance) + : fFontInstance(fontInstance) +{ + // nothing to do +} + +CharSubstitutionFilter::~CharSubstitutionFilter() +{ + // nothing to do +} + +class CanonMarkFilter : public UMemory, public LEGlyphFilter +{ +private: + const GlyphClassDefinitionTable *classDefTable; + + CanonMarkFilter(const CanonMarkFilter &other); // forbid copying of this class + CanonMarkFilter &operator=(const CanonMarkFilter &other); // forbid copying of this class + +public: + CanonMarkFilter(const GlyphDefinitionTableHeader *gdefTable); + virtual ~CanonMarkFilter(); + + virtual le_bool accept(LEGlyphID glyph) const; +}; + +CanonMarkFilter::CanonMarkFilter(const GlyphDefinitionTableHeader *gdefTable) +{ + classDefTable = gdefTable->getMarkAttachClassDefinitionTable(); +} + +CanonMarkFilter::~CanonMarkFilter() +{ + // nothing to do? +} + +le_bool CanonMarkFilter::accept(LEGlyphID glyph) const +{ + le_int32 glyphClass = classDefTable->getGlyphClass(glyph); + + return glyphClass != 0; +} + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LayoutEngine) + +#define ccmpFeatureTag LE_CCMP_FEATURE_TAG + +#define ccmpFeatureMask 0x80000000UL + +#define canonFeatures (ccmpFeatureMask) + +static const FeatureMap canonFeatureMap[] = +{ + {ccmpFeatureTag, ccmpFeatureMask} +}; + +static const le_int32 canonFeatureMapCount = LE_ARRAY_SIZE(canonFeatureMap); + +LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, + le_int32 scriptCode, + le_int32 languageCode, + le_int32 typoFlags, + LEErrorCode &success) + : fGlyphStorage(NULL), fFontInstance(fontInstance), fScriptCode(scriptCode), fLanguageCode(languageCode), + fTypoFlags(typoFlags), fFilterZeroWidth(TRUE) +{ + if (LE_FAILURE(success)) { + return; + } + + fGlyphStorage = new LEGlyphStorage(); + if (fGlyphStorage == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + } +} + +le_int32 LayoutEngine::getGlyphCount() const +{ + return fGlyphStorage->getGlyphCount(); +} + +void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const +{ + fGlyphStorage->getCharIndices(charIndices, indexBase, success); +} + +void LayoutEngine::getCharIndices(le_int32 charIndices[], LEErrorCode &success) const +{ + fGlyphStorage->getCharIndices(charIndices, success); +} + +// Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits +void LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const +{ + fGlyphStorage->getGlyphs(glyphs, extraBits, success); +} + +void LayoutEngine::getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const +{ + fGlyphStorage->getGlyphs(glyphs, success); +} + + +void LayoutEngine::getGlyphPositions(float positions[], LEErrorCode &success) const +{ + fGlyphStorage->getGlyphPositions(positions, success); +} + +void LayoutEngine::getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const +{ + fGlyphStorage->getGlyphPosition(glyphIndex, x, y, success); +} + +le_int32 LayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + const GlyphSubstitutionTableHeader *canonGSUBTable = (GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable; + LETag scriptTag = OpenTypeLayoutEngine::getScriptTag(fScriptCode); + LETag langSysTag = OpenTypeLayoutEngine::getLangSysTag(fLanguageCode); + le_int32 i, dir = 1, out = 0, outCharCount = count; + + if (canonGSUBTable->coversScript(scriptTag)) { + CharSubstitutionFilter *substitutionFilter = new CharSubstitutionFilter(fFontInstance); + if (substitutionFilter == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + const LEUnicode *inChars = &chars[offset]; + LEUnicode *reordered = NULL; + LEGlyphStorage fakeGlyphStorage; + + fakeGlyphStorage.allocateGlyphArray(count, rightToLeft, success); + + if (LE_FAILURE(success)) { + delete substitutionFilter; + return 0; + } + + // This is the cheapest way to get mark reordering only for Hebrew. + // We could just do the mark reordering for all scripts, but most + // of them probably don't need it... + if (fScriptCode == hebrScriptCode) { + reordered = LE_NEW_ARRAY(LEUnicode, count); + + if (reordered == NULL) { + delete substitutionFilter; + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, fakeGlyphStorage); + inChars = reordered; + } + + fakeGlyphStorage.allocateAuxData(success); + + if (LE_FAILURE(success)) { + delete substitutionFilter; + return 0; + } + + if (rightToLeft) { + out = count - 1; + dir = -1; + } + + for (i = 0; i < count; i += 1, out += dir) { + fakeGlyphStorage[out] = (LEGlyphID) inChars[i]; + fakeGlyphStorage.setAuxData(out, canonFeatures, success); + } + + if (reordered != NULL) { + LE_DELETE_ARRAY(reordered); + } + + outCharCount = canonGSUBTable->process(fakeGlyphStorage, rightToLeft, scriptTag, langSysTag, NULL, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE, success); + + if (LE_FAILURE(success)) { + delete substitutionFilter; + return 0; + } + + out = (rightToLeft? outCharCount - 1 : 0); + + /* + * The char indices array in fakeGlyphStorage has the correct mapping + * back to the original input characters. Save it in glyphStorage. The + * subsequent call to glyphStoratge.allocateGlyphArray will keep this + * array rather than allocating and initializing a new one. + */ + glyphStorage.adoptCharIndicesArray(fakeGlyphStorage); + + outChars = LE_NEW_ARRAY(LEUnicode, outCharCount); + + if (outChars == NULL) { + delete substitutionFilter; + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + for (i = 0; i < outCharCount; i += 1, out += dir) { + outChars[out] = (LEUnicode) LE_GET_GLYPH(fakeGlyphStorage[i]); + } + + delete substitutionFilter; + } + + return outCharCount; +} + +le_int32 LayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + LEUnicode *outChars = NULL; + le_int32 outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, glyphStorage, success); + + if (outChars != NULL) { + mapCharsToGlyphs(outChars, 0, outCharCount, rightToLeft, rightToLeft, glyphStorage, success); + LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work... + } else { + mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphStorage, success); + } + + return glyphStorage.getGlyphCount(); +} + +// Input: glyphs +// Output: positions +void LayoutEngine::positionGlyphs(LEGlyphStorage &glyphStorage, float x, float y, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + glyphStorage.allocatePositions(success); + + if (LE_FAILURE(success)) { + return; + } + + le_int32 i, glyphCount = glyphStorage.getGlyphCount(); + + for (i = 0; i < glyphCount; i += 1) { + LEPoint advance; + + glyphStorage.setPosition(i, x, y, success); + + fFontInstance->getGlyphAdvance(glyphStorage[i], advance); + x += advance.fX; + y += advance.fY; + } + + glyphStorage.setPosition(glyphCount, x, y, success); +} + +void LayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, + LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (chars == NULL || offset < 0 || count < 0) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + GlyphDefinitionTableHeader *gdefTable = (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable; + CanonMarkFilter filter(gdefTable); + + adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); + + if (fTypoFlags & 0x1) { /* kerning enabled */ + static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG; + const void* kernTableData = getFontTable(kernTableTag); + if (kernTableData != NULL) { + KernTable kt(fFontInstance, kernTableData); + kt.process(glyphStorage); + } + else { /* no 'kern' table, but the font might know kern pairs from an AFM file, for instance */ + float xAdjust = 0.0, yAdjust = 0.0; + LEGlyphID leftGlyph = glyphStorage.getGlyphID(0, success); + for (le_int32 i = 1; i < glyphStorage.getGlyphCount(); ++i) { + LEGlyphID rightGlyph = glyphStorage.getGlyphID(i, success); + LEPoint kern; + fFontInstance->getKernPair(leftGlyph, rightGlyph, kern); + xAdjust += fFontInstance->xUnitsToPoints(kern.fX); + yAdjust += fFontInstance->yUnitsToPoints(kern.fY); + glyphStorage.adjustPosition(i, xAdjust, yAdjust, success); + leftGlyph = rightGlyph; + } + glyphStorage.adjustPosition(glyphStorage.getGlyphCount(), xAdjust, yAdjust, success); + } + } + + // default is no adjustments + return; +} + +void LayoutEngine::adjustMarkGlyphs(LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success) +{ + float xAdjust = 0; + le_int32 p, glyphCount = glyphStorage.getGlyphCount(); + + if (LE_FAILURE(success)) { + return; + } + + if (markFilter == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + float ignore, prev; + + glyphStorage.getGlyphPosition(0, prev, ignore, success); + + for (p = 0; p < glyphCount; p += 1) { + float next, xAdvance; + + glyphStorage.getGlyphPosition(p + 1, next, ignore, success); + + xAdvance = next - prev; + glyphStorage.adjustPosition(p, xAdjust, 0, success); + + if (markFilter->accept(glyphStorage[p])) { + xAdjust -= xAdvance; + } + + prev = next; + } + + glyphStorage.adjustPosition(glyphCount, xAdjust, 0, success); +} + +void LayoutEngine::adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount, le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success) +{ + float xAdjust = 0; + le_int32 c = 0, direction = 1, p; + le_int32 glyphCount = glyphStorage.getGlyphCount(); + + if (LE_FAILURE(success)) { + return; + } + + if (markFilter == NULL) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (reverse) { + c = glyphCount - 1; + direction = -1; + } + + float ignore, prev; + + glyphStorage.getGlyphPosition(0, prev, ignore, success); + + for (p = 0; p < charCount; p += 1, c += direction) { + float next, xAdvance; + + glyphStorage.getGlyphPosition(p + 1, next, ignore, success); + + xAdvance = next - prev; + glyphStorage.adjustPosition(p, xAdjust, 0, success); + + if (markFilter->accept(chars[c])) { + xAdjust -= xAdvance; + } + + prev = next; + } + + glyphStorage.adjustPosition(glyphCount, xAdjust, 0, success); +} + +const void *LayoutEngine::getFontTable(LETag tableTag) const +{ + return fFontInstance->getFontTable(tableTag); +} + +void LayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, + LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + glyphStorage.allocateGlyphArray(count, reverse, success); + + DefaultCharMapper charMapper(TRUE, mirror); + + fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse, &charMapper, fFilterZeroWidth, glyphStorage); +} + +// Input: characters, font? +// Output: glyphs, positions, char indices +// Returns: number of glyphs +le_int32 LayoutEngine::layoutChars(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + float x, float y, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + le_int32 glyphCount; + + if (fGlyphStorage->getGlyphCount() > 0) { + fGlyphStorage->reset(); + } + + glyphCount = computeGlyphs(chars, offset, count, max, rightToLeft, *fGlyphStorage, success); + positionGlyphs(*fGlyphStorage, x, y, success); + adjustGlyphPositions(chars, offset, count, rightToLeft, *fGlyphStorage, success); + + return glyphCount; +} + +void LayoutEngine::reset() +{ + fGlyphStorage->reset(); +} + +LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success) +{ + // 3 -> kerning and ligatures + return LayoutEngine::layoutEngineFactory(fontInstance, scriptCode, languageCode, 3, success); +} + +LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) +{ + static const le_uint32 gsubTableTag = LE_GSUB_TABLE_TAG; + static const le_uint32 mortTableTag = LE_MORT_TABLE_TAG; + + if (LE_FAILURE(success)) { + return NULL; + } + + const GlyphSubstitutionTableHeader *gsubTable = (const GlyphSubstitutionTableHeader *) fontInstance->getFontTable(gsubTableTag); + LayoutEngine *result = NULL; + LETag scriptTag = 0x00000000; + LETag languageTag = 0x00000000; + LETag v2ScriptTag = OpenTypeLayoutEngine::getV2ScriptTag(scriptCode); + + // Right now, only invoke V2 processing for Devanagari. TODO: Allow more V2 scripts as they are + // properly tested. + + if ( v2ScriptTag == dev2ScriptTag && gsubTable != NULL && gsubTable->coversScript( v2ScriptTag )) { + result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, TRUE, gsubTable, success); + } + else if (gsubTable != NULL && gsubTable->coversScript(scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode))) { + switch (scriptCode) { + case bengScriptCode: + case devaScriptCode: + case gujrScriptCode: + case kndaScriptCode: + case mlymScriptCode: + case oryaScriptCode: + case guruScriptCode: + case tamlScriptCode: + case teluScriptCode: + case sinhScriptCode: + result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, FALSE, gsubTable, success); + break; + + case arabScriptCode: + case syrcScriptCode: + case mongScriptCode: + result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + + case hebrScriptCode: + // Disable hebrew ligatures since they have only archaic uses, see ticket #8318 + result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags & ~kTypoFlagLiga, gsubTable, success); + break; + + case hangScriptCode: + result = new HangulOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + + case haniScriptCode: + languageTag = OpenTypeLayoutEngine::getLangSysTag(languageCode); + + switch (languageCode) { + case korLanguageCode: + case janLanguageCode: + case zhtLanguageCode: + case zhsLanguageCode: + if (gsubTable->coversScriptAndLanguage(scriptTag, languageTag, TRUE)) { + result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + } + + // note: falling through to default case. + default: + result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + } + + break; + + case tibtScriptCode: + result = new TibetanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + + case khmrScriptCode: + result = new KhmerOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + + default: + result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); + break; + } + } else { + const MorphTableHeader *morphTable = (MorphTableHeader *) fontInstance->getFontTable(mortTableTag); + + if (morphTable != NULL) { + result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, morphTable, success); + } else { + switch (scriptCode) { + case bengScriptCode: + case devaScriptCode: + case gujrScriptCode: + case kndaScriptCode: + case mlymScriptCode: + case oryaScriptCode: + case guruScriptCode: + case tamlScriptCode: + case teluScriptCode: + case sinhScriptCode: + { + result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); + break; + } + + case arabScriptCode: + //case hebrScriptCode: + result = new UnicodeArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); + break; + + //case hebrScriptCode: + // return new HebrewOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); + + case thaiScriptCode: + result = new ThaiLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); + break; + + case hangScriptCode: + result = new HangulOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); + break; + + default: + result = new LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); + break; + } + } + } + + if (result && LE_FAILURE(success)) { + delete result; + result = NULL; + } + + if (result == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + } + + return result; +} + +LayoutEngine::~LayoutEngine() { + delete fGlyphStorage; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/LayoutEngine.h b/Build/source/libs/icu/icu-50.1/layout/LayoutEngine.h new file mode 100644 index 00000000000..b76f5748b75 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LayoutEngine.h @@ -0,0 +1,505 @@ +/* + * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved + */ + +#ifndef __LAYOUTENGINE_H +#define __LAYOUTENGINE_H + +#include "LETypes.h" + +/** + * \file + * \brief C++ API: Virtual base class for complex text layout. + */ + +U_NAMESPACE_BEGIN + +class LEFontInstance; +class LEGlyphFilter; +class LEGlyphStorage; + +/** + * This is a virtual base class used to do complex text layout. The text must all + * be in a single font, script, and language. An instance of a LayoutEngine can be + * created by calling the layoutEngineFactory method. Fonts are identified by + * instances of the LEFontInstance class. Script and language codes are identified + * by integer codes, which are defined in ScriptAndLanuageTags.h. + * + * Note that this class is not public API. It is declared public so that it can be + * exported from the library that it is a part of. + * + * The input to the layout process is an array of characters in logical order, + * and a starting X, Y position for the text. The output is an array of glyph indices, + * an array of character indices for the glyphs, and an array of glyph positions. + * These arrays are protected members of LayoutEngine which can be retreived by a + * public method. The reset method can be called to free these arrays so that the + * LayoutEngine can be reused. + * + * The layout process is done in three steps. There is a protected virtual method + * for each step. These methods have a default implementation which only does + * character to glyph mapping and default positioning using the glyph's advance + * widths. Subclasses can override these methods for more advanced layout. + * There is a public method which invokes the steps in the correct order. + * + * The steps are: + * + * 1) Glyph processing - character to glyph mapping and any other glyph processing + * such as ligature substitution and contextual forms. + * + * 2) Glyph positioning - position the glyphs based on their advance widths. + * + * 3) Glyph position adjustments - adjustment of glyph positions for kerning, + * accent placement, etc. + * + * NOTE: in all methods below, output parameters are references to pointers so + * the method can allocate and free the storage as needed. All storage allocated + * in this way is owned by the object which created it, and will be freed when it + * is no longer needed, or when the object's destructor is invoked. + * + * @see LEFontInstance + * @see ScriptAndLanguageTags.h + * + * @stable ICU 2.8 + */ +class U_LAYOUT_API LayoutEngine : public UObject { +public: +#ifndef U_HIDE_INTERNAL_API + /** @internal Flag to request kerning. */ + static const le_int32 kTypoFlagKern; + /** @internal Flag to request ligatures. */ + static const le_int32 kTypoFlagLiga; +#endif /* U_HIDE_INTERNAL_API */ + +protected: + /** + * The object which holds the glyph storage + * + * @internal + */ + LEGlyphStorage *fGlyphStorage; + + /** + * The font instance for the text font. + * + * @see LEFontInstance + * + * @internal + */ + const LEFontInstance *fFontInstance; + + /** + * The script code for the text + * + * @see ScriptAndLanguageTags.h for script codes. + * + * @internal + */ + le_int32 fScriptCode; + + /** + * The langauge code for the text + * + * @see ScriptAndLanguageTags.h for language codes. + * + * @internal + */ + le_int32 fLanguageCode; + + /** + * The typographic control flags + * + * @internal + */ + le_int32 fTypoFlags; + + /** + * <code>TRUE</code> if <code>mapCharsToGlyphs</code> should replace ZWJ / ZWNJ with a glyph + * with no contours. + * + * @internal + */ + le_bool fFilterZeroWidth; + +#ifndef U_HIDE_INTERNAL_API + /** + * This constructs an instance for a given font, script and language. Subclass constructors + * must call this constructor. + * + * @param fontInstance - the font for the text + * @param scriptCode - the script for the text + * @param languageCode - the language for the text + * @param typoFlags - the typographic control flags for the text (a bitfield). Use kTypoFlagKern + * if kerning is desired, kTypoFlagLiga if ligature formation is desired. Others are reserved. + * @param success - set to an error code if the operation fails + * + * @see LEFontInstance + * @see ScriptAndLanguageTags.h + * + * @internal + */ + LayoutEngine(const LEFontInstance *fontInstance, + le_int32 scriptCode, + le_int32 languageCode, + le_int32 typoFlags, + LEErrorCode &success); +#endif /* U_HIDE_INTERNAL_API */ + + // Do not enclose the protected default constructor with #ifndef U_HIDE_INTERNAL_API + // or else the compiler will create a public default constructor. + /** + * This overrides the default no argument constructor to make it + * difficult for clients to call it. Clients are expected to call + * layoutEngineFactory. + * + * @internal + */ + LayoutEngine(); + + /** + * This method does any required pre-processing to the input characters. It + * may generate output characters that differ from the input charcters due to + * insertions, deletions, or reorderings. In such cases, it will also generate an + * output character index array reflecting these changes. + * + * Subclasses must override this method. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - TRUE if the characters are in a right to left directional run + * @param outChars - the output character array, if different from the input + * @param glyphStorage - the object that holds the per-glyph storage. The character index array may be set. + * @param success - set to an error code if the operation fails + * + * @return the output character count (input character count if no change) + * + * @internal + */ + virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method does the glyph processing. It converts an array of characters + * into an array of glyph indices and character indices. The characters to be + * processed are passed in a surrounding context. The context is specified as + * a starting address and a maximum character count. An offset and a count are + * used to specify the characters to be processed. + * + * The default implementation of this method only does character to glyph mapping. + * Subclasses needing more elaborate glyph processing must override this method. + * + * Input parameters: + * @param chars - the character context + * @param offset - the offset of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the context. + * @param rightToLeft - TRUE if the text is in a right to left directional run + * @param glyphStorage - the object which holds the per-glyph storage. The glyph and char indices arrays + * will be set. + * + * Output parameters: + * @param success - set to an error code if the operation fails + * + * @return the number of glyphs in the glyph index array + * + * @internal + */ + virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method does basic glyph positioning. The default implementation positions + * the glyphs based on their advance widths. This is sufficient for most uses. It + * is not expected that many subclasses will override this method. + * + * Input parameters: + * @param glyphStorage - the object which holds the per-glyph storage. The glyph position array will be set. + * @param x - the starting X position + * @param y - the starting Y position + * @param success - set to an error code if the operation fails + * + * @internal + */ + virtual void positionGlyphs(LEGlyphStorage &glyphStorage, float x, float y, LEErrorCode &success); + + /** + * This method does positioning adjustments like accent positioning and + * kerning. The default implementation does nothing. Subclasses needing + * position adjustments must override this method. + * + * Note that this method has both characters and glyphs as input so that + * it can use the character codes to determine glyph types if that information + * isn't directly available. (e.g. Some Arabic OpenType fonts don't have a GDEF + * table) + * + * @param chars - the input character context + * @param offset - the offset of the first character to process + * @param count - the number of characters to process + * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered + * @param glyphStorage - the object which holds the per-glyph storage. The glyph positions will be + * adjusted as needed. + * @param success - output parameter set to an error code if the operation fails + * + * @internal + */ + virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method gets a table from the font associated with + * the text. The default implementation gets the table from + * the font instance. Subclasses which need to get the tables + * some other way must override this method. + * + * @param tableTag - the four byte table tag. + * + * @return the address of the table. + * + * @internal + */ + virtual const void *getFontTable(LETag tableTag) const; + + /** + * This method does character to glyph mapping. The default implementation + * uses the font instance to do the mapping. It will allocate the glyph and + * character index arrays if they're not already allocated. If it allocates the + * character index array, it will fill it it. + * + * This method supports right to left + * text with the ability to store the glyphs in reverse order, and by supporting + * character mirroring, which will replace a character which has a left and right + * form, such as parens, with the opposite form before mapping it to a glyph index. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the offset of the first character to be mapped + * @param count - the number of characters to be mapped + * @param reverse - if <code>TRUE</code>, the output will be in reverse order + * @param mirror - if <code>TRUE</code>, do character mirroring + * @param glyphStorage - the object which holds the per-glyph storage. The glyph and char + * indices arrays will be filled in. + * @param success - set to an error code if the operation fails + * + * @see LEFontInstance + * + * @internal + */ + virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, LEGlyphStorage &glyphStorage, LEErrorCode &success); + +#ifndef U_HIDE_INTERNAL_API + /** + * This is a convenience method that forces the advance width of mark + * glyphs to be zero, which is required for proper selection and highlighting. + * + * @param glyphStorage - the object containing the per-glyph storage. The positions array will be modified. + * @param markFilter - used to identify mark glyphs + * @param success - output parameter set to an error code if the operation fails + * + * @see LEGlyphFilter + * + * @internal + */ + static void adjustMarkGlyphs(LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success); + + + /** + * This is a convenience method that forces the advance width of mark + * glyphs to be zero, which is required for proper selection and highlighting. + * This method uses the input characters to identify marks. This is required in + * cases where the font does not contain enough information to identify them based + * on the glyph IDs. + * + * @param chars - the array of input characters + * @param charCount - the number of input characers + * @param glyphStorage - the object containing the per-glyph storage. The positions array will be modified. + * @param reverse - <code>TRUE</code> if the glyph array has been reordered + * @param markFilter - used to identify mark glyphs + * @param success - output parameter set to an error code if the operation fails + * + * @see LEGlyphFilter + * + * @internal + */ + static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount, le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success); +#endif /* U_HIDE_INTERNAL_API */ + +public: + /** + * The destructor. It will free any storage allocated for the + * glyph, character index and position arrays by calling the reset + * method. It is declared virtual so that it will be invoked by the + * subclass destructors. + * + * @stable ICU 2.8 + */ + virtual ~LayoutEngine(); + + /** + * This method will invoke the layout steps in their correct order by calling + * the computeGlyphs, positionGlyphs and adjustGlyphPosition methods. It will + * compute the glyph, character index and position arrays. + * + * @param chars - the input character context + * @param offset - the offset of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - TRUE if the characers are in a right to left directional run + * @param x - the initial X position + * @param y - the initial Y position + * @param success - output parameter set to an error code if the operation fails + * + * @return the number of glyphs in the glyph array + * + * Note: The glyph, character index and position array can be accessed + * using the getter methods below. + * + * Note: If you call this method more than once, you must call the reset() + * method first to free the glyph, character index and position arrays + * allocated by the previous call. + * + * @stable ICU 2.8 + */ + virtual le_int32 layoutChars(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, float x, float y, LEErrorCode &success); + + /** + * This method returns the number of glyphs in the glyph array. Note + * that the number of glyphs will be greater than or equal to the number + * of characters used to create the LayoutEngine. + * + * @return the number of glyphs in the glyph array + * + * @stable ICU 2.8 + */ + le_int32 getGlyphCount() const; + + /** + * This method copies the glyph array into a caller supplied array. + * The caller must ensure that the array is large enough to hold all + * the glyphs. + * + * @param glyphs - the destiniation glyph array + * @param success - set to an error code if the operation fails + * + * @stable ICU 2.8 + */ + void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const; + + /** + * This method copies the glyph array into a caller supplied array, + * ORing in extra bits. (This functionality is needed by the JDK, + * which uses 32 bits pre glyph idex, with the high 16 bits encoding + * the composite font slot number) + * + * @param glyphs - the destination (32 bit) glyph array + * @param extraBits - this value will be ORed with each glyph index + * @param success - set to an error code if the operation fails + * + * @stable ICU 2.8 + */ + virtual void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const; + + /** + * This method copies the character index array into a caller supplied array. + * The caller must ensure that the array is large enough to hold a + * character index for each glyph. + * + * @param charIndices - the destiniation character index array + * @param success - set to an error code if the operation fails + * + * @stable ICU 2.8 + */ + void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const; + + /** + * This method copies the character index array into a caller supplied array. + * The caller must ensure that the array is large enough to hold a + * character index for each glyph. + * + * @param charIndices - the destiniation character index array + * @param indexBase - an offset which will be added to each index + * @param success - set to an error code if the operation fails + * + * @stable ICU 2.8 + */ + void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const; + + /** + * This method copies the position array into a caller supplied array. + * The caller must ensure that the array is large enough to hold an + * X and Y position for each glyph, plus an extra X and Y for the + * advance of the last glyph. + * + * @param positions - the destiniation position array + * @param success - set to an error code if the operation fails + * + * @stable ICU 2.8 + */ + void getGlyphPositions(float positions[], LEErrorCode &success) const; + + /** + * This method returns the X and Y position of the glyph at + * the given index. + * + * Input parameters: + * @param glyphIndex - the index of the glyph + * + * Output parameters: + * @param x - the glyph's X position + * @param y - the glyph's Y position + * @param success - set to an error code if the operation fails + * + * @stable ICU 2.8 + */ + void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const; + + /** + * This method frees the glyph, character index and position arrays + * so that the LayoutEngine can be reused to layout a different + * characer array. (This method is also called by the destructor) + * + * @stable ICU 2.8 + */ + virtual void reset(); + + /** + * This method returns a LayoutEngine capable of laying out text + * in the given font, script and langauge. Note that the LayoutEngine + * returned may be a subclass of LayoutEngine. + * + * @param fontInstance - the font of the text + * @param scriptCode - the script of the text + * @param languageCode - the language of the text + * @param success - output parameter set to an error code if the operation fails + * + * @return a LayoutEngine which can layout text in the given font. + * + * @see LEFontInstance + * + * @stable ICU 2.8 + */ + static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success); + + /** + * Override of existing call that provides flags to control typography. + * @stable ICU 3.4 + */ + static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typo_flags, LEErrorCode &success); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/LayoutTables.h b/Build/source/libs/icu/icu-50.1/layout/LayoutTables.h new file mode 100644 index 00000000000..fda5081c7a5 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LayoutTables.h @@ -0,0 +1,26 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __LAYOUTTABLES_H +#define __LAYOUTTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" + +U_NAMESPACE_BEGIN + +#define ANY_NUMBER 1 + +typedef le_int16 ByteOffset; +typedef le_int16 WordOffset; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/LigatureSubstProc.cpp b/Build/source/libs/icu/icu-50.1/layout/LigatureSubstProc.cpp new file mode 100644 index 00000000000..8df9a7861f3 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LigatureSubstProc.cpp @@ -0,0 +1,117 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "StateTables.h" +#include "MorphStateTables.h" +#include "SubtableProcessor.h" +#include "StateTableProcessor.h" +#include "LigatureSubstProc.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +#define ExtendedComplement(m) ((le_int32) (~((le_uint32) (m)))) +#define SignBit(m) ((ExtendedComplement(m) >> 1) & (le_int32)(m)) +#define SignExtend(v,m) (((v) & SignBit(m))? ((v) | ExtendedComplement(m)): (v)) + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LigatureSubstitutionProcessor) + +LigatureSubstitutionProcessor::LigatureSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) + : StateTableProcessor(morphSubtableHeader) +{ + ligatureSubstitutionHeader = (const LigatureSubstitutionHeader *) morphSubtableHeader; + ligatureActionTableOffset = SWAPW(ligatureSubstitutionHeader->ligatureActionTableOffset); + componentTableOffset = SWAPW(ligatureSubstitutionHeader->componentTableOffset); + ligatureTableOffset = SWAPW(ligatureSubstitutionHeader->ligatureTableOffset); + + entryTable = (const LigatureSubstitutionStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset); +} + +LigatureSubstitutionProcessor::~LigatureSubstitutionProcessor() +{ +} + +void LigatureSubstitutionProcessor::beginStateTable() +{ + m = -1; +} + +ByteOffset LigatureSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) +{ + const LigatureSubstitutionStateEntry *entry = &entryTable[index]; + ByteOffset newState = SWAPW(entry->newStateOffset); + le_int16 flags = SWAPW(entry->flags); + + if (flags & lsfSetComponent) { + if (++m >= nComponents) { + m = 0; + } + + componentStack[m] = currGlyph; + } + + ByteOffset actionOffset = flags & lsfActionOffsetMask; + + if (actionOffset != 0) { + const LigatureActionEntry *ap = (const LigatureActionEntry *) ((char *) &ligatureSubstitutionHeader->stHeader + actionOffset); + LigatureActionEntry action; + le_int32 offset, i = 0; + le_int32 stack[nComponents]; + le_int16 mm = -1; + + do { + le_uint32 componentGlyph = componentStack[m--]; + + action = SWAPL(*ap++); + + if (m < 0) { + m = nComponents - 1; + } + + offset = action & lafComponentOffsetMask; + if (offset != 0) { + const le_int16 *offsetTable = (const le_int16 *)((char *) &ligatureSubstitutionHeader->stHeader + 2 * SignExtend(offset, lafComponentOffsetMask)); + + i += SWAPW(offsetTable[LE_GET_GLYPH(glyphStorage[componentGlyph])]); + + if (action & (lafLast | lafStore)) { + const TTGlyphID *ligatureOffset = (const TTGlyphID *) ((char *) &ligatureSubstitutionHeader->stHeader + i); + TTGlyphID ligatureGlyph = SWAPW(*ligatureOffset); + + glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], ligatureGlyph); + stack[++mm] = componentGlyph; + i = 0; + } else { + glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], 0xFFFF); + } + } + } while (!(action & lafLast)); + + while (mm >= 0) { + if (++m >= nComponents) { + m = 0; + } + + componentStack[m] = stack[mm--]; + } + } + + if (!(flags & lsfDontAdvance)) { + // should handle reverse too! + currGlyph += 1; + } + + return newState; +} + +void LigatureSubstitutionProcessor::endStateTable() +{ +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/LigatureSubstProc.h b/Build/source/libs/icu/icu-50.1/layout/LigatureSubstProc.h new file mode 100644 index 00000000000..ef5b1edb5fc --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LigatureSubstProc.h @@ -0,0 +1,71 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __LIGATURESUBSTITUTIONPROCESSOR_H +#define __LIGATURESUBSTITUTIONPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "StateTableProcessor.h" +#include "LigatureSubstitution.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +#define nComponents 16 + +class LigatureSubstitutionProcessor : public StateTableProcessor +{ +public: + virtual void beginStateTable(); + + virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index); + + virtual void endStateTable(); + + LigatureSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader); + virtual ~LigatureSubstitutionProcessor(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +private: + LigatureSubstitutionProcessor(); + +protected: + ByteOffset ligatureActionTableOffset; + ByteOffset componentTableOffset; + ByteOffset ligatureTableOffset; + + const LigatureSubstitutionStateEntry *entryTable; + + le_int32 componentStack[nComponents]; + le_int16 m; + + const LigatureSubstitutionHeader *ligatureSubstitutionHeader; + +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/LigatureSubstSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/LigatureSubstSubtables.cpp new file mode 100644 index 00000000000..391ffe649ee --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LigatureSubstSubtables.cpp @@ -0,0 +1,68 @@ +/* + * (C) Copyright IBM Corp. 1998-2006 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "LigatureSubstSubtables.h" +#include "GlyphIterator.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_uint32 LigatureSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const +{ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + Offset ligSetTableOffset = SWAPW(ligSetTableOffsetArray[coverageIndex]); + const LigatureSetTable *ligSetTable = (const LigatureSetTable *) ((char *) this + ligSetTableOffset); + le_uint16 ligCount = SWAPW(ligSetTable->ligatureCount); + + for (le_uint16 lig = 0; lig < ligCount; lig += 1) { + Offset ligTableOffset = SWAPW(ligSetTable->ligatureTableOffsetArray[lig]); + const LigatureTable *ligTable = (const LigatureTable *) ((char *)ligSetTable + ligTableOffset); + le_uint16 compCount = SWAPW(ligTable->compCount) - 1; + le_int32 startPosition = glyphIterator->getCurrStreamPosition(); + TTGlyphID ligGlyph = SWAPW(ligTable->ligGlyph); + le_uint16 comp; + + for (comp = 0; comp < compCount; comp += 1) { + if (! glyphIterator->next()) { + break; + } + + if (LE_GET_GLYPH(glyphIterator->getCurrGlyphID()) != SWAPW(ligTable->componentArray[comp])) { + break; + } + } + + if (comp == compCount && (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, ligGlyph)))) { + GlyphIterator tempIterator(*glyphIterator); + TTGlyphID deletedGlyph = tempIterator.ignoresMarks()? 0xFFFE : 0xFFFF; + + while (comp > 0) { + tempIterator.setCurrGlyphID(deletedGlyph); + tempIterator.prev(); + + comp -= 1; + } + + tempIterator.setCurrGlyphID(ligGlyph); + + return compCount + 1; + } + + glyphIterator->setCurrStreamPosition(startPosition); + } + + } + + return 0; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/LigatureSubstSubtables.h b/Build/source/libs/icu/icu-50.1/layout/LigatureSubstSubtables.h new file mode 100644 index 00000000000..423c95a663d --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LigatureSubstSubtables.h @@ -0,0 +1,45 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __LIGATURESUBSTITUTIONSUBTABLES_H +#define __LIGATURESUBSTITUTIONSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +struct LigatureSetTable +{ + le_uint16 ligatureCount; + Offset ligatureTableOffsetArray[ANY_NUMBER]; +}; + +struct LigatureTable +{ + TTGlyphID ligGlyph; + le_uint16 compCount; + TTGlyphID componentArray[ANY_NUMBER]; +}; + +struct LigatureSubstitutionSubtable : GlyphSubstitutionSubtable +{ + le_uint16 ligSetCount; + Offset ligSetTableOffsetArray[ANY_NUMBER]; + + le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/LigatureSubstitution.h b/Build/source/libs/icu/icu-50.1/layout/LigatureSubstitution.h new file mode 100644 index 00000000000..2963b7c1444 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LigatureSubstitution.h @@ -0,0 +1,51 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __LIGATURESUBSTITUTION_H +#define __LIGATURESUBSTITUTION_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LayoutTables.h" +#include "StateTables.h" +#include "MorphTables.h" +#include "MorphStateTables.h" + +U_NAMESPACE_BEGIN + +struct LigatureSubstitutionHeader : MorphStateTableHeader +{ + ByteOffset ligatureActionTableOffset; + ByteOffset componentTableOffset; + ByteOffset ligatureTableOffset; +}; + +enum LigatureSubstitutionFlags +{ + lsfSetComponent = 0x8000, + lsfDontAdvance = 0x4000, + lsfActionOffsetMask = 0x3FFF +}; + +struct LigatureSubstitutionStateEntry : StateEntry +{ +}; + +typedef le_uint32 LigatureActionEntry; + +enum LigatureActionFlags +{ + lafLast = 0x80000000, + lafStore = 0x40000000, + lafComponentOffsetMask = 0x3FFFFFFF +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/LookupProcessor.cpp b/Build/source/libs/icu/icu-50.1/layout/LookupProcessor.cpp new file mode 100644 index 00000000000..4f9d97c58d1 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LookupProcessor.cpp @@ -0,0 +1,316 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2012 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeUtilities.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "ICUFeatures.h" +#include "Lookups.h" +#include "ScriptAndLanguage.h" +#include "GlyphDefinitionTables.h" +#include "GlyphIterator.h" +#include "LookupProcessor.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_uint32 LookupProcessor::applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + le_uint16 lookupType = SWAPW(lookupTable->lookupType); + le_uint16 subtableCount = SWAPW(lookupTable->subTableCount); + le_int32 startPosition = glyphIterator->getCurrStreamPosition(); + le_uint32 delta; + + for (le_uint16 subtable = 0; subtable < subtableCount; subtable += 1) { + const LookupSubtable *lookupSubtable = lookupTable->getLookupSubtable(subtable); + + delta = applySubtable(lookupSubtable, lookupType, glyphIterator, fontInstance, success); + + if (delta > 0 && LE_FAILURE(success)) { + return 1; + } + + glyphIterator->setCurrStreamPosition(startPosition); + } + + return 1; +} + +le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, + le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, + const LEFontInstance *fontInstance, LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + le_int32 glyphCount = glyphStorage.getGlyphCount(); + + if (lookupSelectArray == NULL) { + return glyphCount; + } + + GlyphIterator glyphIterator(glyphStorage, glyphPositionAdjustments, + rightToLeft, 0, 0, glyphDefinitionTableHeader); + le_int32 newGlyphCount = glyphCount; + + for (le_uint16 order = 0; order < lookupOrderCount; order += 1) { + le_uint16 lookup = lookupOrderArray[order]; + FeatureMask selectMask = lookupSelectArray[lookup]; + + if (selectMask != 0) { + const LookupTable *lookupTable = lookupListTable->getLookupTable(lookup); + if (!lookupTable) { + continue; + } + le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags); + + glyphIterator.reset(lookupFlags, selectMask); + + while (glyphIterator.findFeatureTag()) { + applyLookupTable(lookupTable, &glyphIterator, fontInstance, success); + if (LE_FAILURE(success)) { + return 0; + } + } + + newGlyphCount = glyphIterator.applyInsertions(); + } + } + + return newGlyphCount; +} + +le_uint32 LookupProcessor::applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, LEErrorCode& success) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + const LookupTable *lookupTable = lookupListTable->getLookupTable(lookupTableIndex); + le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags); + GlyphIterator tempIterator(*glyphIterator, lookupFlags); + le_uint32 delta = applyLookupTable(lookupTable, &tempIterator, fontInstance, success); + + return delta; +} + +le_int32 LookupProcessor::selectLookups(const FeatureTable *featureTable, FeatureMask featureMask, le_int32 order) +{ + le_uint16 lookupCount = featureTable? SWAPW(featureTable->lookupCount) : 0; + le_int32 store = order; + + for (le_uint16 lookup = 0; lookup < lookupCount; lookup += 1) { + le_uint16 lookupListIndex = SWAPW(featureTable->lookupListIndexArray[lookup]); + if (lookupListIndex >= lookupSelectCount) { + continue; + } + + lookupSelectArray[lookupListIndex] |= featureMask; + lookupOrderArray[store++] = lookupListIndex; + } + + return store - order; +} + +LookupProcessor::LookupProcessor(const char *baseAddress, + Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset, + LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures, + LEErrorCode& success) + : lookupListTable(NULL), featureListTable(NULL), lookupSelectArray(NULL), lookupSelectCount(0), + lookupOrderArray(NULL), lookupOrderCount(0) +{ + const ScriptListTable *scriptListTable = NULL; + const LangSysTable *langSysTable = NULL; + le_uint16 featureCount = 0; + le_uint16 lookupListCount = 0; + le_uint16 requiredFeatureIndex; + + if (LE_FAILURE(success)) { + return; + } + + if (scriptListOffset != 0) { + scriptListTable = (const ScriptListTable *) (baseAddress + scriptListOffset); + langSysTable = scriptListTable->findLanguage(scriptTag, languageTag); + + if (langSysTable != 0) { + featureCount = SWAPW(langSysTable->featureCount); + } + } + + if (featureListOffset != 0) { + featureListTable = (const FeatureListTable *) (baseAddress + featureListOffset); + } + + if (lookupListOffset != 0) { + lookupListTable = (const LookupListTable *) (baseAddress + lookupListOffset); + lookupListCount = SWAPW(lookupListTable->lookupCount); + } + + if (langSysTable == NULL || featureListTable == NULL || lookupListTable == NULL || + featureCount == 0 || lookupListCount == 0) { + return; + } + + requiredFeatureIndex = SWAPW(langSysTable->reqFeatureIndex); + + lookupSelectArray = LE_NEW_ARRAY(FeatureMask, lookupListCount); + if (lookupSelectArray == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return; + } + + for (int i = 0; i < lookupListCount; i += 1) { + lookupSelectArray[i] = 0; + } + lookupSelectCount = lookupListCount; + + le_int32 count, order = 0; + le_int32 featureReferences = 0; + const FeatureTable *featureTable = NULL; + LETag featureTag; + + const FeatureTable *requiredFeatureTable = NULL; + LETag requiredFeatureTag = 0x00000000U; + + // Count the total number of lookups referenced by all features. This will + // be the maximum number of entries in the lookupOrderArray. We can't use + // lookupListCount because some lookups might be referenced by more than + // one feature. + for (le_int32 feature = 0; feature < featureCount; feature += 1) { + le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]); + + featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag); + if (!featureTable) { + continue; + } + featureReferences += SWAPW(featureTable->lookupCount); + } + + if (!featureTable) { + success = LE_INTERNAL_ERROR; + return; + } + + if (requiredFeatureIndex != 0xFFFF) { + requiredFeatureTable = featureListTable->getFeatureTable(requiredFeatureIndex, &requiredFeatureTag); + featureReferences += SWAPW(featureTable->lookupCount); + } + + lookupOrderArray = LE_NEW_ARRAY(le_uint16, featureReferences); + if (lookupOrderArray == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return; + } + + for (le_int32 f = 0; f < featureMapCount; f += 1) { + FeatureMap fm = featureMap[f]; + count = 0; + + // If this is the required feature, add its lookups + if (requiredFeatureTag == fm.tag) { + count += selectLookups(requiredFeatureTable, fm.mask, order); + } + + if (orderFeatures) { + // If we added lookups from the required feature, sort them + if (count > 1) { + OpenTypeUtilities::sort(lookupOrderArray, order); + } + + for (le_uint16 feature = 0; feature < featureCount; feature += 1) { + le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]); + + // don't add the required feature to the list more than once... + // TODO: Do we need this check? (Spec. says required feature won't be in feature list...) + if (featureIndex == requiredFeatureIndex) { + continue; + } + + featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag); + + if (featureTag == fm.tag) { + count += selectLookups(featureTable, fm.mask, order + count); + } + } + + if (count > 1) { + OpenTypeUtilities::sort(&lookupOrderArray[order], count); + } + + order += count; + } else { + for (le_uint16 feature = 0; feature < featureCount; feature += 1) { + le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]); + + // don't add the required feature to the list more than once... + // NOTE: This check is commented out because the spec. says that + // the required feature won't be in the feature list, and because + // any duplicate entries will be removed below. +#if 0 + if (featureIndex == requiredFeatureIndex) { + continue; + } +#endif + + featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag); + + if (featureTag == fm.tag) { + order += selectLookups(featureTable, fm.mask, order); + } + } + } + } + + if (!orderFeatures && (order > 1)) { + OpenTypeUtilities::sort(lookupOrderArray, order); + + // If there's no specified feature order, + // we will apply the lookups in the order + // that they're in the font. If a particular + // lookup may be referenced by more than one feature, + // it will apprear in the lookupOrderArray more than + // once, so remove any duplicate entries in the sorted array. + le_int32 out = 1; + + for (le_int32 in = 1; in < order; in += 1) { + if (lookupOrderArray[out - 1] != lookupOrderArray[in]) { + if (out != in) { + lookupOrderArray[out] = lookupOrderArray[in]; + } + + out += 1; + } + } + + order = out; + } + + lookupOrderCount = order; +} + +LookupProcessor::LookupProcessor() +{ + lookupOrderArray = NULL; + lookupSelectArray = NULL; +} + +LookupProcessor::~LookupProcessor() +{ + LE_DELETE_ARRAY(lookupOrderArray); + LE_DELETE_ARRAY(lookupSelectArray); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/LookupProcessor.h b/Build/source/libs/icu/icu-50.1/layout/LookupProcessor.h new file mode 100644 index 00000000000..43ade08c8ce --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LookupProcessor.h @@ -0,0 +1,80 @@ +/* + * %W% %E% + * + * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved + * + */ + +#ifndef __LOOKUPPROCESSOR_H +#define __LOOKUPPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +//#include "Lookups.h" +//#include "Features.h" + +U_NAMESPACE_BEGIN + +class LEFontInstance; +class LEGlyphStorage; +class GlyphIterator; +class GlyphPositionAdjustments; +struct FeatureTable; +struct FeatureListTable; +struct GlyphDefinitionTableHeader; +struct LookupSubtable; +struct LookupTable; + +class LookupProcessor : public UMemory { +public: + le_int32 process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, + le_bool rightToLeft, const GlyphDefinitionTableHeader *glyphDefinitionTableHeader, const LEFontInstance *fontInstance, LEErrorCode& success) const; + + le_uint32 applyLookupTable(const LookupTable *lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + + le_uint32 applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; + + virtual le_uint32 applySubtable(const LookupSubtable *lookupSubtable, le_uint16 subtableType, + GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const = 0; + + virtual ~LookupProcessor(); + +protected: + LookupProcessor(const char *baseAddress, + Offset scriptListOffset, + Offset featureListOffset, + Offset lookupListOffset, + LETag scriptTag, + LETag languageTag, + const FeatureMap *featureMap, + le_int32 featureMapCount, + le_bool orderFeatures, + LEErrorCode& success); + + LookupProcessor(); + + le_int32 selectLookups(const FeatureTable *featureTable, FeatureMask featureMask, le_int32 order); + + const LookupListTable *lookupListTable; + const FeatureListTable *featureListTable; + + FeatureMask *lookupSelectArray; + le_uint32 lookupSelectCount; + + le_uint16 *lookupOrderArray; + le_uint32 lookupOrderCount; + +private: + + LookupProcessor(const LookupProcessor &other); // forbid copying of this class + LookupProcessor &operator=(const LookupProcessor &other); // forbid copying of this class +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/LookupTables.cpp b/Build/source/libs/icu/icu-50.1/layout/LookupTables.cpp new file mode 100644 index 00000000000..9766a8133cc --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LookupTables.cpp @@ -0,0 +1,85 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LayoutTables.h" +#include "LookupTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +/* + These are the rolled-up versions of the uniform binary search. + Someday, if we need more performance, we can un-roll them. + + Note: I put these in the base class, so they only have to + be written once. Since the base class doesn't define the + segment table, these routines assume that it's right after + the binary search header. + + Another way to do this is to put each of these routines in one + of the derived classes, and implement it in the others by casting + the "this" pointer to the type that has the implementation. +*/ +const LookupSegment *BinarySearchLookupTable::lookupSegment(const LookupSegment *segments, LEGlyphID glyph) const +{ + le_int16 unity = SWAPW(unitSize); + le_int16 probe = SWAPW(searchRange); + le_int16 extra = SWAPW(rangeShift); + TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph); + const LookupSegment *entry = segments; + const LookupSegment *trial = (const LookupSegment *) ((char *) entry + extra); + + if (SWAPW(trial->lastGlyph) <= ttGlyph) { + entry = trial; + } + + while (probe > unity) { + probe >>= 1; + trial = (const LookupSegment *) ((char *) entry + probe); + + if (SWAPW(trial->lastGlyph) <= ttGlyph) { + entry = trial; + } + } + + if (SWAPW(entry->firstGlyph) <= ttGlyph) { + return entry; + } + + return NULL; +} + +const LookupSingle *BinarySearchLookupTable::lookupSingle(const LookupSingle *entries, LEGlyphID glyph) const +{ + le_int16 unity = SWAPW(unitSize); + le_int16 probe = SWAPW(searchRange); + le_int16 extra = SWAPW(rangeShift); + TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph); + const LookupSingle *entry = entries; + const LookupSingle *trial = (const LookupSingle *) ((char *) entry + extra); + + if (SWAPW(trial->glyph) <= ttGlyph) { + entry = trial; + } + + while (probe > unity) { + probe >>= 1; + trial = (const LookupSingle *) ((char *) entry + probe); + + if (SWAPW(trial->glyph) <= ttGlyph) { + entry = trial; + } + } + + if (SWAPW(entry->glyph) == ttGlyph) { + return entry; + } + + return NULL; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/LookupTables.h b/Build/source/libs/icu/icu-50.1/layout/LookupTables.h new file mode 100644 index 00000000000..5fa849940ca --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/LookupTables.h @@ -0,0 +1,90 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __LOOKUPTABLES_H +#define __LOOKUPTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LayoutTables.h" + +U_NAMESPACE_BEGIN + +enum LookupTableFormat +{ + ltfSimpleArray = 0, + ltfSegmentSingle = 2, + ltfSegmentArray = 4, + ltfSingleTable = 6, + ltfTrimmedArray = 8 +}; + +typedef le_int16 LookupValue; + +struct LookupTable +{ + le_int16 format; +}; + +struct LookupSegment +{ + TTGlyphID lastGlyph; + TTGlyphID firstGlyph; + LookupValue value; +}; + +struct LookupSingle +{ + TTGlyphID glyph; + LookupValue value; +}; + +struct BinarySearchLookupTable : LookupTable +{ + le_int16 unitSize; + le_int16 nUnits; + le_int16 searchRange; + le_int16 entrySelector; + le_int16 rangeShift; + + const LookupSegment *lookupSegment(const LookupSegment *segments, LEGlyphID glyph) const; + + const LookupSingle *lookupSingle(const LookupSingle *entries, LEGlyphID glyph) const; +}; + +struct SimpleArrayLookupTable : LookupTable +{ + LookupValue valueArray[ANY_NUMBER]; +}; + +struct SegmentSingleLookupTable : BinarySearchLookupTable +{ + LookupSegment segments[ANY_NUMBER]; +}; + +struct SegmentArrayLookupTable : BinarySearchLookupTable +{ + LookupSegment segments[ANY_NUMBER]; +}; + +struct SingleTableLookupTable : BinarySearchLookupTable +{ + LookupSingle entries[ANY_NUMBER]; +}; + +struct TrimmedArrayLookupTable : LookupTable +{ + TTGlyphID firstGlyph; + TTGlyphID glyphCount; + LookupValue valueArray[ANY_NUMBER]; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/Lookups.cpp b/Build/source/libs/icu/icu-50.1/layout/Lookups.cpp new file mode 100644 index 00000000000..67f62952e9c --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/Lookups.cpp @@ -0,0 +1,44 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "Lookups.h" +#include "CoverageTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +const LookupTable *LookupListTable::getLookupTable(le_uint16 lookupTableIndex) const +{ + if (lookupTableIndex >= SWAPW(lookupCount)) { + return 0; + } + + Offset lookupTableOffset = lookupTableOffsetArray[lookupTableIndex]; + + return (const LookupTable *) ((char *) this + SWAPW(lookupTableOffset)); +} + +const LookupSubtable *LookupTable::getLookupSubtable(le_uint16 subtableIndex) const +{ + if (subtableIndex >= SWAPW(subTableCount)) { + return 0; + } + + Offset subtableOffset = subTableOffsetArray[subtableIndex]; + + return (const LookupSubtable *) ((char *) this + SWAPW(subtableOffset)); +} + +le_int32 LookupSubtable::getGlyphCoverage(Offset tableOffset, LEGlyphID glyphID) const +{ + const CoverageTable *coverageTable = (const CoverageTable *) ((char *) this + SWAPW(tableOffset)); + + return coverageTable->getGlyphCoverage(glyphID); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/Lookups.h b/Build/source/libs/icu/icu-50.1/layout/Lookups.h new file mode 100644 index 00000000000..2316b573b81 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/Lookups.h @@ -0,0 +1,65 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#ifndef __LOOKUPS_H +#define __LOOKUPS_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +enum LookupFlags +{ + lfBaselineIsLogicalEnd = 0x0001, // The MS spec. calls this flag "RightToLeft" but this name is more accurate + lfIgnoreBaseGlyphs = 0x0002, + lfIgnoreLigatures = 0x0004, + lfIgnoreMarks = 0x0008, + lfReservedMask = 0x00F0, + lfMarkAttachTypeMask = 0xFF00, + lfMarkAttachTypeShift = 8 +}; + +struct LookupSubtable +{ + le_uint16 subtableFormat; + Offset coverageTableOffset; + + inline le_int32 getGlyphCoverage(LEGlyphID glyphID) const; + + le_int32 getGlyphCoverage(Offset tableOffset, LEGlyphID glyphID) const; +}; + +struct LookupTable +{ + le_uint16 lookupType; + le_uint16 lookupFlags; + le_uint16 subTableCount; + Offset subTableOffsetArray[ANY_NUMBER]; + + const LookupSubtable *getLookupSubtable(le_uint16 subtableIndex) const; +}; + +struct LookupListTable +{ + le_uint16 lookupCount; + Offset lookupTableOffsetArray[ANY_NUMBER]; + + const LookupTable *getLookupTable(le_uint16 lookupTableIndex) const; +}; + +inline le_int32 LookupSubtable::getGlyphCoverage(LEGlyphID glyphID) const +{ + return getGlyphCoverage(coverageTableOffset, glyphID); +} + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/MPreFixups.cpp b/Build/source/libs/icu/icu-50.1/layout/MPreFixups.cpp new file mode 100644 index 00000000000..08ad7a75dff --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MPreFixups.cpp @@ -0,0 +1,105 @@ +/* + * + * (C) Copyright IBM Corp. 2002-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphStorage.h" +#include "MPreFixups.h" + +U_NAMESPACE_BEGIN + +struct FixupData +{ + le_int32 fBaseIndex; + le_int32 fMPreIndex; +}; + +MPreFixups::MPreFixups(le_int32 charCount) + : fFixupData(NULL), fFixupCount(0) +{ + fFixupData = LE_NEW_ARRAY(FixupData, charCount); +} + +MPreFixups::~MPreFixups() +{ + LE_DELETE_ARRAY(fFixupData); + fFixupData = NULL; +} + +void MPreFixups::add(le_int32 baseIndex, le_int32 mpreIndex) +{ + // NOTE: don't add the fixup data if the mpre is right + // before the base consonant glyph. + if (baseIndex - mpreIndex > 1) { + fFixupData[fFixupCount].fBaseIndex = baseIndex; + fFixupData[fFixupCount].fMPreIndex = mpreIndex; + + fFixupCount += 1; + } +} + +void MPreFixups::apply(LEGlyphStorage &glyphStorage, LEErrorCode& success) +{ + if (LE_FAILURE(success)) { + return; + } + + for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) { + le_int32 baseIndex = fFixupData[fixup].fBaseIndex; + le_int32 mpreIndex = fFixupData[fixup].fMPreIndex; + le_int32 mpreLimit = mpreIndex + 1; + + while (glyphStorage[baseIndex] == 0xFFFF || glyphStorage[baseIndex] == 0xFFFE) { + baseIndex -= 1; + } + + while (glyphStorage[mpreLimit] == 0xFFFF || glyphStorage[mpreLimit] == 0xFFFE) { + mpreLimit += 1; + } + + if (mpreLimit == baseIndex) { + continue; + } + + LEErrorCode success = LE_NO_ERROR; + le_int32 mpreCount = mpreLimit - mpreIndex; + le_int32 moveCount = baseIndex - mpreLimit; + le_int32 mpreDest = baseIndex - mpreCount; + LEGlyphID *mpreSave = LE_NEW_ARRAY(LEGlyphID, mpreCount); + le_int32 *indexSave = LE_NEW_ARRAY(le_int32, mpreCount); + + if (mpreSave == NULL || indexSave == NULL) { + LE_DELETE_ARRAY(mpreSave); + LE_DELETE_ARRAY(indexSave); + success = LE_MEMORY_ALLOCATION_ERROR; + return; + } + + le_int32 i; + + for (i = 0; i < mpreCount; i += 1) { + mpreSave[i] = glyphStorage[mpreIndex + i]; + indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success); //charIndices[mpreIndex + i]; + } + + for (i = 0; i < moveCount; i += 1) { + LEGlyphID glyph = glyphStorage[mpreLimit + i]; + le_int32 charIndex = glyphStorage.getCharIndex(mpreLimit + i, success); + + glyphStorage[mpreIndex + i] = glyph; + glyphStorage.setCharIndex(mpreIndex + i, charIndex, success); + } + + for (i = 0; i < mpreCount; i += 1) { + glyphStorage[mpreDest + i] = mpreSave[i]; + glyphStorage.setCharIndex(mpreDest, indexSave[i], success); + } + + LE_DELETE_ARRAY(indexSave); + LE_DELETE_ARRAY(mpreSave); + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/MPreFixups.h b/Build/source/libs/icu/icu-50.1/layout/MPreFixups.h new file mode 100644 index 00000000000..18fefe0de94 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MPreFixups.h @@ -0,0 +1,42 @@ +/* + * + * (C) Copyright IBM Corp. 2002-2008 - All Rights Reserved + * + */ + +#ifndef __MPREFIXUPS_H +#define __MPREFIXUPS_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +// Might want to make this a private member... +struct FixupData; + +class MPreFixups : public UMemory +{ +public: + MPreFixups(le_int32 charCount); + ~MPreFixups(); + + void add(le_int32 baseIndex, le_int32 mpreIndex); + + void apply(LEGlyphStorage &glyphStorage, LEErrorCode& success); + +private: + FixupData *fFixupData; + le_int32 fFixupCount; +}; + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/Makefile.in b/Build/source/libs/icu/icu-50.1/layout/Makefile.in new file mode 100644 index 00000000000..d63a244942f --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/Makefile.in @@ -0,0 +1,240 @@ +#****************************************************************************** +# +# Copyright (C) 1999-2011, International Business Machines +# Corporation and others. All Rights Reserved. +# +#****************************************************************************** +## Makefile.in for ICU - layout + +## Source directory information +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ + +top_builddir = .. + +## All the flags and other definitions are included here. +include $(top_builddir)/icudefs.mk + +## Build directory information +subdir = layout + +## Extra files to remove for 'make clean' +CLEANFILES = *~ $(DEPS) $(IMPORT_LIB) $(MIDDLE_IMPORT_LIB) $(FINAL_IMPORT_LIB) + +## Target information + +TARGET_STUBNAME=$(LAYOUT_STUBNAME) + +ifneq ($(ENABLE_STATIC),) +TARGET = $(LIBDIR)/$(LIBSICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(A) +endif + +ifneq ($(ENABLE_SHARED),) +SO_TARGET = $(LIBDIR)/$(LIBICU)$(TARGET_STUBNAME)$(ICULIBSUFFIX).$(SO) +ALL_SO_TARGETS = $(SO_TARGET) $(MIDDLE_SO_TARGET) $(FINAL_SO_TARGET) $(SHARED_OBJECT) + +ifeq ($(ENABLE_SO_VERSION_DATA),1) +SO_VERSION_DATA = layout.res +endif + +ifeq ($(OS390BATCH),1) +BATCH_TARGET = $(BATCH_LAYOUT_TARGET) +BATCH_LIBS = $(BATCH_LIBICUUC) -lm +endif # OS390BATCH + +endif # ENABLE_SHARED + +ALL_TARGETS = $(TARGET) $(ALL_SO_TARGETS) $(BATCH_TARGET) + +DYNAMICCPPFLAGS = $(SHAREDLIBCPPFLAGS) +DYNAMICCFLAGS = $(SHAREDLIBCFLAGS) +DYNAMICCXXFLAGS = $(SHAREDLIBCXXFLAGS) +CFLAGS += $(LIBCFLAGS) +CXXFLAGS += $(LIBCXXFLAGS) + +CPPFLAGS += -I$(srcdir) -I$(srcdir)/.. -I$(top_srcdir)/common -I$(srcdir)/unicode $(LIBCPPFLAGS) +DEFS += -DU_LAYOUT_IMPLEMENTATION +LDFLAGS += $(LDFLAGSICULE) +LIBS = $(LIBICUUC) $(DEFAULT_LIBS) + +OBJECTS = LEFontInstance.o \ +OpenTypeLayoutEngine.o \ +ThaiLayoutEngine.o \ +ThaiShaping.o \ +ThaiStateTables.o \ +ArabicLayoutEngine.o \ +GXLayoutEngine.o \ +HanLayoutEngine.o \ +IndicLayoutEngine.o \ +LayoutEngine.o \ +ContextualGlyphSubstProc.o \ +IndicRearrangementProcessor.o \ +LigatureSubstProc.o \ +LookupTables.o \ +MorphTables.o \ +NonContextualGlyphSubstProc.o \ +SegmentArrayProcessor.o \ +SegmentSingleProcessor.o \ +SimpleArrayProcessor.o \ +SingleTableProcessor.o \ +StateTableProcessor.o \ +SubtableProcessor.o \ +TrimmedArrayProcessor.o \ +AlternateSubstSubtables.o \ +AnchorTables.o \ +ArabicShaping.o \ +CanonData.o \ +CanonShaping.o \ +ClassDefinitionTables.o \ +ContextualSubstSubtables.o \ +CoverageTables.o \ +CursiveAttachmentSubtables.o \ +DeviceTables.o \ +ExtensionSubtables.o \ +Features.o \ +GDEFMarkFilter.o \ +GlyphDefinitionTables.o \ +GlyphIterator.o \ +GlyphLookupTables.o \ +GlyphPosnLookupProc.o \ +GlyphPositionAdjustments.o \ +GlyphPositioningTables.o \ +GlyphSubstLookupProc.o \ +GlyphSubstitutionTables.o \ +IndicClassTables.o \ +IndicReordering.o \ +LEInsertionList.o \ +LEGlyphStorage.o \ +LigatureSubstSubtables.o \ +LookupProcessor.o \ +Lookups.o \ +MarkArrays.o \ +MarkToBasePosnSubtables.o \ +MarkToLigaturePosnSubtables.o \ +MarkToMarkPosnSubtables.o \ +MirroredCharData.o \ +MPreFixups.o \ +MultipleSubstSubtables.o \ +OpenTypeUtilities.o \ +PairPositioningSubtables.o \ +ScriptAndLanguage.o \ +ScriptAndLanguageTags.o \ +ShapingTypeData.o \ +SinglePositioningSubtables.o \ +SingleSubstitutionSubtables.o \ +SubstitutionLookups.o \ +ValueRecords.o \ +KhmerLayoutEngine.o \ +KhmerReordering.o \ +TibetanLayoutEngine.o \ +TibetanReordering.o \ +HangulLayoutEngine.o \ +KernTable.o \ +loengine.o + +## Header files to install +HEADERS= $(srcdir)/LayoutEngine.h $(srcdir)/LE*.h $(srcdir)/loengine.h + +STATIC_OBJECTS = $(OBJECTS:.o=.$(STATIC_O)) + +DEPS = $(OBJECTS:.o=.d) + +-include Makefile.local + +## List of phony targets +.PHONY : all all-local install install-local clean clean-local \ +distclean distclean-local install-library install-headers dist \ +dist-local check check-local check-exhaustive + +## Clear suffix list +.SUFFIXES : + +## List of standard targets +all: all-local +install: install-local +clean: clean-local +distclean : distclean-local +dist: dist-local +check: all check-local + +check-exhaustive: check + +all-local: $(ALL_TARGETS) + +install-local: install-headers install-library + +install-library: all-local + $(MKINSTALLDIRS) $(DESTDIR)$(libdir) +ifneq ($(ENABLE_STATIC),) + $(INSTALL-L) $(TARGET) $(DESTDIR)$(libdir) +endif +ifneq ($(ENABLE_SHARED),) + $(INSTALL-L) $(FINAL_SO_TARGET) $(DESTDIR)$(libdir) +ifneq ($(FINAL_SO_TARGET),$(SO_TARGET)) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(SO_TARGET)) +ifneq ($(FINAL_SO_TARGET),$(MIDDLE_SO_TARGET)) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_SO_TARGET)) && ln -s $(notdir $(FINAL_SO_TARGET)) $(notdir $(MIDDLE_SO_TARGET)) +endif +endif +ifneq ($(IMPORT_LIB_EXT),) + $(INSTALL-L) $(FINAL_IMPORT_LIB) $(DESTDIR)$(libdir) +ifneq ($(IMPORT_LIB),$(FINAL_IMPORT_LIB)) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(IMPORT_LIB)) +endif +ifneq ($(MIDDLE_IMPORT_LIB),$(FINAL_IMPORT_LIB)) + cd $(DESTDIR)$(libdir) && $(RM) $(notdir $(MIDDLE_IMPORT_LIB)) && ln -s $(notdir $(FINAL_IMPORT_LIB)) $(notdir $(MIDDLE_IMPORT_LIB)) +endif +endif +endif + +install-headers: + $(MKINSTALLDIRS) $(DESTDIR)$(includedir)/layout + @for file in $(HEADERS); do \ + echo "$(INSTALL_DATA) $$file $(DESTDIR)$(includedir)/layout"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(includedir)/layout || exit; \ + done + +dist-local: + +clean-local: + test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES) + $(RMV) $(OBJECTS) $(STATIC_OBJECTS) $(ALL_TARGETS) $(SO_VERSION_DATA) + +distclean-local: clean-local + $(RMV) Makefile + +check-local: + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +ifneq ($(ENABLE_STATIC),) +$(TARGET): $(STATIC_OBJECTS) + $(AR) $(ARFLAGS) $(AR_OUTOPT)$@ $^ + $(RANLIB) $@ +endif + +ifneq ($(ENABLE_SHARED),) +$(SHARED_OBJECT): $(OBJECTS) $(SO_VERSION_DATA) + $(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(LIBS) +ifeq ($(ENABLE_RPATH),YES) +ifneq ($(wildcard $(libdir)/$(MIDDLE_SO_TARGET)),) + $(warning RPATH warning: --enable-rpath means test programs may use existing $(libdir)/$(MIDDLE_SO_TARGET)) +endif +endif + +ifeq ($(OS390BATCH),1) +$(BATCH_TARGET):$(OBJECTS) + $(SHLIB.cc) $(LD_SONAME) $(OUTOPT)$@ $^ $(BATCH_LIBS) +endif # OS390BATCH +endif # ENABLE_SHARED + +ifeq (,$(MAKECMDGOALS)) +-include $(DEPS) +else +ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),) +-include $(DEPS) +endif +endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/MarkArrays.cpp b/Build/source/libs/icu/icu-50.1/layout/MarkArrays.cpp new file mode 100644 index 00000000000..47a06251e6d --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MarkArrays.cpp @@ -0,0 +1,39 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "AnchorTables.h" +#include "MarkArrays.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_int32 MarkArray::getMarkClass(LEGlyphID glyphID, le_int32 coverageIndex, const LEFontInstance *fontInstance, + LEPoint &anchor) const +{ + le_int32 markClass = -1; + + if (coverageIndex >= 0) { + le_uint16 mCount = SWAPW(markCount); + + if (coverageIndex < mCount) { + const MarkRecord *markRecord = &markRecordArray[coverageIndex]; + Offset anchorTableOffset = SWAPW(markRecord->markAnchorTableOffset); + const AnchorTable *anchorTable = (AnchorTable *) ((char *) this + anchorTableOffset); + + anchorTable->getAnchor(glyphID, fontInstance, anchor); + markClass = SWAPW(markRecord->markClass); + } + + // XXXX If we get here, the table is mal-formed + } + + return markClass; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/MarkArrays.h b/Build/source/libs/icu/icu-50.1/layout/MarkArrays.h new file mode 100644 index 00000000000..66dca2ae688 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MarkArrays.h @@ -0,0 +1,39 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __MARKARRAYS_H +#define __MARKARRAYS_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +struct MarkRecord +{ + le_uint16 markClass; + Offset markAnchorTableOffset; +}; + +struct MarkArray +{ + le_uint16 markCount; + MarkRecord markRecordArray[ANY_NUMBER]; + + le_int32 getMarkClass(LEGlyphID glyphID, le_int32 coverageIndex, const LEFontInstance *fontInstance, + LEPoint &anchor) const; +}; + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/MarkToBasePosnSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/MarkToBasePosnSubtables.cpp new file mode 100644 index 00000000000..7711988081e --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MarkToBasePosnSubtables.cpp @@ -0,0 +1,115 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "AnchorTables.h" +#include "MarkArrays.h" +#include "GlyphPositioningTables.h" +#include "AttachmentPosnSubtables.h" +#include "MarkToBasePosnSubtables.h" +#include "GlyphIterator.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +LEGlyphID MarkToBasePositioningSubtable::findBaseGlyph(GlyphIterator *glyphIterator) const +{ + if (glyphIterator->prev()) { + return glyphIterator->getCurrGlyphID(); + } + + return 0xFFFF; +} + +le_int32 MarkToBasePositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const +{ + LEGlyphID markGlyph = glyphIterator->getCurrGlyphID(); + le_int32 markCoverage = getGlyphCoverage((LEGlyphID) markGlyph); + + if (markCoverage < 0) { + // markGlyph isn't a covered mark glyph + return 0; + } + + LEPoint markAnchor; + const MarkArray *markArray = (const MarkArray *) ((char *) this + SWAPW(markArrayOffset)); + le_int32 markClass = markArray->getMarkClass(markGlyph, markCoverage, fontInstance, markAnchor); + le_uint16 mcCount = SWAPW(classCount); + + if (markClass < 0 || markClass >= mcCount) { + // markGlyph isn't in the mark array or its + // mark class is too big. The table is mal-formed! + return 0; + } + + // FIXME: We probably don't want to find a base glyph before a previous ligature... + GlyphIterator baseIterator(*glyphIterator, (le_uint16) (lfIgnoreMarks /*| lfIgnoreLigatures*/)); + LEGlyphID baseGlyph = findBaseGlyph(&baseIterator); + le_int32 baseCoverage = getBaseCoverage((LEGlyphID) baseGlyph); + const BaseArray *baseArray = (const BaseArray *) ((char *) this + SWAPW(baseArrayOffset)); + le_uint16 baseCount = SWAPW(baseArray->baseRecordCount); + + if (baseCoverage < 0 || baseCoverage >= baseCount) { + // The base glyph isn't covered, or the coverage + // index is too big. The latter means that the + // table is mal-formed... + return 0; + } + + const BaseRecord *baseRecord = &baseArray->baseRecordArray[baseCoverage * mcCount]; + Offset anchorTableOffset = SWAPW(baseRecord->baseAnchorTableOffsetArray[markClass]); + const AnchorTable *anchorTable = (const AnchorTable *) ((char *) baseArray + anchorTableOffset); + LEPoint baseAnchor, markAdvance, pixels; + + if (anchorTableOffset == 0) { + // this means the table is mal-formed... + glyphIterator->setCurrGlyphBaseOffset(baseIterator.getCurrStreamPosition()); + return 0; + } + + anchorTable->getAnchor(baseGlyph, fontInstance, baseAnchor); + + fontInstance->getGlyphAdvance(markGlyph, pixels); + fontInstance->pixelsToUnits(pixels, markAdvance); + + float anchorDiffX = baseAnchor.fX - markAnchor.fX; + float anchorDiffY = baseAnchor.fY - markAnchor.fY; + + glyphIterator->setCurrGlyphBaseOffset(baseIterator.getCurrStreamPosition()); + + if (glyphIterator->isRightToLeft()) { + // FIXME: need similar patch to below; also in MarkToLigature and MarkToMark + // (is there a better way to approach this for all the cases?) + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); + } else { + LEPoint baseAdvance; + + fontInstance->getGlyphAdvance(baseGlyph, pixels); + + //JK: adjustment needs to account for non-zero advance of any marks between base glyph and current mark + GlyphIterator gi(baseIterator, (le_uint16)0); // copy of baseIterator that won't ignore marks + gi.next(); // point beyond the base glyph + while (gi.getCurrStreamPosition() < glyphIterator->getCurrStreamPosition()) { // for all intervening glyphs (marks)... + LEGlyphID otherMark = gi.getCurrGlyphID(); + LEPoint px; + fontInstance->getGlyphAdvance(otherMark, px); // get advance, in case it's non-zero + pixels.fX += px.fX; // and add that to the base glyph's advance + pixels.fY += px.fY; + gi.next(); + } + // end of JK patch + + fontInstance->pixelsToUnits(pixels, baseAdvance); + + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - baseAdvance.fX, anchorDiffY - baseAdvance.fY, -markAdvance.fX, -markAdvance.fY); + } + + return 1; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/MarkToBasePosnSubtables.h b/Build/source/libs/icu/icu-50.1/layout/MarkToBasePosnSubtables.h new file mode 100644 index 00000000000..aa7a0a1262c --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MarkToBasePosnSubtables.h @@ -0,0 +1,43 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __MARKTOBASEPOSITIONINGSUBTABLES_H +#define __MARKTOBASEPOSITIONINGSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphPositioningTables.h" +#include "AttachmentPosnSubtables.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +struct MarkToBasePositioningSubtable : AttachmentPositioningSubtable +{ + le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; + LEGlyphID findBaseGlyph(GlyphIterator *glyphIterator) const; +}; + +struct BaseRecord +{ + Offset baseAnchorTableOffsetArray[ANY_NUMBER]; +}; + +struct BaseArray +{ + le_int16 baseRecordCount; + BaseRecord baseRecordArray[ANY_NUMBER]; +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/MarkToLigaturePosnSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/MarkToLigaturePosnSubtables.cpp new file mode 100644 index 00000000000..e247e4e5892 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MarkToLigaturePosnSubtables.cpp @@ -0,0 +1,103 @@ +/* + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "AnchorTables.h" +#include "MarkArrays.h" +#include "GlyphPositioningTables.h" +#include "AttachmentPosnSubtables.h" +#include "MarkToLigaturePosnSubtables.h" +#include "GlyphIterator.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +LEGlyphID MarkToLigaturePositioningSubtable::findLigatureGlyph(GlyphIterator *glyphIterator) const +{ + if (glyphIterator->prev()) { + return glyphIterator->getCurrGlyphID(); + } + + return 0xFFFF; +} + +le_int32 MarkToLigaturePositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const +{ + LEGlyphID markGlyph = glyphIterator->getCurrGlyphID(); + le_int32 markCoverage = getGlyphCoverage((LEGlyphID) markGlyph); + + if (markCoverage < 0) { + // markGlyph isn't a covered mark glyph + return 0; + } + + LEPoint markAnchor; + const MarkArray *markArray = (const MarkArray *) ((char *) this + SWAPW(markArrayOffset)); + le_int32 markClass = markArray->getMarkClass(markGlyph, markCoverage, fontInstance, markAnchor); + le_uint16 mcCount = SWAPW(classCount); + + if (markClass < 0 || markClass >= mcCount) { + // markGlyph isn't in the mark array or its + // mark class is too big. The table is mal-formed! + return 0; + } + + // FIXME: we probably don't want to find a ligature before a previous base glyph... + GlyphIterator ligatureIterator(*glyphIterator, (le_uint16) (lfIgnoreMarks /*| lfIgnoreBaseGlyphs*/)); + LEGlyphID ligatureGlyph = findLigatureGlyph(&ligatureIterator); + le_int32 ligatureCoverage = getBaseCoverage((LEGlyphID) ligatureGlyph); + const LigatureArray *ligatureArray = (const LigatureArray *) ((char *) this + SWAPW(baseArrayOffset)); + le_uint16 ligatureCount = SWAPW(ligatureArray->ligatureCount); + + if (ligatureCoverage < 0 || ligatureCoverage >= ligatureCount) { + // The ligature glyph isn't covered, or the coverage + // index is too big. The latter means that the + // table is mal-formed... + return 0; + } + + le_int32 markPosition = glyphIterator->getCurrStreamPosition(); + Offset ligatureAttachOffset = SWAPW(ligatureArray->ligatureAttachTableOffsetArray[ligatureCoverage]); + const LigatureAttachTable *ligatureAttachTable = (const LigatureAttachTable *) ((char *) ligatureArray + ligatureAttachOffset); + le_int32 componentCount = SWAPW(ligatureAttachTable->componentCount); + le_int32 component = ligatureIterator.getMarkComponent(markPosition); + + if (component >= componentCount) { + // should really just bail at this point... + component = componentCount - 1; + } + + const ComponentRecord *componentRecord = &ligatureAttachTable->componentRecordArray[component * mcCount]; + Offset anchorTableOffset = SWAPW(componentRecord->ligatureAnchorTableOffsetArray[markClass]); + const AnchorTable *anchorTable = (const AnchorTable *) ((char *) ligatureAttachTable + anchorTableOffset); + LEPoint ligatureAnchor, markAdvance, pixels; + + anchorTable->getAnchor(ligatureGlyph, fontInstance, ligatureAnchor); + + fontInstance->getGlyphAdvance(markGlyph, pixels); + fontInstance->pixelsToUnits(pixels, markAdvance); + + float anchorDiffX = ligatureAnchor.fX - markAnchor.fX; + float anchorDiffY = ligatureAnchor.fY - markAnchor.fY; + + glyphIterator->setCurrGlyphBaseOffset(ligatureIterator.getCurrStreamPosition()); + + if (glyphIterator->isRightToLeft()) { + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); + } else { + LEPoint ligatureAdvance; + + fontInstance->getGlyphAdvance(ligatureGlyph, pixels); + fontInstance->pixelsToUnits(pixels, ligatureAdvance); + + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - ligatureAdvance.fX, anchorDiffY - ligatureAdvance.fY, -markAdvance.fX, -markAdvance.fY); + } + + return 1; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/MarkToLigaturePosnSubtables.h b/Build/source/libs/icu/icu-50.1/layout/MarkToLigaturePosnSubtables.h new file mode 100644 index 00000000000..b8e34d1dd78 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MarkToLigaturePosnSubtables.h @@ -0,0 +1,49 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __MARKTOLIGATUREPOSITIONINGSUBTABLES_H +#define __MARKTOLIGATUREPOSITIONINGSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphPositioningTables.h" +#include "AttachmentPosnSubtables.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +struct MarkToLigaturePositioningSubtable : AttachmentPositioningSubtable +{ + le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; + LEGlyphID findLigatureGlyph(GlyphIterator *glyphIterator) const; +}; + +struct ComponentRecord +{ + Offset ligatureAnchorTableOffsetArray[ANY_NUMBER]; +}; + +struct LigatureAttachTable +{ + le_uint16 componentCount; + ComponentRecord componentRecordArray[ANY_NUMBER]; +}; + +struct LigatureArray +{ + le_uint16 ligatureCount; + Offset ligatureAttachTableOffsetArray[ANY_NUMBER]; +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/MarkToMarkPosnSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/MarkToMarkPosnSubtables.cpp new file mode 100644 index 00000000000..3f571f5e39c --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MarkToMarkPosnSubtables.cpp @@ -0,0 +1,97 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "AnchorTables.h" +#include "MarkArrays.h" +#include "GlyphPositioningTables.h" +#include "AttachmentPosnSubtables.h" +#include "MarkToMarkPosnSubtables.h" +#include "GlyphIterator.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +LEGlyphID MarkToMarkPositioningSubtable::findMark2Glyph(GlyphIterator *glyphIterator) const +{ + if (glyphIterator->findMark2Glyph()) { + return glyphIterator->getCurrGlyphID(); + } + + return 0xFFFF; +} + +le_int32 MarkToMarkPositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const +{ + LEGlyphID markGlyph = glyphIterator->getCurrGlyphID(); + le_int32 markCoverage = getGlyphCoverage((LEGlyphID) markGlyph); + + if (markCoverage < 0) { + // markGlyph isn't a covered mark glyph + return 0; + } + + LEPoint markAnchor; + const MarkArray *markArray = (const MarkArray *) ((char *) this + SWAPW(markArrayOffset)); + le_int32 markClass = markArray->getMarkClass(markGlyph, markCoverage, fontInstance, markAnchor); + le_uint16 mcCount = SWAPW(classCount); + + if (markClass < 0 || markClass >= mcCount) { + // markGlyph isn't in the mark array or its + // mark class is too big. The table is mal-formed! + return 0; + } + + GlyphIterator mark2Iterator(*glyphIterator); + LEGlyphID mark2Glyph = findMark2Glyph(&mark2Iterator); + le_int32 mark2Coverage = getBaseCoverage((LEGlyphID) mark2Glyph); + const Mark2Array *mark2Array = (const Mark2Array *) ((char *) this + SWAPW(baseArrayOffset)); + le_uint16 mark2Count = SWAPW(mark2Array->mark2RecordCount); + + if (mark2Coverage < 0 || mark2Coverage >= mark2Count) { + // The mark2 glyph isn't covered, or the coverage + // index is too big. The latter means that the + // table is mal-formed... + return 0; + } + + const Mark2Record *mark2Record = &mark2Array->mark2RecordArray[mark2Coverage * mcCount]; + Offset anchorTableOffset = SWAPW(mark2Record->mark2AnchorTableOffsetArray[markClass]); + const AnchorTable *anchorTable = (const AnchorTable *) ((char *) mark2Array + anchorTableOffset); + LEPoint mark2Anchor, markAdvance, pixels; + + if (anchorTableOffset == 0) { + // this seems to mean that the marks don't attach... + return 0; + } + + anchorTable->getAnchor(mark2Glyph, fontInstance, mark2Anchor); + + fontInstance->getGlyphAdvance(markGlyph, pixels); + fontInstance->pixelsToUnits(pixels, markAdvance); + + float anchorDiffX = mark2Anchor.fX - markAnchor.fX; + float anchorDiffY = mark2Anchor.fY - markAnchor.fY; + + glyphIterator->setCurrGlyphBaseOffset(mark2Iterator.getCurrStreamPosition()); + + if (glyphIterator->isRightToLeft()) { + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); + } else { + LEPoint mark2Advance; + + fontInstance->getGlyphAdvance(mark2Glyph, pixels); + fontInstance->pixelsToUnits(pixels, mark2Advance); + + glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - mark2Advance.fX, anchorDiffY - mark2Advance.fY, -markAdvance.fX, -markAdvance.fY); + } + + return 1; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/MarkToMarkPosnSubtables.h b/Build/source/libs/icu/icu-50.1/layout/MarkToMarkPosnSubtables.h new file mode 100644 index 00000000000..746ace2946d --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MarkToMarkPosnSubtables.h @@ -0,0 +1,43 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __MARKTOMARKPOSITIONINGSUBTABLES_H +#define __MARKTOMARKPOSITIONINGSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphPositioningTables.h" +#include "AttachmentPosnSubtables.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +struct MarkToMarkPositioningSubtable : AttachmentPositioningSubtable +{ + le_int32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; + LEGlyphID findMark2Glyph(GlyphIterator *glyphIterator) const; +}; + +struct Mark2Record +{ + Offset mark2AnchorTableOffsetArray[ANY_NUMBER]; +}; + +struct Mark2Array +{ + le_uint16 mark2RecordCount; + Mark2Record mark2RecordArray[ANY_NUMBER]; +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/MirroredCharData.cpp b/Build/source/libs/icu/icu-50.1/layout/MirroredCharData.cpp new file mode 100644 index 00000000000..b813371708f --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MirroredCharData.cpp @@ -0,0 +1,108 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. + * + * Generated on: 07/20/2005 10:43:59 AM PDT + */ + +#include "LETypes.h" +#include "DefaultCharMapper.h" + +U_NAMESPACE_BEGIN + +const LEUnicode32 DefaultCharMapper::mirroredChars[] = { + 0x0028, 0x0029, 0x003C, 0x003E, 0x005B, 0x005D, 0x007B, 0x007D, + 0x00AB, 0x00BB, 0x2039, 0x203A, 0x2045, 0x2046, 0x207D, 0x207E, + 0x208D, 0x208E, 0x2208, 0x2209, 0x220A, 0x220B, 0x220C, 0x220D, + 0x2215, 0x223C, 0x223D, 0x2243, 0x2252, 0x2253, 0x2254, 0x2255, + 0x2264, 0x2265, 0x2266, 0x2267, 0x2268, 0x2269, 0x226A, 0x226B, + 0x226E, 0x226F, 0x2270, 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, + 0x2276, 0x2277, 0x2278, 0x2279, 0x227A, 0x227B, 0x227C, 0x227D, + 0x227E, 0x227F, 0x2280, 0x2281, 0x2282, 0x2283, 0x2284, 0x2285, + 0x2286, 0x2287, 0x2288, 0x2289, 0x228A, 0x228B, 0x228F, 0x2290, + 0x2291, 0x2292, 0x2298, 0x22A2, 0x22A3, 0x22A6, 0x22A8, 0x22A9, + 0x22AB, 0x22B0, 0x22B1, 0x22B2, 0x22B3, 0x22B4, 0x22B5, 0x22B6, + 0x22B7, 0x22C9, 0x22CA, 0x22CB, 0x22CC, 0x22CD, 0x22D0, 0x22D1, + 0x22D6, 0x22D7, 0x22D8, 0x22D9, 0x22DA, 0x22DB, 0x22DC, 0x22DD, + 0x22DE, 0x22DF, 0x22E0, 0x22E1, 0x22E2, 0x22E3, 0x22E4, 0x22E5, + 0x22E6, 0x22E7, 0x22E8, 0x22E9, 0x22EA, 0x22EB, 0x22EC, 0x22ED, + 0x22F0, 0x22F1, 0x22F2, 0x22F3, 0x22F4, 0x22F6, 0x22F7, 0x22FA, + 0x22FB, 0x22FC, 0x22FD, 0x22FE, 0x2308, 0x2309, 0x230A, 0x230B, + 0x2329, 0x232A, 0x2768, 0x2769, 0x276A, 0x276B, 0x276C, 0x276D, + 0x276E, 0x276F, 0x2770, 0x2771, 0x2772, 0x2773, 0x2774, 0x2775, + 0x27C3, 0x27C4, 0x27C5, 0x27C6, 0x27D5, 0x27D6, 0x27DD, 0x27DE, + 0x27E2, 0x27E3, 0x27E4, 0x27E5, 0x27E6, 0x27E7, 0x27E8, 0x27E9, + 0x27EA, 0x27EB, 0x2983, 0x2984, 0x2985, 0x2986, 0x2987, 0x2988, + 0x2989, 0x298A, 0x298B, 0x298C, 0x298D, 0x298E, 0x298F, 0x2990, + 0x2991, 0x2992, 0x2993, 0x2994, 0x2995, 0x2996, 0x2997, 0x2998, + 0x29B8, 0x29C0, 0x29C1, 0x29C4, 0x29C5, 0x29CF, 0x29D0, 0x29D1, + 0x29D2, 0x29D4, 0x29D5, 0x29D8, 0x29D9, 0x29DA, 0x29DB, 0x29F5, + 0x29F8, 0x29F9, 0x29FC, 0x29FD, 0x2A2B, 0x2A2C, 0x2A2D, 0x2A2E, + 0x2A34, 0x2A35, 0x2A3C, 0x2A3D, 0x2A64, 0x2A65, 0x2A79, 0x2A7A, + 0x2A7D, 0x2A7E, 0x2A7F, 0x2A80, 0x2A81, 0x2A82, 0x2A83, 0x2A84, + 0x2A8B, 0x2A8C, 0x2A91, 0x2A92, 0x2A93, 0x2A94, 0x2A95, 0x2A96, + 0x2A97, 0x2A98, 0x2A99, 0x2A9A, 0x2A9B, 0x2A9C, 0x2AA1, 0x2AA2, + 0x2AA6, 0x2AA7, 0x2AA8, 0x2AA9, 0x2AAA, 0x2AAB, 0x2AAC, 0x2AAD, + 0x2AAF, 0x2AB0, 0x2AB3, 0x2AB4, 0x2ABB, 0x2ABC, 0x2ABD, 0x2ABE, + 0x2ABF, 0x2AC0, 0x2AC1, 0x2AC2, 0x2AC3, 0x2AC4, 0x2AC5, 0x2AC6, + 0x2ACD, 0x2ACE, 0x2ACF, 0x2AD0, 0x2AD1, 0x2AD2, 0x2AD3, 0x2AD4, + 0x2AD5, 0x2AD6, 0x2ADE, 0x2AE3, 0x2AE4, 0x2AE5, 0x2AEC, 0x2AED, + 0x2AF7, 0x2AF8, 0x2AF9, 0x2AFA, 0x2E02, 0x2E03, 0x2E04, 0x2E05, + 0x2E09, 0x2E0A, 0x2E0C, 0x2E0D, 0x2E1C, 0x2E1D, 0x3008, 0x3009, + 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, + 0x3014, 0x3015, 0x3016, 0x3017, 0x3018, 0x3019, 0x301A, 0x301B, + 0xFF08, 0xFF09, 0xFF1C, 0xFF1E, 0xFF3B, 0xFF3D, 0xFF5B, 0xFF5D, + 0xFF5F, 0xFF60, 0xFF62, 0xFF63 +}; + +const LEUnicode32 DefaultCharMapper::srahCderorrim[] = { + 0x0029, 0x0028, 0x003E, 0x003C, 0x005D, 0x005B, 0x007D, 0x007B, + 0x00BB, 0x00AB, 0x203A, 0x2039, 0x2046, 0x2045, 0x207E, 0x207D, + 0x208E, 0x208D, 0x220B, 0x220C, 0x220D, 0x2208, 0x2209, 0x220A, + 0x29F5, 0x223D, 0x223C, 0x22CD, 0x2253, 0x2252, 0x2255, 0x2254, + 0x2265, 0x2264, 0x2267, 0x2266, 0x2269, 0x2268, 0x226B, 0x226A, + 0x226F, 0x226E, 0x2271, 0x2270, 0x2273, 0x2272, 0x2275, 0x2274, + 0x2277, 0x2276, 0x2279, 0x2278, 0x227B, 0x227A, 0x227D, 0x227C, + 0x227F, 0x227E, 0x2281, 0x2280, 0x2283, 0x2282, 0x2285, 0x2284, + 0x2287, 0x2286, 0x2289, 0x2288, 0x228B, 0x228A, 0x2290, 0x228F, + 0x2292, 0x2291, 0x29B8, 0x22A3, 0x22A2, 0x2ADE, 0x2AE4, 0x2AE3, + 0x2AE5, 0x22B1, 0x22B0, 0x22B3, 0x22B2, 0x22B5, 0x22B4, 0x22B7, + 0x22B6, 0x22CA, 0x22C9, 0x22CC, 0x22CB, 0x2243, 0x22D1, 0x22D0, + 0x22D7, 0x22D6, 0x22D9, 0x22D8, 0x22DB, 0x22DA, 0x22DD, 0x22DC, + 0x22DF, 0x22DE, 0x22E1, 0x22E0, 0x22E3, 0x22E2, 0x22E5, 0x22E4, + 0x22E7, 0x22E6, 0x22E9, 0x22E8, 0x22EB, 0x22EA, 0x22ED, 0x22EC, + 0x22F1, 0x22F0, 0x22FA, 0x22FB, 0x22FC, 0x22FD, 0x22FE, 0x22F2, + 0x22F3, 0x22F4, 0x22F6, 0x22F7, 0x2309, 0x2308, 0x230B, 0x230A, + 0x232A, 0x2329, 0x2769, 0x2768, 0x276B, 0x276A, 0x276D, 0x276C, + 0x276F, 0x276E, 0x2771, 0x2770, 0x2773, 0x2772, 0x2775, 0x2774, + 0x27C4, 0x27C3, 0x27C6, 0x27C5, 0x27D6, 0x27D5, 0x27DE, 0x27DD, + 0x27E3, 0x27E2, 0x27E5, 0x27E4, 0x27E7, 0x27E6, 0x27E9, 0x27E8, + 0x27EB, 0x27EA, 0x2984, 0x2983, 0x2986, 0x2985, 0x2988, 0x2987, + 0x298A, 0x2989, 0x298C, 0x298B, 0x2990, 0x298F, 0x298E, 0x298D, + 0x2992, 0x2991, 0x2994, 0x2993, 0x2996, 0x2995, 0x2998, 0x2997, + 0x2298, 0x29C1, 0x29C0, 0x29C5, 0x29C4, 0x29D0, 0x29CF, 0x29D2, + 0x29D1, 0x29D5, 0x29D4, 0x29D9, 0x29D8, 0x29DB, 0x29DA, 0x2215, + 0x29F9, 0x29F8, 0x29FD, 0x29FC, 0x2A2C, 0x2A2B, 0x2A2E, 0x2A2D, + 0x2A35, 0x2A34, 0x2A3D, 0x2A3C, 0x2A65, 0x2A64, 0x2A7A, 0x2A79, + 0x2A7E, 0x2A7D, 0x2A80, 0x2A7F, 0x2A82, 0x2A81, 0x2A84, 0x2A83, + 0x2A8C, 0x2A8B, 0x2A92, 0x2A91, 0x2A94, 0x2A93, 0x2A96, 0x2A95, + 0x2A98, 0x2A97, 0x2A9A, 0x2A99, 0x2A9C, 0x2A9B, 0x2AA2, 0x2AA1, + 0x2AA7, 0x2AA6, 0x2AA9, 0x2AA8, 0x2AAB, 0x2AAA, 0x2AAD, 0x2AAC, + 0x2AB0, 0x2AAF, 0x2AB4, 0x2AB3, 0x2ABC, 0x2ABB, 0x2ABE, 0x2ABD, + 0x2AC0, 0x2ABF, 0x2AC2, 0x2AC1, 0x2AC4, 0x2AC3, 0x2AC6, 0x2AC5, + 0x2ACE, 0x2ACD, 0x2AD0, 0x2ACF, 0x2AD2, 0x2AD1, 0x2AD4, 0x2AD3, + 0x2AD6, 0x2AD5, 0x22A6, 0x22A9, 0x22A8, 0x22AB, 0x2AED, 0x2AEC, + 0x2AF8, 0x2AF7, 0x2AFA, 0x2AF9, 0x2E03, 0x2E02, 0x2E05, 0x2E04, + 0x2E0A, 0x2E09, 0x2E0D, 0x2E0C, 0x2E1D, 0x2E1C, 0x3009, 0x3008, + 0x300B, 0x300A, 0x300D, 0x300C, 0x300F, 0x300E, 0x3011, 0x3010, + 0x3015, 0x3014, 0x3017, 0x3016, 0x3019, 0x3018, 0x301B, 0x301A, + 0xFF09, 0xFF08, 0xFF1E, 0xFF1C, 0xFF3D, 0xFF3B, 0xFF5D, 0xFF5B, + 0xFF60, 0xFF5F, 0xFF63, 0xFF62 +}; + +const le_int32 DefaultCharMapper::mirroredCharsCount = 332; + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/MorphStateTables.h b/Build/source/libs/icu/icu-50.1/layout/MorphStateTables.h new file mode 100644 index 00000000000..a2e0b00b7fc --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MorphStateTables.h @@ -0,0 +1,28 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __MORPHSTATETABLES_H +#define __MORPHSTATETABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LayoutTables.h" +#include "MorphTables.h" +#include "StateTables.h" + +U_NAMESPACE_BEGIN + +struct MorphStateTableHeader : MorphSubtableHeader +{ + StateTableHeader stHeader; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/MorphTables.cpp b/Build/source/libs/icu/icu-50.1/layout/MorphTables.cpp new file mode 100644 index 00000000000..9272cc3af3b --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MorphTables.cpp @@ -0,0 +1,96 @@ +/* + * %W% %W% + * + * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved + * + */ + + +#include "LETypes.h" +#include "LayoutTables.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "IndicRearrangementProcessor.h" +#include "ContextualGlyphSubstProc.h" +#include "LigatureSubstProc.h" +#include "NonContextualGlyphSubstProc.h" +//#include "ContextualGlyphInsertionProcessor.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +void MorphTableHeader::process(LEGlyphStorage &glyphStorage) const +{ + const ChainHeader *chainHeader = chains; + le_uint32 chainCount = SWAPL(this->nChains); + le_uint32 chain; + + for (chain = 0; chain < chainCount; chain += 1) { + FeatureFlags defaultFlags = SWAPL(chainHeader->defaultFlags); + le_uint32 chainLength = SWAPL(chainHeader->chainLength); + le_int16 nFeatureEntries = SWAPW(chainHeader->nFeatureEntries); + le_int16 nSubtables = SWAPW(chainHeader->nSubtables); + const MorphSubtableHeader *subtableHeader = + (const MorphSubtableHeader *)&chainHeader->featureTable[nFeatureEntries]; + le_int16 subtable; + + for (subtable = 0; subtable < nSubtables; subtable += 1) { + le_int16 length = SWAPW(subtableHeader->length); + SubtableCoverage coverage = SWAPW(subtableHeader->coverage); + FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures); + + // should check coverage more carefully... + if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0) { + subtableHeader->process(glyphStorage); + } + + subtableHeader = (const MorphSubtableHeader *) ((char *)subtableHeader + length); + } + + chainHeader = (const ChainHeader *)((char *)chainHeader + chainLength); + } +} + +void MorphSubtableHeader::process(LEGlyphStorage &glyphStorage) const +{ + SubtableProcessor *processor = NULL; + + switch (SWAPW(coverage) & scfTypeMask) + { + case mstIndicRearrangement: + processor = new IndicRearrangementProcessor(this); + break; + + case mstContextualGlyphSubstitution: + processor = new ContextualGlyphSubstitutionProcessor(this); + break; + + case mstLigatureSubstitution: + processor = new LigatureSubstitutionProcessor(this); + break; + + case mstReservedUnused: + break; + + case mstNonContextualGlyphSubstitution: + processor = NonContextualGlyphSubstitutionProcessor::createInstance(this); + break; + + /* + case mstContextualGlyphInsertion: + processor = new ContextualGlyphInsertionProcessor(this); + break; + */ + + default: + break; + } + + if (processor != NULL) { + processor->process(glyphStorage); + delete processor; + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/MorphTables.h b/Build/source/libs/icu/icu-50.1/layout/MorphTables.h new file mode 100644 index 00000000000..8d198cf41fe --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MorphTables.h @@ -0,0 +1,85 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __MORPHTABLES_H +#define __MORPHTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LayoutTables.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +typedef le_uint32 FeatureFlags; + +typedef le_int16 FeatureType; +typedef le_int16 FeatureSetting; + +struct FeatureTableEntry +{ + FeatureType featureType; + FeatureSetting featureSetting; + FeatureFlags enableFlags; + FeatureFlags disableFlags; +}; + +struct ChainHeader +{ + FeatureFlags defaultFlags; + le_uint32 chainLength; + le_int16 nFeatureEntries; + le_int16 nSubtables; + FeatureTableEntry featureTable[ANY_NUMBER]; +}; + +struct MorphTableHeader +{ + le_int32 version; + le_uint32 nChains; + ChainHeader chains[ANY_NUMBER]; + + void process(LEGlyphStorage &glyphStorage) const; +}; + +typedef le_int16 SubtableCoverage; + +enum SubtableCoverageFlags +{ + scfVertical = 0x8000, + scfReverse = 0x4000, + scfIgnoreVt = 0x2000, + scfReserved = 0x1FF8, + scfTypeMask = 0x0007 +}; + +enum MorphSubtableType +{ + mstIndicRearrangement = 0, + mstContextualGlyphSubstitution = 1, + mstLigatureSubstitution = 2, + mstReservedUnused = 3, + mstNonContextualGlyphSubstitution = 4, + mstContextualGlyphInsertion = 5 +}; + +struct MorphSubtableHeader +{ + le_int16 length; + SubtableCoverage coverage; + FeatureFlags subtableFeatures; + + void process(LEGlyphStorage &glyphStorage) const; +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/MultipleSubstSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/MultipleSubstSubtables.cpp new file mode 100644 index 00000000000..f017722f860 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MultipleSubstSubtables.cpp @@ -0,0 +1,95 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "MultipleSubstSubtables.h" +#include "GlyphIterator.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_uint32 MultipleSubstitutionSubtable::process(GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter) const +{ + if (LE_FAILURE(success)) { + return 0; + } + + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + + // If there's a filter, we only want to do the + // substitution if the *input* glyphs doesn't + // exist. + // + // FIXME: is this always the right thing to do? + // FIXME: should this only be done for a non-zero + // glyphCount? + if (filter != NULL && filter->accept(glyph)) { + return 0; + } + + le_int32 coverageIndex = getGlyphCoverage(glyph); + le_uint16 seqCount = SWAPW(sequenceCount); + + if (coverageIndex >= 0 && coverageIndex < seqCount) { + Offset sequenceTableOffset = SWAPW(sequenceTableOffsetArray[coverageIndex]); + const SequenceTable *sequenceTable = (const SequenceTable *) ((char *) this + sequenceTableOffset); + le_uint16 glyphCount = SWAPW(sequenceTable->glyphCount); + + if (glyphCount == 0) { + glyphIterator->setCurrGlyphID(0xFFFF); + return 1; + } else if (glyphCount == 1) { + TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[0]); + + if (filter != NULL && ! filter->accept(LE_SET_GLYPH(glyph, substitute))) { + return 0; + } + + glyphIterator->setCurrGlyphID(substitute); + return 1; + } else { + // If there's a filter, make sure all of the output glyphs + // exist. + if (filter != NULL) { + for (le_int32 i = 0; i < glyphCount; i += 1) { + TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[i]); + + if (! filter->accept(substitute)) { + return 0; + } + } + } + + LEGlyphID *newGlyphs = glyphIterator->insertGlyphs(glyphCount, success); + if (LE_FAILURE(success)) { + return 0; + } + + le_int32 insert = 0, direction = 1; + + if (glyphIterator->isRightToLeft()) { + insert = glyphCount - 1; + direction = -1; + } + + for (le_int32 i = 0; i < glyphCount; i += 1) { + TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[i]); + + newGlyphs[insert] = LE_SET_GLYPH(glyph, substitute); + insert += direction; + } + + return 1; + } + } + + return 0; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/MultipleSubstSubtables.h b/Build/source/libs/icu/icu-50.1/layout/MultipleSubstSubtables.h new file mode 100644 index 00000000000..1d6c978ad1e --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/MultipleSubstSubtables.h @@ -0,0 +1,38 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#ifndef __MULTIPLESUBSTITUTIONSUBTABLES_H +#define __MULTIPLESUBSTITUTIONSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +struct SequenceTable +{ + le_uint16 glyphCount; + TTGlyphID substituteArray[ANY_NUMBER]; +}; + +struct MultipleSubstitutionSubtable : GlyphSubstitutionSubtable +{ + le_uint16 sequenceCount; + Offset sequenceTableOffsetArray[ANY_NUMBER]; + + le_uint32 process(GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter = NULL) const; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/NonContextualGlyphSubst.h b/Build/source/libs/icu/icu-50.1/layout/NonContextualGlyphSubst.h new file mode 100644 index 00000000000..ef2543a1a87 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/NonContextualGlyphSubst.h @@ -0,0 +1,30 @@ +/* + * %W% %E% + * + * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved + * + */ + +#ifndef __NONCONTEXTUALGLYPHSUBSTITUTION_H +#define __NONCONTEXTUALGLYPHSUBSTITUTION_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LayoutTables.h" +#include "LookupTables.h" +#include "MorphTables.h" + +U_NAMESPACE_BEGIN + +struct NonContextualGlyphSubstitutionHeader : MorphSubtableHeader +{ + LookupTable table; +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/NonContextualGlyphSubstProc.cpp b/Build/source/libs/icu/icu-50.1/layout/NonContextualGlyphSubstProc.cpp new file mode 100644 index 00000000000..69c065b4848 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/NonContextualGlyphSubstProc.cpp @@ -0,0 +1,60 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" +#include "NonContextualGlyphSubstProc.h" +#include "SimpleArrayProcessor.h" +#include "SegmentSingleProcessor.h" +#include "SegmentArrayProcessor.h" +#include "SingleTableProcessor.h" +#include "TrimmedArrayProcessor.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor() +{ +} + +NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) + : SubtableProcessor(morphSubtableHeader) +{ +} + +NonContextualGlyphSubstitutionProcessor::~NonContextualGlyphSubstitutionProcessor() +{ +} + +SubtableProcessor *NonContextualGlyphSubstitutionProcessor::createInstance(const MorphSubtableHeader *morphSubtableHeader) +{ + const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader; + + switch (SWAPW(header->table.format)) + { + case ltfSimpleArray: + return new SimpleArrayProcessor(morphSubtableHeader); + + case ltfSegmentSingle: + return new SegmentSingleProcessor(morphSubtableHeader); + + case ltfSegmentArray: + return new SegmentArrayProcessor(morphSubtableHeader); + + case ltfSingleTable: + return new SingleTableProcessor(morphSubtableHeader); + + case ltfTrimmedArray: + return new TrimmedArrayProcessor(morphSubtableHeader); + + default: + return NULL; + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/NonContextualGlyphSubstProc.h b/Build/source/libs/icu/icu-50.1/layout/NonContextualGlyphSubstProc.h new file mode 100644 index 00000000000..4ce96cf3981 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/NonContextualGlyphSubstProc.h @@ -0,0 +1,43 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __NONCONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H +#define __NONCONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class NonContextualGlyphSubstitutionProcessor : public SubtableProcessor +{ +public: + virtual void process(LEGlyphStorage &glyphStorage) = 0; + + static SubtableProcessor *createInstance(const MorphSubtableHeader *morphSubtableHeader); + +protected: + NonContextualGlyphSubstitutionProcessor(); + NonContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader); + + virtual ~NonContextualGlyphSubstitutionProcessor(); + +private: + NonContextualGlyphSubstitutionProcessor(const NonContextualGlyphSubstitutionProcessor &other); // forbid copying of this class + NonContextualGlyphSubstitutionProcessor &operator=(const NonContextualGlyphSubstitutionProcessor &other); // forbid copying of this class +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/OpenTypeLayoutEngine.cpp b/Build/source/libs/icu/icu-50.1/layout/OpenTypeLayoutEngine.cpp new file mode 100644 index 00000000000..e41d5a526d3 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/OpenTypeLayoutEngine.cpp @@ -0,0 +1,452 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2012 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEScripts.h" +#include "LELanguages.h" + +#include "LayoutEngine.h" +#include "CanonShaping.h" +#include "OpenTypeLayoutEngine.h" +#include "ScriptAndLanguageTags.h" +#include "CharSubstitutionFilter.h" + +#include "GlyphSubstitutionTables.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositioningTables.h" + +#include "LEGlyphStorage.h" +#include "GlyphPositionAdjustments.h" + +#include "GDEFMarkFilter.h" + +#include "KernTable.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(OpenTypeLayoutEngine) + +#define ccmpFeatureTag LE_CCMP_FEATURE_TAG +#define ligaFeatureTag LE_LIGA_FEATURE_TAG +#define cligFeatureTag LE_CLIG_FEATURE_TAG +#define kernFeatureTag LE_KERN_FEATURE_TAG +#define markFeatureTag LE_MARK_FEATURE_TAG +#define mkmkFeatureTag LE_MKMK_FEATURE_TAG +#define loclFeatureTag LE_LOCL_FEATURE_TAG +#define caltFeatureTag LE_CALT_FEATURE_TAG + +// 'dlig' not used at the moment +#define dligFeatureTag 0x646C6967 + +// 'palt' +#define paltFeatureTag 0x70616C74 + +#define ccmpFeatureMask 0x80000000UL +#define ligaFeatureMask 0x40000000UL +#define cligFeatureMask 0x20000000UL +#define kernFeatureMask 0x10000000UL +#define paltFeatureMask 0x08000000UL +#define markFeatureMask 0x04000000UL +#define mkmkFeatureMask 0x02000000UL +#define loclFeatureMask 0x01000000UL +#define caltFeatureMask 0x00800000UL + +#define minimalFeatures (ccmpFeatureMask | markFeatureMask | mkmkFeatureMask | loclFeatureMask | caltFeatureMask) +#define ligaFeatures (ligaFeatureMask | cligFeatureMask | minimalFeatures) +#define kernFeatures (kernFeatureMask | paltFeatureMask | minimalFeatures) +#define kernAndLigaFeatures (ligaFeatures | kernFeatures) + +static const FeatureMap featureMap[] = +{ + {ccmpFeatureTag, ccmpFeatureMask}, + {ligaFeatureTag, ligaFeatureMask}, + {cligFeatureTag, cligFeatureMask}, + {kernFeatureTag, kernFeatureMask}, + {paltFeatureTag, paltFeatureMask}, + {markFeatureTag, markFeatureMask}, + {mkmkFeatureTag, mkmkFeatureMask}, + {loclFeatureTag, loclFeatureMask}, + {caltFeatureTag, caltFeatureMask} +}; + +static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); + +OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) + : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureMask(minimalFeatures), + fFeatureMap(featureMap), fFeatureParamList(NULL), fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE), + fGSUBTable(gsubTable), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL) +{ + static const le_uint32 gdefTableTag = LE_GDEF_TABLE_TAG; + static const le_uint32 gposTableTag = LE_GPOS_TABLE_TAG; + const GlyphPositioningTableHeader *gposTable = (const GlyphPositioningTableHeader *) getFontTable(gposTableTag); + + // todo: switch to more flags and bitfield rather than list of feature tags? + switch (typoFlags & ~0x80000000L) { + case 0: break; // default + case 1: fFeatureMask = kernFeatures; break; + case 2: fFeatureMask = ligaFeatures; break; + case 3: fFeatureMask = kernAndLigaFeatures; break; + default: break; + } + + if (typoFlags & 0x80000000L) { + fSubstitutionFilter = new CharSubstitutionFilter(fontInstance); + } + + setScriptAndLanguageTags(); + + fGDEFTable = (const GlyphDefinitionTableHeader *) getFontTable(gdefTableTag); + +// JK patch, 2008-05-30 - see Sinhala bug report and LKLUG font +// if (gposTable != NULL && gposTable->coversScriptAndLanguage(fScriptTag, fLangSysTag)) { + if (gposTable != NULL && gposTable->coversScript(fScriptTag)) { + fGPOSTable = gposTable; + } +} + +void OpenTypeLayoutEngine::reset() +{ + // NOTE: if we're called from + // the destructor, LayoutEngine;:reset() + // will have been called already by + // LayoutEngine::~LayoutEngine() + LayoutEngine::reset(); +} + +OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success) + : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureOrder(FALSE), + fGSUBTable(NULL), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL) +{ + setScriptAndLanguageTags(); +} + +OpenTypeLayoutEngine::~OpenTypeLayoutEngine() +{ + if (fTypoFlags & 0x80000000L) { + delete fSubstitutionFilter; + } + + reset(); +} + +LETag OpenTypeLayoutEngine::getScriptTag(le_int32 scriptCode) +{ + if (scriptCode < 0 || scriptCode >= scriptCodeCount) { + return 0xFFFFFFFF; + } + return scriptTags[scriptCode]; +} + +LETag OpenTypeLayoutEngine::getV2ScriptTag(le_int32 scriptCode) +{ + switch (scriptCode) { + case bengScriptCode : return bng2ScriptTag; + case devaScriptCode : return dev2ScriptTag; + case gujrScriptCode : return gjr2ScriptTag; + case guruScriptCode : return gur2ScriptTag; + case kndaScriptCode : return knd2ScriptTag; + case mlymScriptCode : return mlm2ScriptTag; + case oryaScriptCode : return ory2ScriptTag; + case tamlScriptCode : return tml2ScriptTag; + case teluScriptCode : return tel2ScriptTag; + default: return nullScriptTag; + } +} + +LETag OpenTypeLayoutEngine::getLangSysTag(le_int32 languageCode) +{ + if (languageCode < 0 || languageCode >= languageCodeCount) { + return 0xFFFFFFFF; + } + + return languageTags[languageCode]; +} + +void OpenTypeLayoutEngine::setScriptAndLanguageTags() +{ + fScriptTag = getScriptTag(fScriptCode); + fScriptTagV2 = getV2ScriptTag(fScriptCode); + fLangSysTag = getLangSysTag(fLanguageCode); +} + +le_int32 OpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + // This is the cheapest way to get mark reordering only for Hebrew. + // We could just do the mark reordering for all scripts, but most + // of them probably don't need it... Another option would be to + // add a HebrewOpenTypeLayoutEngine subclass, but the only thing it + // would need to do is mark reordering, so that seems like overkill. + if (fScriptCode == hebrScriptCode) { + outChars = LE_NEW_ARRAY(LEUnicode, count); + + if (outChars == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + if (LE_FAILURE(success)) { + LE_DELETE_ARRAY(outChars); + return 0; + } + + CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, outChars, glyphStorage); + } + + if (LE_FAILURE(success)) { + return 0; + } + + glyphStorage.allocateGlyphArray(count, rightToLeft, success); + glyphStorage.allocateAuxData(success); + + for (le_int32 i = 0; i < count; i += 1) { + glyphStorage.setAuxData(i, fFeatureMask, (void *) fFeatureParamList, success); + } + + return count; +} + +// Input: characters, tags +// Output: glyphs, char indices +le_int32 OpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphStorage, success); + + if (LE_FAILURE(success)) { + return 0; + } + + if (fGSUBTable != NULL) { + if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) { + count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter, + fFeatureMap, fFeatureMapCount, fFeatureOrder, success); + + } else { + count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, + fFeatureMap, fFeatureMapCount, fFeatureOrder, success); + } + } + + return count; +} +// Input: characters, tags +// Output: glyphs, char indices +le_int32 OpenTypeLayoutEngine::glyphSubstitution(le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if ( count < 0 || max < 0 ) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if (fGSUBTable != NULL) { + if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) { + count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter, + fFeatureMap, fFeatureMapCount, fFeatureOrder, success); + + } else { + count = fGSUBTable->process(glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, + fFeatureMap, fFeatureMapCount, fFeatureOrder, success); + } + } + + return count; +} +le_int32 OpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + glyphStorage.adoptGlyphArray(tempGlyphStorage); + glyphStorage.adoptCharIndicesArray(tempGlyphStorage); + glyphStorage.adoptAuxDataArray(tempGlyphStorage); + glyphStorage.adoptGlyphCount(tempGlyphStorage); + + return glyphStorage.getGlyphCount(); +} + +le_int32 OpenTypeLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + LEUnicode *outChars = NULL; + LEGlyphStorage fakeGlyphStorage; + le_int32 outCharCount, outGlyphCount; + + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, fakeGlyphStorage, success); + + if (LE_FAILURE(success)) { + return 0; + } + + if (outChars != NULL) { + // le_int32 fakeGlyphCount = + glyphProcessing(outChars, 0, outCharCount, outCharCount, rightToLeft, fakeGlyphStorage, success); + LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work... + //adjustGlyphs(outChars, 0, outCharCount, rightToLeft, fakeGlyphs, fakeGlyphCount); + } else { + // le_int32 fakeGlyphCount = + glyphProcessing(chars, offset, count, max, rightToLeft, fakeGlyphStorage, success); + //adjustGlyphs(chars, offset, count, rightToLeft, fakeGlyphs, fakeGlyphCount); + } + + if (LE_FAILURE(success)) { + return 0; + } + + outGlyphCount = glyphPostProcessing(fakeGlyphStorage, glyphStorage, success); + + return outGlyphCount; +} + +// apply GPOS table, if any +void OpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, + LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (chars == NULL || offset < 0 || count < 0) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + le_int32 glyphCount = glyphStorage.getGlyphCount(); + if (glyphCount == 0) { + return; + } + + if (fGPOSTable != NULL) { + GlyphPositionAdjustments *adjustments = new GlyphPositionAdjustments(glyphCount); + le_int32 i; + + if (adjustments == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return; + } + +#if 0 + // Don't need to do this if we allocate + // the adjustments array w/ new... + for (i = 0; i < glyphCount; i += 1) { + adjustments->setXPlacement(i, 0); + adjustments->setYPlacement(i, 0); + + adjustments->setXAdvance(i, 0); + adjustments->setYAdvance(i, 0); + + adjustments->setBaseOffset(i, -1); + } +#endif + + if (fGPOSTable != NULL) { + if (fScriptTagV2 != nullScriptTag && fGPOSTable->coversScriptAndLanguage(fScriptTagV2,fLangSysTag)) { + fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTagV2, fLangSysTag, fGDEFTable, success, fFontInstance, + fFeatureMap, fFeatureMapCount, fFeatureOrder); + + } else { + fGPOSTable->process(glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, fGDEFTable, success, fFontInstance, + fFeatureMap, fFeatureMapCount, fFeatureOrder); + } + } else if ( fTypoFlags & 0x1 ) { + static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG; + KernTable kt(fFontInstance, getFontTable(kernTableTag)); + kt.process(glyphStorage); + } + + float xAdjust = 0, yAdjust = 0; + + for (i = 0; i < glyphCount; i += 1) { + float xAdvance = adjustments->getXAdvance(i); + float yAdvance = adjustments->getYAdvance(i); + float xPlacement = 0; + float yPlacement = 0; + + +#if 0 + // This is where separate kerning adjustments + // should get applied. + xAdjust += xKerning; + yAdjust += yKerning; +#endif + + for (le_int32 base = i; base >= 0; base = adjustments->getBaseOffset(base)) { + xPlacement += adjustments->getXPlacement(base); + yPlacement += adjustments->getYPlacement(base); + } + + xPlacement = fFontInstance->xUnitsToPoints(xPlacement); + yPlacement = fFontInstance->yUnitsToPoints(yPlacement); + glyphStorage.adjustPosition(i, xAdjust + xPlacement, -(yAdjust + yPlacement), success); + + xAdjust += fFontInstance->xUnitsToPoints(xAdvance); + yAdjust += fFontInstance->yUnitsToPoints(yAdvance); + } + + glyphStorage.adjustPosition(glyphCount, xAdjust, -yAdjust, success); + + delete adjustments; + } else { + // if there was no GPOS table, maybe there's non-OpenType kerning we can use + LayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphStorage, success); + } + + LEGlyphID zwnj = fFontInstance->mapCharToGlyph(0x200C); + + if (zwnj != 0x0000) { + for (le_int32 g = 0; g < glyphCount; g += 1) { + LEGlyphID glyph = glyphStorage[g]; + + if (glyph == zwnj) { + glyphStorage[g] = LE_SET_GLYPH(glyph, 0xFFFF); + } + } + } + +#if 0 + // Don't know why this is here... + LE_DELETE_ARRAY(fFeatureTags); + fFeatureTags = NULL; +#endif +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/OpenTypeLayoutEngine.h b/Build/source/libs/icu/icu-50.1/layout/OpenTypeLayoutEngine.h new file mode 100644 index 00000000000..ad9f9312db4 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/OpenTypeLayoutEngine.h @@ -0,0 +1,397 @@ +/* + * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved + * + */ + +#ifndef __OPENTYPELAYOUTENGINE_H +#define __OPENTYPELAYOUTENGINE_H + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "LEFontInstance.h" +#include "LayoutEngine.h" + +#include "GlyphSubstitutionTables.h" +#include "GlyphDefinitionTables.h" +#include "GlyphPositioningTables.h" + +U_NAMESPACE_BEGIN + +/** + * OpenTypeLayoutEngine implements complex text layout for OpenType fonts - that is + * fonts which have GSUB and GPOS tables associated with them. In order to do this, + * the glyph processsing step described for LayoutEngine is further broken into three + * steps: + * + * 1) Character processing - this step analyses the characters and assigns a list of OpenType + * feature tags to each one. It may also change, remove or add characters, and change + * their order. + * + * 2) Glyph processing - This step performs character to glyph mapping,and uses the GSUB + * table associated with the font to perform glyph substitutions, such as ligature substitution. + * + * 3) Glyph post processing - in cases where the font doesn't directly contain a GSUB table, + * the previous two steps may have generated "fake" glyph indices to use with a "canned" GSUB + * table. This step turns those glyph indices into actual font-specific glyph indices, and may + * perform any other adjustments requried by the previous steps. + * + * OpenTypeLayoutEngine will also use the font's GPOS table to apply position adjustments + * such as kerning and accent positioning. + * + * @see LayoutEngine + * + * @internal + */ +class U_LAYOUT_API OpenTypeLayoutEngine : public LayoutEngine +{ +public: + /** + * This is the main constructor. It constructs an instance of OpenTypeLayoutEngine for + * a particular font, script and language. It takes the GSUB table as a parameter since + * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an + * OpenType font. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param gsubTable - the GSUB table + * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ + OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known + * until after this constructor has been invoked. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param success - set to an error code if the operation fails + * + * @internal + */ + OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. + * + * @internal + */ + virtual ~OpenTypeLayoutEngine(); + + /** + * A convenience method used to convert the script code into + * the four byte script tag required by OpenType. + * For Indic languages where multiple script tags exist, + * the version 1 (old style) tag is returned. + * + * @param scriptCode - the script code + * + * @return the four byte script tag + * + * @internal + */ + static LETag getScriptTag(le_int32 scriptCode); + /** + * A convenience method used to convert the script code into + * the four byte script tag required by OpenType. + * For Indic languages where multiple script tags exist, + * the version 2 tag is returned. + * + * @param scriptCode - the script code + * + * @return the four byte script tag + * + * @internal + */ + static LETag getV2ScriptTag(le_int32 scriptCode); + + /** + * A convenience method used to convert the langauge code into + * the four byte langauge tag required by OpenType. + * + * @param languageCode - the language code + * + * @return the four byte language tag + * + * @internal + */ + static LETag getLangSysTag(le_int32 languageCode); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + + /** + * The array of language tags, indexed by language code. + * + * @internal + */ + static const LETag languageTags[]; + +private: + + /** + * This method is used by the constructors to convert the script + * and language codes to four byte tags and save them. + */ + void setScriptAndLanguageTags(); + + /** + * The array of script tags, indexed by script code. + */ + static const LETag scriptTags[]; + +protected: + /** + * A set of "default" features. The default characterProcessing method + * will apply all of these features to every glyph. + * + * @internal + */ + FeatureMask fFeatureMask; + + /** + * A set of mappings from feature tags to feature masks. These may + * be in the order in which the featues should be applied, but they + * don't need to be. + * + * @internal + */ + const FeatureMap *fFeatureMap; + + /** + * The length of the feature map. + * + * @internal + */ + le_int32 fFeatureMapCount; + + /** + * <code>TRUE</code> if the features in the + * feature map are in the order in which they + * must be applied. + * + * @internal + */ + le_bool fFeatureOrder; + + /** + * The list of what? FIXME.. + * + * @internal + */ + const le_int32 *fFeatureParamList; + + /** + * The address of the GSUB table. + * + * @internal + */ + const GlyphSubstitutionTableHeader *fGSUBTable; + + /** + * The address of the GDEF table. + * + * @internal + */ + const GlyphDefinitionTableHeader *fGDEFTable; + + /** + * The address of the GPOS table. + * + * @internal + */ + const GlyphPositioningTableHeader *fGPOSTable; + + /** + * An optional filter used to inhibit substitutions + * preformed by the GSUB table. This is used for some + * "canned" GSUB tables to restrict substitutions to + * glyphs that are in the font. + * + * @internal + */ + LEGlyphFilter *fSubstitutionFilter; + + /** + * The four byte script tag. + * + * @internal + */ + LETag fScriptTag; + + /** + * The four byte script tag for V2 fonts. + * + * @internal + */ + LETag fScriptTagV2; + + /** + * The four byte language tag + * + * @internal + */ + LETag fLangSysTag; + + /** + * This method does the OpenType character processing. It assigns the OpenType feature + * tags to the characters, and may generate output characters that differ from the input + * charcters due to insertions, deletions, or reorderings. In such cases, it will also + * generate an output character index array reflecting these changes. + * + * Subclasses must override this method. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - TRUE if the characters are in a right to left directional run + * + * Output parameters: + * @param outChars - the output character array, if different from the input + * @param charIndices - the output character index array + * @param featureTags - the output feature tag array + * @param success - set to an error code if the operation fails + * + * @return the output character count (input character count if no change) + * + * @internal + */ + virtual le_int32 characterProcessing(const LEUnicode /*chars*/[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, + LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method does character to glyph mapping, and applies the GSUB table. The + * default implementation calls mapCharsToGlyphs and then applies the GSUB table, + * if there is one. + * + * Note that in the case of "canned" GSUB tables, the output glyph indices may be + * "fake" glyph indices that need to be converted to "real" glyph indices by the + * glyphPostProcessing method. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - TRUE if the characters are in a right to left directional run + * @param featureTags - the feature tag array + * + * Output parameters: + * @param glyphs - the output glyph index array + * @param charIndices - the output character index array + * @param success - set to an error code if the operation fails + * + * @return the number of glyphs in the output glyph index array + * + * Note: if the character index array was already set by the characterProcessing + * method, this method won't change it. + * + * @internal + */ + virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + + virtual le_int32 glyphSubstitution(le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method does any processing necessary to convert "fake" + * glyph indices used by the glyphProcessing method into "real" glyph + * indices which can be used to render the text. Note that in some + * cases, such as CDAC Indic fonts, several "real" glyphs may be needed + * to render one "fake" glyph. + * + * The default implementation of this method just returns the input glyph + * index and character index arrays, assuming that no "fake" glyph indices + * were needed to do GSUB processing. + * + * Input paramters: + * @param tempGlyphs - the input "fake" glyph index array + * @param tempCharIndices - the input "fake" character index array + * @param tempGlyphCount - the number of "fake" glyph indices + * + * Output parameters: + * @param glyphs - the output glyph index array + * @param charIndices - the output character index array + * @param success - set to an error code if the operation fails + * + * @return the number of glyph indices in the output glyph index array + * + * @internal + */ + virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method applies the characterProcessing, glyphProcessing and glyphPostProcessing + * methods. Most subclasses will not need to override this method. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - TRUE if the text is in a right to left directional run + * + * Output parameters: + * @param glyphs - the glyph index array + * @param charIndices - the character index array + * @param success - set to an error code if the operation fails + * + * @return the number of glyphs in the glyph index array + * + * @see LayoutEngine::computeGlyphs + * + * @internal + */ + virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method uses the GPOS table, if there is one, to adjust the glyph positions. + * + * Input parameters: + * @param glyphs - the input glyph array + * @param glyphCount - the number of glyphs in the glyph array + * @param x - the starting X position + * @param y - the starting Y position + * + * Output parameters: + * @param positions - the output X and Y positions (two entries per glyph) + * @param success - set to an error code if the operation fails + * + * @internal + */ + virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method frees the feature tag array so that the + * OpenTypeLayoutEngine can be reused for different text. + * It is also called from our destructor. + * + * @internal + */ + virtual void reset(); +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/OpenTypeTables.h b/Build/source/libs/icu/icu-50.1/layout/OpenTypeTables.h new file mode 100644 index 00000000000..5398d176e47 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/OpenTypeTables.h @@ -0,0 +1,50 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved + * + */ + +#ifndef __OPENTYPETABLES_H +#define __OPENTYPETABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" + +U_NAMESPACE_BEGIN + +#define ANY_NUMBER 1 + +typedef le_uint16 Offset; +typedef le_uint8 ATag[4]; +typedef le_uint32 fixed32; + +#define LE_GLYPH_GROUP_MASK 0x00000001UL +typedef le_uint32 FeatureMask; + +#define SWAPT(atag) ((LETag) ((atag[0] << 24) + (atag[1] << 16) + (atag[2] << 8) + atag[3])) + +struct TagAndOffsetRecord +{ + ATag tag; + Offset offset; +}; + +struct GlyphRangeRecord +{ + TTGlyphID firstGlyph; + TTGlyphID lastGlyph; + le_int16 rangeValue; +}; + +struct FeatureMap +{ + LETag tag; + FeatureMask mask; +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/OpenTypeUtilities.cpp b/Build/source/libs/icu/icu-50.1/layout/OpenTypeUtilities.cpp new file mode 100644 index 00000000000..29c38ddc104 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/OpenTypeUtilities.cpp @@ -0,0 +1,179 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2006 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "OpenTypeUtilities.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +// +// Finds the high bit by binary searching +// through the bits in n. +// +le_int8 OpenTypeUtilities::highBit(le_int32 value) +{ + if (value <= 0) { + return -32; + } + + le_uint8 bit = 0; + + if (value >= 1 << 16) { + value >>= 16; + bit += 16; + } + + if (value >= 1 << 8) { + value >>= 8; + bit += 8; + } + + if (value >= 1 << 4) { + value >>= 4; + bit += 4; + } + + if (value >= 1 << 2) { + value >>= 2; + bit += 2; + } + + if (value >= 1 << 1) { + value >>= 1; + bit += 1; + } + + return bit; +} + +Offset OpenTypeUtilities::getTagOffset(LETag tag, const TagAndOffsetRecord *records, le_int32 recordCount) +{ + le_uint8 bit = highBit(recordCount); + le_int32 power = 1 << bit; + le_int32 extra = recordCount - power; + le_int32 probe = power; + le_int32 index = 0; + + if (SWAPT(records[extra].tag) <= tag) { + index = extra; + } + + while (probe > (1 << 0)) { + probe >>= 1; + + if (SWAPT(records[index + probe].tag) <= tag) { + index += probe; + } + } + + if (SWAPT(records[index].tag) == tag) { + return SWAPW(records[index].offset); + } + + return 0; +} + +le_int32 OpenTypeUtilities::getGlyphRangeIndex(TTGlyphID glyphID, const GlyphRangeRecord *records, le_int32 recordCount) +{ + le_uint8 bit = highBit(recordCount); + le_int32 power = 1 << bit; + le_int32 extra = recordCount - power; + le_int32 probe = power; + le_int32 range = 0; + + if (recordCount == 0) { + return -1; + } + + if (SWAPW(records[extra].firstGlyph) <= glyphID) { + range = extra; + } + + while (probe > (1 << 0)) { + probe >>= 1; + + if (SWAPW(records[range + probe].firstGlyph) <= glyphID) { + range += probe; + } + } + + if (SWAPW(records[range].firstGlyph) <= glyphID && SWAPW(records[range].lastGlyph) >= glyphID) { + return range; + } + + return -1; +} + +le_int32 OpenTypeUtilities::search(le_uint32 value, const le_uint32 array[], le_int32 count) +{ + le_int32 power = 1 << highBit(count); + le_int32 extra = count - power; + le_int32 probe = power; + le_int32 index = 0; + + if (value >= array[extra]) { + index = extra; + } + + while (probe > (1 << 0)) { + probe >>= 1; + + if (value >= array[index + probe]) { + index += probe; + } + } + + return index; +} + +le_int32 OpenTypeUtilities::search(le_uint16 value, const le_uint16 array[], le_int32 count) +{ + le_int32 power = 1 << highBit(count); + le_int32 extra = count - power; + le_int32 probe = power; + le_int32 index = 0; + + if (value >= array[extra]) { + index = extra; + } + + while (probe > (1 << 0)) { + probe >>= 1; + + if (value >= array[index + probe]) { + index += probe; + } + } + + return index; +} + +// +// Straight insertion sort from Knuth vol. III, pg. 81 +// +void OpenTypeUtilities::sort(le_uint16 *array, le_int32 count) +{ + for (le_int32 j = 1; j < count; j += 1) { + le_int32 i; + le_uint16 v = array[j]; + + for (i = j - 1; i >= 0; i -= 1) { + if (v >= array[i]) { + break; + } + + array[i + 1] = array[i]; + } + + array[i + 1] = v; + } +} + + + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/OpenTypeUtilities.h b/Build/source/libs/icu/icu-50.1/layout/OpenTypeUtilities.h new file mode 100644 index 00000000000..67a07c32a06 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/OpenTypeUtilities.h @@ -0,0 +1,34 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __OPENTYPEUTILITIES_H +#define __OPENTYPEUTILITIES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +class OpenTypeUtilities /* not : public UObject because all methods are static */ { +public: + static le_int8 highBit(le_int32 value); + static Offset getTagOffset(LETag tag, const TagAndOffsetRecord *records, le_int32 recordCount); + static le_int32 getGlyphRangeIndex(TTGlyphID glyphID, const GlyphRangeRecord *records, le_int32 recordCount); + static le_int32 search(le_uint16 value, const le_uint16 array[], le_int32 count); + static le_int32 search(le_uint32 value, const le_uint32 array[], le_int32 count); + static void sort(le_uint16 *array, le_int32 count); + +private: + OpenTypeUtilities() {} // private - forbid instantiation +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/PairPositioningSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/PairPositioningSubtables.cpp new file mode 100644 index 00000000000..fce69f87cf0 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/PairPositioningSubtables.cpp @@ -0,0 +1,171 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2006 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphPositioningTables.h" +#include "PairPositioningSubtables.h" +#include "ValueRecords.h" +#include "GlyphIterator.h" +#include "OpenTypeUtilities.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_uint32 PairPositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const +{ + switch(SWAPW(subtableFormat)) + { + case 0: + return 0; + + case 1: + { + const PairPositioningFormat1Subtable *subtable = (const PairPositioningFormat1Subtable *) this; + + return subtable->process(glyphIterator, fontInstance); + } + + case 2: + { + const PairPositioningFormat2Subtable *subtable = (const PairPositioningFormat2Subtable *) this; + + return subtable->process(glyphIterator, fontInstance); + } + + default: + return 0; + } +} + +le_uint32 PairPositioningFormat1Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const +{ + LEGlyphID firstGlyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(firstGlyph); + GlyphIterator tempIterator(*glyphIterator); + + if (coverageIndex >= 0 && glyphIterator->next()) { + Offset pairSetTableOffset = SWAPW(pairSetTableOffsetArray[coverageIndex]); + PairSetTable *pairSetTable = (PairSetTable *) ((char *) this + pairSetTableOffset); + le_uint16 pairValueCount = SWAPW(pairSetTable->pairValueCount); + le_int16 valueRecord1Size = ValueRecord::getSize(SWAPW(valueFormat1)); + le_int16 valueRecord2Size = ValueRecord::getSize(SWAPW(valueFormat2)); + le_int16 recordSize = sizeof(PairValueRecord) - sizeof(ValueRecord) + valueRecord1Size + valueRecord2Size; + LEGlyphID secondGlyph = glyphIterator->getCurrGlyphID(); + const PairValueRecord *pairValueRecord = NULL; + + if (pairValueCount != 0) { + pairValueRecord = findPairValueRecord((TTGlyphID) LE_GET_GLYPH(secondGlyph), pairSetTable->pairValueRecordArray, pairValueCount, recordSize); + } + + if (pairValueRecord == NULL) { + return 0; + } + + if (valueFormat1 != 0) { + pairValueRecord->valueRecord1.adjustPosition(SWAPW(valueFormat1), (char *) this, tempIterator, fontInstance); + } + + if (valueFormat2 != 0) { + const ValueRecord *valueRecord2 = (const ValueRecord *) ((char *) &pairValueRecord->valueRecord1 + valueRecord1Size); + + valueRecord2->adjustPosition(SWAPW(valueFormat2), (char *) this, *glyphIterator, fontInstance); + } + + // back up glyphIterator so second glyph can be + // first glyph in the next pair + glyphIterator->prev(); + return 1; + } + + return 0; +} + +le_uint32 PairPositioningFormat2Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const +{ + LEGlyphID firstGlyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(firstGlyph); + GlyphIterator tempIterator(*glyphIterator); + + if (coverageIndex >= 0 && glyphIterator->next()) { + LEGlyphID secondGlyph = glyphIterator->getCurrGlyphID(); + const ClassDefinitionTable *classDef1 = (const ClassDefinitionTable *) ((char *) this + SWAPW(classDef1Offset)); + const ClassDefinitionTable *classDef2 = (const ClassDefinitionTable *) ((char *) this + SWAPW(classDef2Offset)); + le_int32 class1 = classDef1->getGlyphClass(firstGlyph); + le_int32 class2 = classDef2->getGlyphClass(secondGlyph); + le_int16 valueRecord1Size = ValueRecord::getSize(SWAPW(valueFormat1)); + le_int16 valueRecord2Size = ValueRecord::getSize(SWAPW(valueFormat2)); + le_int16 class2RecordSize = valueRecord1Size + valueRecord2Size; + le_int16 class1RecordSize = class2RecordSize * SWAPW(class2Count); + const Class1Record *class1Record = (const Class1Record *) ((char *) class1RecordArray + (class1RecordSize * class1)); + const Class2Record *class2Record = (const Class2Record *) ((char *) class1Record->class2RecordArray + (class2RecordSize * class2)); + + + if (valueFormat1 != 0) { + class2Record->valueRecord1.adjustPosition(SWAPW(valueFormat1), (char *) this, tempIterator, fontInstance); + } + + if (valueFormat2 != 0) { + const ValueRecord *valueRecord2 = (const ValueRecord *) ((char *) &class2Record->valueRecord1 + valueRecord1Size); + + valueRecord2->adjustPosition(SWAPW(valueFormat2), (const char *) this, *glyphIterator, fontInstance); + } + + // back up glyphIterator so second glyph can be + // first glyph in the next pair + glyphIterator->prev(); + return 1; + } + + return 0; +} + +const PairValueRecord *PairPositioningFormat1Subtable::findPairValueRecord(TTGlyphID glyphID, const PairValueRecord *records, le_uint16 recordCount, le_uint16 recordSize) const +{ +#if 1 + // The OpenType spec. says that the ValueRecord table is + // sorted by secondGlyph. Unfortunately, there are fonts + // around that have an unsorted ValueRecord table. + const PairValueRecord *record = records; + + for(le_int32 r = 0; r < recordCount; r += 1) { + if (SWAPW(record->secondGlyph) == glyphID) { + return record; + } + + record = (const PairValueRecord *) ((char *) record + recordSize); + } +#else + le_uint8 bit = OpenTypeUtilities::highBit(recordCount); + le_uint16 power = 1 << bit; + le_uint16 extra = (recordCount - power) * recordSize; + le_uint16 probe = power * recordSize; + const PairValueRecord *record = records; + const PairValueRecord *trial = (const PairValueRecord *) ((char *) record + extra); + + if (SWAPW(trial->secondGlyph) <= glyphID) { + record = trial; + } + + while (probe > recordSize) { + probe >>= 1; + trial = (const PairValueRecord *) ((char *) record + probe); + + if (SWAPW(trial->secondGlyph) <= glyphID) { + record = trial; + } + } + + if (SWAPW(record->secondGlyph) == glyphID) { + return record; + } +#endif + + return NULL; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/PairPositioningSubtables.h b/Build/source/libs/icu/icu-50.1/layout/PairPositioningSubtables.h new file mode 100644 index 00000000000..f017c33f65b --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/PairPositioningSubtables.h @@ -0,0 +1,84 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __PAIRPOSITIONINGSUBTABLES_H +#define __PAIRPOSITIONINGSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphPositioningTables.h" +#include "ValueRecords.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +// NOTE: ValueRecord has a variable size +struct PairValueRecord +{ + TTGlyphID secondGlyph; + ValueRecord valueRecord1; +// ValueRecord valueRecord2; +}; + +struct PairSetTable +{ + le_uint16 pairValueCount; + PairValueRecord pairValueRecordArray[ANY_NUMBER]; +}; + +struct PairPositioningSubtable : GlyphPositioningSubtable +{ + ValueFormat valueFormat1; + ValueFormat valueFormat2; + + le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; +}; + +struct PairPositioningFormat1Subtable : PairPositioningSubtable +{ + le_uint16 pairSetCount; + Offset pairSetTableOffsetArray[ANY_NUMBER]; + + le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; + +private: + const PairValueRecord *findPairValueRecord(TTGlyphID glyphID, const PairValueRecord *records, + le_uint16 recordCount, le_uint16 recordSize) const; +}; + +// NOTE: ValueRecord has a variable size +struct Class2Record +{ + ValueRecord valueRecord1; +// ValueRecord valurRecord2; +}; + +struct Class1Record +{ + Class2Record class2RecordArray[ANY_NUMBER]; +}; + +struct PairPositioningFormat2Subtable : PairPositioningSubtable +{ + Offset classDef1Offset; + Offset classDef2Offset; + le_uint16 class1Count; + le_uint16 class2Count; + Class1Record class1RecordArray[ANY_NUMBER]; + + le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; +}; + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguage.cpp b/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguage.cpp new file mode 100644 index 00000000000..126f5f2f078 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguage.cpp @@ -0,0 +1,84 @@ +/* + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "OpenTypeUtilities.h" +#include "ScriptAndLanguage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +const LangSysTable *ScriptTable::findLanguage(LETag languageTag, le_bool exactMatch) const +{ + le_uint16 count = SWAPW(langSysCount); + Offset langSysTableOffset = exactMatch? 0 : SWAPW(defaultLangSysTableOffset); + + if (count > 0) { + Offset foundOffset = + OpenTypeUtilities::getTagOffset(languageTag, langSysRecordArray, count); + + if (foundOffset != 0) { + langSysTableOffset = foundOffset; + } + } + + if (langSysTableOffset != 0) { + return (const LangSysTable *) ((char *)this + langSysTableOffset); + } + + return NULL; +} + +const ScriptTable *ScriptListTable::findScript(LETag scriptTag) const +{ + /* + * There are some fonts that have a large, bogus value for scriptCount. To try + * and protect against this, we use the offset in the first scriptRecord, + * which we know has to be past the end of the scriptRecordArray, to compute + * a value which is greater than or equal to the actual script count. + * + * Note: normally, the first offset will point to just after the scriptRecordArray, + * but there's no guarantee of this, only that it's *after* the scriptRecordArray. + * Because of this, a binary serach isn't safe, because the new count may include + * data that's not actually in the scriptRecordArray and hence the array will appear + * to be unsorted. + */ + le_uint16 count = SWAPW(scriptCount); + le_uint16 limit = ((SWAPW(scriptRecordArray[0].offset) - sizeof(ScriptListTable)) / sizeof(scriptRecordArray)) + ANY_NUMBER; + Offset scriptTableOffset = 0; + + if (count > limit) { + // the scriptCount value is bogus; do a linear search + // because limit may still be too large. + for(le_int32 s = 0; s < limit; s += 1) { + if (SWAPT(scriptRecordArray[s].tag) == scriptTag) { + scriptTableOffset = SWAPW(scriptRecordArray[s].offset); + break; + } + } + } else { + scriptTableOffset = OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArray, count); + } + + if (scriptTableOffset != 0) { + return (const ScriptTable *) ((char *)this + scriptTableOffset); + } + + return NULL; +} + +const LangSysTable *ScriptListTable::findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch) const +{ + const ScriptTable *scriptTable = findScript(scriptTag); + + if (scriptTable == 0) { + return NULL; + } + + return scriptTable->findLanguage(languageTag, exactMatch); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguage.h b/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguage.h new file mode 100644 index 00000000000..804dae9665e --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguage.h @@ -0,0 +1,52 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __SCRIPTANDLANGUAGE_H +#define __SCRIPTANDLANGUAGE_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +typedef TagAndOffsetRecord LangSysRecord; + +struct LangSysTable +{ + Offset lookupOrderOffset; + le_uint16 reqFeatureIndex; + le_uint16 featureCount; + le_uint16 featureIndexArray[ANY_NUMBER]; +}; + +struct ScriptTable +{ + Offset defaultLangSysTableOffset; + le_uint16 langSysCount; + LangSysRecord langSysRecordArray[ANY_NUMBER]; + + const LangSysTable *findLanguage(LETag languageTag, le_bool exactMatch = FALSE) const; +}; + +typedef TagAndOffsetRecord ScriptRecord; + +struct ScriptListTable +{ + le_uint16 scriptCount; + ScriptRecord scriptRecordArray[ANY_NUMBER]; + + const ScriptTable *findScript(LETag scriptTag) const; + const LangSysTable *findLanguage(LETag scriptTag, LETag languageTag, le_bool exactMatch = FALSE) const; +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguageTags.cpp b/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguageTags.cpp new file mode 100644 index 00000000000..335912a7322 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguageTags.cpp @@ -0,0 +1,253 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2011. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. + * + * Generated on: 11/01/2011 04:08:11 PM PDT + */ + +#include "LETypes.h" +#include "ScriptAndLanguageTags.h" +#include "OpenTypeLayoutEngine.h" + +U_NAMESPACE_BEGIN + +const LETag OpenTypeLayoutEngine::scriptTags[] = { + zyyyScriptTag, /* 'zyyy' (COMMON) */ + zinhScriptTag, /* 'zinh' (INHERITED) */ + arabScriptTag, /* 'arab' (ARABIC) */ + armnScriptTag, /* 'armn' (ARMENIAN) */ + bengScriptTag, /* 'beng' (BENGALI) */ + bopoScriptTag, /* 'bopo' (BOPOMOFO) */ + cherScriptTag, /* 'cher' (CHEROKEE) */ + coptScriptTag, /* 'copt' (COPTIC) */ + cyrlScriptTag, /* 'cyrl' (CYRILLIC) */ + dsrtScriptTag, /* 'dsrt' (DESERET) */ + devaScriptTag, /* 'deva' (DEVANAGARI) */ + ethiScriptTag, /* 'ethi' (ETHIOPIC) */ + georScriptTag, /* 'geor' (GEORGIAN) */ + gothScriptTag, /* 'goth' (GOTHIC) */ + grekScriptTag, /* 'grek' (GREEK) */ + gujrScriptTag, /* 'gujr' (GUJARATI) */ + guruScriptTag, /* 'guru' (GURMUKHI) */ + haniScriptTag, /* 'hani' (HAN) */ + hangScriptTag, /* 'hang' (HANGUL) */ + hebrScriptTag, /* 'hebr' (HEBREW) */ + hiraScriptTag, /* 'hira' (HIRAGANA) */ + kndaScriptTag, /* 'knda' (KANNADA) */ + kanaScriptTag, /* 'kana' (KATAKANA) */ + khmrScriptTag, /* 'khmr' (KHMER) */ + laooScriptTag, /* 'lao ' (LAO) */ + latnScriptTag, /* 'latn' (LATIN) */ + mlymScriptTag, /* 'mlym' (MALAYALAM) */ + mongScriptTag, /* 'mong' (MONGOLIAN) */ + mymrScriptTag, /* 'mymr' (MYANMAR) */ + ogamScriptTag, /* 'ogam' (OGHAM) */ + italScriptTag, /* 'ital' (OLD_ITALIC) */ + oryaScriptTag, /* 'orya' (ORIYA) */ + runrScriptTag, /* 'runr' (RUNIC) */ + sinhScriptTag, /* 'sinh' (SINHALA) */ + syrcScriptTag, /* 'syrc' (SYRIAC) */ + tamlScriptTag, /* 'taml' (TAMIL) */ + teluScriptTag, /* 'telu' (TELUGU) */ + thaaScriptTag, /* 'thaa' (THAANA) */ + thaiScriptTag, /* 'thai' (THAI) */ + tibtScriptTag, /* 'tibt' (TIBETAN) */ + cansScriptTag, /* 'cans' (CANADIAN_ABORIGINAL) */ + yiiiScriptTag, /* 'yi ' (YI) */ + tglgScriptTag, /* 'tglg' (TAGALOG) */ + hanoScriptTag, /* 'hano' (HANUNOO) */ + buhdScriptTag, /* 'buhd' (BUHID) */ + tagbScriptTag, /* 'tagb' (TAGBANWA) */ + braiScriptTag, /* 'brai' (BRAILLE) */ + cprtScriptTag, /* 'cprt' (CYPRIOT) */ + limbScriptTag, /* 'limb' (LIMBU) */ + linbScriptTag, /* 'linb' (LINEAR_B) */ + osmaScriptTag, /* 'osma' (OSMANYA) */ + shawScriptTag, /* 'shaw' (SHAVIAN) */ + taleScriptTag, /* 'tale' (TAI_LE) */ + ugarScriptTag, /* 'ugar' (UGARITIC) */ + hrktScriptTag, /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ + bugiScriptTag, /* 'bugi' (BUGINESE) */ + glagScriptTag, /* 'glag' (GLAGOLITIC) */ + kharScriptTag, /* 'khar' (KHAROSHTHI) */ + syloScriptTag, /* 'sylo' (SYLOTI_NAGRI) */ + taluScriptTag, /* 'talu' (NEW_TAI_LUE) */ + tfngScriptTag, /* 'tfng' (TIFINAGH) */ + xpeoScriptTag, /* 'xpeo' (OLD_PERSIAN) */ + baliScriptTag, /* 'bali' (BALINESE) */ + batkScriptTag, /* 'batk' (BATAK) */ + blisScriptTag, /* 'blis' (BLIS) */ + brahScriptTag, /* 'brah' (BRAHMI) */ + chamScriptTag, /* 'cham' (CHAM) */ + cirtScriptTag, /* 'cirt' (CIRT) */ + cyrsScriptTag, /* 'cyrs' (CYRS) */ + egydScriptTag, /* 'egyd' (EGYD) */ + egyhScriptTag, /* 'egyh' (EGYH) */ + egypScriptTag, /* 'egyp' (EGYPTIAN_HIEROGLYPHS) */ + geokScriptTag, /* 'geok' (GEOK) */ + hansScriptTag, /* 'hans' (HANS) */ + hantScriptTag, /* 'hant' (HANT) */ + hmngScriptTag, /* 'hmng' (HMNG) */ + hungScriptTag, /* 'hung' (HUNG) */ + indsScriptTag, /* 'inds' (INDS) */ + javaScriptTag, /* 'java' (JAVANESE) */ + kaliScriptTag, /* 'kali' (KAYAH_LI) */ + latfScriptTag, /* 'latf' (LATF) */ + latgScriptTag, /* 'latg' (LATG) */ + lepcScriptTag, /* 'lepc' (LEPCHA) */ + linaScriptTag, /* 'lina' (LINA) */ + mandScriptTag, /* 'mand' (MANDAIC) */ + mayaScriptTag, /* 'maya' (MAYA) */ + meroScriptTag, /* 'mero' (MEROITIC_HIEROGLYPHS) */ + nkooScriptTag, /* 'nko ' (NKO) */ + orkhScriptTag, /* 'orkh' (OLD_TURKIC) */ + permScriptTag, /* 'perm' (PERM) */ + phagScriptTag, /* 'phag' (PHAGS_PA) */ + phnxScriptTag, /* 'phnx' (PHOENICIAN) */ + plrdScriptTag, /* 'plrd' (MIAO) */ + roroScriptTag, /* 'roro' (RORO) */ + saraScriptTag, /* 'sara' (SARA) */ + syreScriptTag, /* 'syre' (SYRE) */ + syrjScriptTag, /* 'syrj' (SYRJ) */ + syrnScriptTag, /* 'syrn' (SYRN) */ + tengScriptTag, /* 'teng' (TENG) */ + vaiiScriptTag, /* 'vai ' (VAI) */ + vispScriptTag, /* 'visp' (VISP) */ + xsuxScriptTag, /* 'xsux' (CUNEIFORM) */ + zxxxScriptTag, /* 'zxxx' (ZXXX) */ + zzzzScriptTag, /* 'zzzz' (UNKNOWN) */ + cariScriptTag, /* 'cari' (CARIAN) */ + jpanScriptTag, /* 'jpan' (JPAN) */ + lanaScriptTag, /* 'lana' (TAI_THAM) */ + lyciScriptTag, /* 'lyci' (LYCIAN) */ + lydiScriptTag, /* 'lydi' (LYDIAN) */ + olckScriptTag, /* 'olck' (OL_CHIKI) */ + rjngScriptTag, /* 'rjng' (REJANG) */ + saurScriptTag, /* 'saur' (SAURASHTRA) */ + sgnwScriptTag, /* 'sgnw' (SGNW) */ + sundScriptTag, /* 'sund' (SUNDANESE) */ + moonScriptTag, /* 'moon' (MOON) */ + mteiScriptTag, /* 'mtei' (MEETEI_MAYEK) */ + armiScriptTag, /* 'armi' (IMPERIAL_ARAMAIC) */ + avstScriptTag, /* 'avst' (AVESTAN) */ + cakmScriptTag, /* 'cakm' (CHAKMA) */ + koreScriptTag, /* 'kore' (KORE) */ + kthiScriptTag, /* 'kthi' (KAITHI) */ + maniScriptTag, /* 'mani' (MANI) */ + phliScriptTag, /* 'phli' (INSCRIPTIONAL_PAHLAVI) */ + phlpScriptTag, /* 'phlp' (PHLP) */ + phlvScriptTag, /* 'phlv' (PHLV) */ + prtiScriptTag, /* 'prti' (INSCRIPTIONAL_PARTHIAN) */ + samrScriptTag, /* 'samr' (SAMARITAN) */ + tavtScriptTag, /* 'tavt' (TAI_VIET) */ + zmthScriptTag, /* 'zmth' (ZMTH) */ + zsymScriptTag, /* 'zsym' (ZSYM) */ + bamuScriptTag, /* 'bamu' (BAMUM) */ + lisuScriptTag, /* 'lisu' (LISU) */ + nkgbScriptTag, /* 'nkgb' (NKGB) */ + sarbScriptTag, /* 'sarb' (OLD_SOUTH_ARABIAN) */ + bassScriptTag, /* 'bass' (BASS) */ + duplScriptTag, /* 'dupl' (DUPL) */ + elbaScriptTag, /* 'elba' (ELBA) */ + granScriptTag, /* 'gran' (GRAN) */ + kpelScriptTag, /* 'kpel' (KPEL) */ + lomaScriptTag, /* 'loma' (LOMA) */ + mendScriptTag, /* 'mend' (MEND) */ + mercScriptTag, /* 'merc' (MEROITIC_CURSIVE) */ + narbScriptTag, /* 'narb' (NARB) */ + nbatScriptTag, /* 'nbat' (NBAT) */ + palmScriptTag, /* 'palm' (PALM) */ + sindScriptTag, /* 'sind' (SIND) */ + waraScriptTag, /* 'wara' (WARA) */ + afakScriptTag, /* 'afak' (AFAK) */ + jurcScriptTag, /* 'jurc' (JURC) */ + mrooScriptTag, /* 'mroo' (MROO) */ + nshuScriptTag, /* 'nshu' (NSHU) */ + shrdScriptTag, /* 'shrd' (SHARADA) */ + soraScriptTag, /* 'sora' (SORA_SOMPENG) */ + takrScriptTag, /* 'takr' (TAKRI) */ + tangScriptTag, /* 'tang' (TANG) */ + woleScriptTag, /* 'wole' (WOLE) */ + khojScriptTag, /* 'khoj' (KHOJ) */ + tirhScriptTag /* 'tirh' (TIRH) */ +}; + +const LETag OpenTypeLayoutEngine::languageTags[] = { + nullLanguageTag, /* '' (null) */ + araLanguageTag, /* 'ARA' (Arabic) */ + asmLanguageTag, /* 'ASM' (Assamese) */ + benLanguageTag, /* 'BEN' (Bengali) */ + farLanguageTag, /* 'FAR' (Farsi) */ + gujLanguageTag, /* 'GUJ' (Gujarati) */ + hinLanguageTag, /* 'HIN' (Hindi) */ + iwrLanguageTag, /* 'IWR' (Hebrew) */ + jiiLanguageTag, /* 'JII' (Yiddish) */ + janLanguageTag, /* 'JAN' (Japanese) */ + kanLanguageTag, /* 'KAN' (Kannada) */ + kokLanguageTag, /* 'KOK' (Konkani) */ + korLanguageTag, /* 'KOR' (Korean) */ + kshLanguageTag, /* 'KSH' (Kashmiri) */ + malLanguageTag, /* 'MAL' (Malayalam (Traditional)) */ + marLanguageTag, /* 'MAR' (Marathi) */ + mlrLanguageTag, /* 'MLR' (Malayalam (Reformed)) */ + mniLanguageTag, /* 'MNI' (Manipuri) */ + oriLanguageTag, /* 'ORI' (Oriya) */ + sanLanguageTag, /* 'SAN' (Sanscrit) */ + sndLanguageTag, /* 'SND' (Sindhi) */ + snhLanguageTag, /* 'SNH' (Sinhalese) */ + syrLanguageTag, /* 'SYR' (Syriac) */ + tamLanguageTag, /* 'TAM' (Tamil) */ + telLanguageTag, /* 'TEL' (Telugu) */ + thaLanguageTag, /* 'THA' (Thai) */ + urdLanguageTag, /* 'URD' (Urdu) */ + zhpLanguageTag, /* 'ZHP' (Chinese (Phonetic)) */ + zhsLanguageTag, /* 'ZHS' (Chinese (Simplified)) */ + zhtLanguageTag, /* 'ZHT' (Chinese (Traditional)) */ + afkLanguageTag, /* 'AFK' (Afrikaans) */ + belLanguageTag, /* 'BEL' (Belarussian) */ + bgrLanguageTag, /* 'BGR' (Bulgarian) */ + catLanguageTag, /* 'CAT' (Catalan) */ + cheLanguageTag, /* 'CHE' (Chechen) */ + copLanguageTag, /* 'COP' (Coptic) */ + csyLanguageTag, /* 'CSY' (Czech) */ + danLanguageTag, /* 'DAN' (Danish) */ + deuLanguageTag, /* 'DEU' (German) */ + dznLanguageTag, /* 'DZN' (Dzongkha) */ + ellLanguageTag, /* 'ELL' (Greek) */ + engLanguageTag, /* 'ENG' (English) */ + espLanguageTag, /* 'ESP' (Spanish) */ + etiLanguageTag, /* 'ETI' (Estonian) */ + euqLanguageTag, /* 'EUQ' (Basque) */ + finLanguageTag, /* 'FIN' (Finnish) */ + fraLanguageTag, /* 'FRA' (French) */ + gaeLanguageTag, /* 'GAE' (Gaelic) */ + hauLanguageTag, /* 'HAU' (Hausa) */ + hrvLanguageTag, /* 'HRV' (Croation) */ + hunLanguageTag, /* 'HUN' (Hungarian) */ + hyeLanguageTag, /* 'HYE' (Armenian) */ + indLanguageTag, /* 'IND' (Indonesian) */ + itaLanguageTag, /* 'ITA' (Italian) */ + khmLanguageTag, /* 'KHM' (Khmer) */ + mngLanguageTag, /* 'MNG' (Mongolian) */ + mtsLanguageTag, /* 'MTS' (Maltese) */ + nepLanguageTag, /* 'NEP' (Nepali) */ + nldLanguageTag, /* 'NLD' (Dutch) */ + pasLanguageTag, /* 'PAS' (Pashto) */ + plkLanguageTag, /* 'PLK' (Polish) */ + ptgLanguageTag, /* 'PTG' (Portuguese) */ + romLanguageTag, /* 'ROM' (Romanian) */ + rusLanguageTag, /* 'RUS' (Russian) */ + skyLanguageTag, /* 'SKY' (Slovak) */ + slvLanguageTag, /* 'SLV' (Slovenian) */ + sqiLanguageTag, /* 'SQI' (Albanian) */ + srbLanguageTag, /* 'SRB' (Serbian) */ + sveLanguageTag, /* 'SVE' (Swedish) */ + tibLanguageTag, /* 'TIB' (Tibetan) */ + trkLanguageTag, /* 'TRK' (Turkish) */ + welLanguageTag /* 'WEL' (Welsh) */ +}; + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguageTags.h b/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguageTags.h new file mode 100644 index 00000000000..37f221c3f00 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ScriptAndLanguageTags.h @@ -0,0 +1,269 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2011. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. + * + * Generated on: 11/01/2011 04:08:11 PM PDT + */ + +#ifndef __SCRIPTANDLANGUAGES_H +#define __SCRIPTANDLANGUAGES_H + +#include "LETypes.h" + +/** + * \file + * \internal + */ + +U_NAMESPACE_BEGIN + +const LETag zyyyScriptTag = 0x7A797979; /* 'zyyy' (COMMON) */ +const LETag zinhScriptTag = 0x7A696E68; /* 'zinh' (INHERITED) */ +const LETag arabScriptTag = 0x61726162; /* 'arab' (ARABIC) */ +const LETag armnScriptTag = 0x61726D6E; /* 'armn' (ARMENIAN) */ +const LETag bengScriptTag = 0x62656E67; /* 'beng' (BENGALI) */ +const LETag bng2ScriptTag = 0x626E6732; /* 'bng2' (BENGALI v.2) (manually added) */ +const LETag bopoScriptTag = 0x626F706F; /* 'bopo' (BOPOMOFO) */ +const LETag cherScriptTag = 0x63686572; /* 'cher' (CHEROKEE) */ +const LETag coptScriptTag = 0x636F7074; /* 'copt' (COPTIC) */ +const LETag cyrlScriptTag = 0x6379726C; /* 'cyrl' (CYRILLIC) */ +const LETag dsrtScriptTag = 0x64737274; /* 'dsrt' (DESERET) */ +const LETag devaScriptTag = 0x64657661; /* 'deva' (DEVANAGARI) */ +const LETag dev2ScriptTag = 0x64657632; /* 'dev2' (DEVANAGARI v.2) (manually added) */ +const LETag ethiScriptTag = 0x65746869; /* 'ethi' (ETHIOPIC) */ +const LETag georScriptTag = 0x67656F72; /* 'geor' (GEORGIAN) */ +const LETag gothScriptTag = 0x676F7468; /* 'goth' (GOTHIC) */ +const LETag grekScriptTag = 0x6772656B; /* 'grek' (GREEK) */ +const LETag gujrScriptTag = 0x67756A72; /* 'gujr' (GUJARATI) */ +const LETag gjr2ScriptTag = 0x676A7232; /* 'gjr2' (GUJARATI v.2) (manually added) */ +const LETag guruScriptTag = 0x67757275; /* 'guru' (GURMUKHI) */ +const LETag gur2ScriptTag = 0x67757232; /* 'gur2' (GURMUKHI v.2) (manually added) */ +const LETag haniScriptTag = 0x68616E69; /* 'hani' (HAN) */ +const LETag hangScriptTag = 0x68616E67; /* 'hang' (HANGUL) */ +const LETag hebrScriptTag = 0x68656272; /* 'hebr' (HEBREW) */ +const LETag hiraScriptTag = 0x68697261; /* 'hira' (HIRAGANA) */ +const LETag kndaScriptTag = 0x6B6E6461; /* 'knda' (KANNADA) */ +const LETag knd2ScriptTag = 0x6B6E6432; /* 'knd2' (KANNADA v.2) (manually added) */ +const LETag kanaScriptTag = 0x6B616E61; /* 'kana' (KATAKANA) */ +const LETag khmrScriptTag = 0x6B686D72; /* 'khmr' (KHMER) */ +const LETag laooScriptTag = 0x6C616F20; /* 'lao ' (LAO) */ +const LETag latnScriptTag = 0x6C61746E; /* 'latn' (LATIN) */ +const LETag mlymScriptTag = 0x6D6C796D; /* 'mlym' (MALAYALAM) */ +const LETag mlm2ScriptTag = 0x6D6C6D32; /* 'mlm2' (MALAYALAM v.2) (manually added) */ +const LETag mongScriptTag = 0x6D6F6E67; /* 'mong' (MONGOLIAN) */ +const LETag mymrScriptTag = 0x6D796D72; /* 'mymr' (MYANMAR) */ +const LETag ogamScriptTag = 0x6F67616D; /* 'ogam' (OGHAM) */ +const LETag italScriptTag = 0x6974616C; /* 'ital' (OLD_ITALIC) */ +const LETag oryaScriptTag = 0x6F727961; /* 'orya' (ORIYA) */ +const LETag ory2ScriptTag = 0x6F727932; /* 'ory2' (ORIYA v.2) (manually added) */ +const LETag runrScriptTag = 0x72756E72; /* 'runr' (RUNIC) */ +const LETag sinhScriptTag = 0x73696E68; /* 'sinh' (SINHALA) */ +const LETag syrcScriptTag = 0x73797263; /* 'syrc' (SYRIAC) */ +const LETag tamlScriptTag = 0x74616D6C; /* 'taml' (TAMIL) */ +const LETag tml2ScriptTag = 0x746D6C32; /* 'tml2' (TAMIL v.2) (manually added) */ +const LETag teluScriptTag = 0x74656C75; /* 'telu' (TELUGU) */ +const LETag tel2ScriptTag = 0x74656C32; /* 'tel2' (TELUGU v.2) (manually added) */ +const LETag thaaScriptTag = 0x74686161; /* 'thaa' (THAANA) */ +const LETag thaiScriptTag = 0x74686169; /* 'thai' (THAI) */ +const LETag tibtScriptTag = 0x74696274; /* 'tibt' (TIBETAN) */ +const LETag cansScriptTag = 0x63616E73; /* 'cans' (CANADIAN_ABORIGINAL) */ +const LETag yiiiScriptTag = 0x79692020; /* 'yi ' (YI) */ +const LETag tglgScriptTag = 0x74676C67; /* 'tglg' (TAGALOG) */ +const LETag hanoScriptTag = 0x68616E6F; /* 'hano' (HANUNOO) */ +const LETag buhdScriptTag = 0x62756864; /* 'buhd' (BUHID) */ +const LETag tagbScriptTag = 0x74616762; /* 'tagb' (TAGBANWA) */ +const LETag braiScriptTag = 0x62726169; /* 'brai' (BRAILLE) */ +const LETag cprtScriptTag = 0x63707274; /* 'cprt' (CYPRIOT) */ +const LETag limbScriptTag = 0x6C696D62; /* 'limb' (LIMBU) */ +const LETag linbScriptTag = 0x6C696E62; /* 'linb' (LINEAR_B) */ +const LETag osmaScriptTag = 0x6F736D61; /* 'osma' (OSMANYA) */ +const LETag shawScriptTag = 0x73686177; /* 'shaw' (SHAVIAN) */ +const LETag taleScriptTag = 0x74616C65; /* 'tale' (TAI_LE) */ +const LETag ugarScriptTag = 0x75676172; /* 'ugar' (UGARITIC) */ +const LETag hrktScriptTag = 0x68726B74; /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ +const LETag bugiScriptTag = 0x62756769; /* 'bugi' (BUGINESE) */ +const LETag glagScriptTag = 0x676C6167; /* 'glag' (GLAGOLITIC) */ +const LETag kharScriptTag = 0x6B686172; /* 'khar' (KHAROSHTHI) */ +const LETag syloScriptTag = 0x73796C6F; /* 'sylo' (SYLOTI_NAGRI) */ +const LETag taluScriptTag = 0x74616C75; /* 'talu' (NEW_TAI_LUE) */ +const LETag tfngScriptTag = 0x74666E67; /* 'tfng' (TIFINAGH) */ +const LETag xpeoScriptTag = 0x7870656F; /* 'xpeo' (OLD_PERSIAN) */ +const LETag baliScriptTag = 0x62616C69; /* 'bali' (BALINESE) */ +const LETag batkScriptTag = 0x6261746B; /* 'batk' (BATAK) */ +const LETag blisScriptTag = 0x626C6973; /* 'blis' (BLIS) */ +const LETag brahScriptTag = 0x62726168; /* 'brah' (BRAHMI) */ +const LETag chamScriptTag = 0x6368616D; /* 'cham' (CHAM) */ +const LETag cirtScriptTag = 0x63697274; /* 'cirt' (CIRT) */ +const LETag cyrsScriptTag = 0x63797273; /* 'cyrs' (CYRS) */ +const LETag egydScriptTag = 0x65677964; /* 'egyd' (EGYD) */ +const LETag egyhScriptTag = 0x65677968; /* 'egyh' (EGYH) */ +const LETag egypScriptTag = 0x65677970; /* 'egyp' (EGYPTIAN_HIEROGLYPHS) */ +const LETag geokScriptTag = 0x67656F6B; /* 'geok' (GEOK) */ +const LETag hansScriptTag = 0x68616E73; /* 'hans' (HANS) */ +const LETag hantScriptTag = 0x68616E74; /* 'hant' (HANT) */ +const LETag hmngScriptTag = 0x686D6E67; /* 'hmng' (HMNG) */ +const LETag hungScriptTag = 0x68756E67; /* 'hung' (HUNG) */ +const LETag indsScriptTag = 0x696E6473; /* 'inds' (INDS) */ +const LETag javaScriptTag = 0x6A617661; /* 'java' (JAVANESE) */ +const LETag kaliScriptTag = 0x6B616C69; /* 'kali' (KAYAH_LI) */ +const LETag latfScriptTag = 0x6C617466; /* 'latf' (LATF) */ +const LETag latgScriptTag = 0x6C617467; /* 'latg' (LATG) */ +const LETag lepcScriptTag = 0x6C657063; /* 'lepc' (LEPCHA) */ +const LETag linaScriptTag = 0x6C696E61; /* 'lina' (LINA) */ +const LETag mandScriptTag = 0x6D616E64; /* 'mand' (MANDAIC) */ +const LETag mayaScriptTag = 0x6D617961; /* 'maya' (MAYA) */ +const LETag meroScriptTag = 0x6D65726F; /* 'mero' (MEROITIC_HIEROGLYPHS) */ +const LETag nkooScriptTag = 0x6E6B6F20; /* 'nko ' (NKO) */ +const LETag orkhScriptTag = 0x6F726B68; /* 'orkh' (OLD_TURKIC) */ +const LETag permScriptTag = 0x7065726D; /* 'perm' (PERM) */ +const LETag phagScriptTag = 0x70686167; /* 'phag' (PHAGS_PA) */ +const LETag phnxScriptTag = 0x70686E78; /* 'phnx' (PHOENICIAN) */ +const LETag plrdScriptTag = 0x706C7264; /* 'plrd' (MIAO) */ +const LETag roroScriptTag = 0x726F726F; /* 'roro' (RORO) */ +const LETag saraScriptTag = 0x73617261; /* 'sara' (SARA) */ +const LETag syreScriptTag = 0x73797265; /* 'syre' (SYRE) */ +const LETag syrjScriptTag = 0x7379726A; /* 'syrj' (SYRJ) */ +const LETag syrnScriptTag = 0x7379726E; /* 'syrn' (SYRN) */ +const LETag tengScriptTag = 0x74656E67; /* 'teng' (TENG) */ +const LETag vaiiScriptTag = 0x76616920; /* 'vai ' (VAI) */ +const LETag vispScriptTag = 0x76697370; /* 'visp' (VISP) */ +const LETag xsuxScriptTag = 0x78737578; /* 'xsux' (CUNEIFORM) */ +const LETag zxxxScriptTag = 0x7A787878; /* 'zxxx' (ZXXX) */ +const LETag zzzzScriptTag = 0x7A7A7A7A; /* 'zzzz' (UNKNOWN) */ +const LETag cariScriptTag = 0x63617269; /* 'cari' (CARIAN) */ +const LETag jpanScriptTag = 0x6A70616E; /* 'jpan' (JPAN) */ +const LETag lanaScriptTag = 0x6C616E61; /* 'lana' (TAI_THAM) */ +const LETag lyciScriptTag = 0x6C796369; /* 'lyci' (LYCIAN) */ +const LETag lydiScriptTag = 0x6C796469; /* 'lydi' (LYDIAN) */ +const LETag olckScriptTag = 0x6F6C636B; /* 'olck' (OL_CHIKI) */ +const LETag rjngScriptTag = 0x726A6E67; /* 'rjng' (REJANG) */ +const LETag saurScriptTag = 0x73617572; /* 'saur' (SAURASHTRA) */ +const LETag sgnwScriptTag = 0x73676E77; /* 'sgnw' (SGNW) */ +const LETag sundScriptTag = 0x73756E64; /* 'sund' (SUNDANESE) */ +const LETag moonScriptTag = 0x6D6F6F6E; /* 'moon' (MOON) */ +const LETag mteiScriptTag = 0x6D746569; /* 'mtei' (MEETEI_MAYEK) */ +const LETag armiScriptTag = 0x61726D69; /* 'armi' (IMPERIAL_ARAMAIC) */ +const LETag avstScriptTag = 0x61767374; /* 'avst' (AVESTAN) */ +const LETag cakmScriptTag = 0x63616B6D; /* 'cakm' (CHAKMA) */ +const LETag koreScriptTag = 0x6B6F7265; /* 'kore' (KORE) */ +const LETag kthiScriptTag = 0x6B746869; /* 'kthi' (KAITHI) */ +const LETag maniScriptTag = 0x6D616E69; /* 'mani' (MANI) */ +const LETag phliScriptTag = 0x70686C69; /* 'phli' (INSCRIPTIONAL_PAHLAVI) */ +const LETag phlpScriptTag = 0x70686C70; /* 'phlp' (PHLP) */ +const LETag phlvScriptTag = 0x70686C76; /* 'phlv' (PHLV) */ +const LETag prtiScriptTag = 0x70727469; /* 'prti' (INSCRIPTIONAL_PARTHIAN) */ +const LETag samrScriptTag = 0x73616D72; /* 'samr' (SAMARITAN) */ +const LETag tavtScriptTag = 0x74617674; /* 'tavt' (TAI_VIET) */ +const LETag zmthScriptTag = 0x7A6D7468; /* 'zmth' (ZMTH) */ +const LETag zsymScriptTag = 0x7A73796D; /* 'zsym' (ZSYM) */ +const LETag bamuScriptTag = 0x62616D75; /* 'bamu' (BAMUM) */ +const LETag lisuScriptTag = 0x6C697375; /* 'lisu' (LISU) */ +const LETag nkgbScriptTag = 0x6E6B6762; /* 'nkgb' (NKGB) */ +const LETag sarbScriptTag = 0x73617262; /* 'sarb' (OLD_SOUTH_ARABIAN) */ +const LETag bassScriptTag = 0x62617373; /* 'bass' (BASS) */ +const LETag duplScriptTag = 0x6475706C; /* 'dupl' (DUPL) */ +const LETag elbaScriptTag = 0x656C6261; /* 'elba' (ELBA) */ +const LETag granScriptTag = 0x6772616E; /* 'gran' (GRAN) */ +const LETag kpelScriptTag = 0x6B70656C; /* 'kpel' (KPEL) */ +const LETag lomaScriptTag = 0x6C6F6D61; /* 'loma' (LOMA) */ +const LETag mendScriptTag = 0x6D656E64; /* 'mend' (MEND) */ +const LETag mercScriptTag = 0x6D657263; /* 'merc' (MEROITIC_CURSIVE) */ +const LETag narbScriptTag = 0x6E617262; /* 'narb' (NARB) */ +const LETag nbatScriptTag = 0x6E626174; /* 'nbat' (NBAT) */ +const LETag palmScriptTag = 0x70616C6D; /* 'palm' (PALM) */ +const LETag sindScriptTag = 0x73696E64; /* 'sind' (SIND) */ +const LETag waraScriptTag = 0x77617261; /* 'wara' (WARA) */ +const LETag afakScriptTag = 0x6166616B; /* 'afak' (AFAK) */ +const LETag jurcScriptTag = 0x6A757263; /* 'jurc' (JURC) */ +const LETag mrooScriptTag = 0x6D726F6F; /* 'mroo' (MROO) */ +const LETag nshuScriptTag = 0x6E736875; /* 'nshu' (NSHU) */ +const LETag shrdScriptTag = 0x73687264; /* 'shrd' (SHARADA) */ +const LETag soraScriptTag = 0x736F7261; /* 'sora' (SORA_SOMPENG) */ +const LETag takrScriptTag = 0x74616B72; /* 'takr' (TAKRI) */ +const LETag tangScriptTag = 0x74616E67; /* 'tang' (TANG) */ +const LETag woleScriptTag = 0x776F6C65; /* 'wole' (WOLE) */ +const LETag khojScriptTag = 0x6B686F6A; /* 'khoj' (KHOJ) */ +const LETag tirhScriptTag = 0x74697268; /* 'tirh' (TIRH) */ + +const LETag nullScriptTag = 0x00000000; /* '' (NULL) */ + + +const LETag nullLanguageTag = 0x00000000; /* '' (null) */ +const LETag araLanguageTag = 0x41524120; /* 'ARA' (Arabic) */ +const LETag asmLanguageTag = 0x41534D20; /* 'ASM' (Assamese) */ +const LETag benLanguageTag = 0x42454E20; /* 'BEN' (Bengali) */ +const LETag farLanguageTag = 0x46415220; /* 'FAR' (Farsi) */ +const LETag gujLanguageTag = 0x47554A20; /* 'GUJ' (Gujarati) */ +const LETag hinLanguageTag = 0x48494E20; /* 'HIN' (Hindi) */ +const LETag iwrLanguageTag = 0x49575220; /* 'IWR' (Hebrew) */ +const LETag jiiLanguageTag = 0x4A494920; /* 'JII' (Yiddish) */ +const LETag janLanguageTag = 0x4A414E20; /* 'JAN' (Japanese) */ +const LETag kanLanguageTag = 0x4B414E20; /* 'KAN' (Kannada) */ +const LETag kokLanguageTag = 0x4B4F4B20; /* 'KOK' (Konkani) */ +const LETag korLanguageTag = 0x4B4F5220; /* 'KOR' (Korean) */ +const LETag kshLanguageTag = 0x4B534820; /* 'KSH' (Kashmiri) */ +const LETag malLanguageTag = 0x4D414C20; /* 'MAL' (Malayalam (Traditional)) */ +const LETag marLanguageTag = 0x4D415220; /* 'MAR' (Marathi) */ +const LETag mlrLanguageTag = 0x4D4C5220; /* 'MLR' (Malayalam (Reformed)) */ +const LETag mniLanguageTag = 0x4D4E4920; /* 'MNI' (Manipuri) */ +const LETag oriLanguageTag = 0x4F524920; /* 'ORI' (Oriya) */ +const LETag sanLanguageTag = 0x53414E20; /* 'SAN' (Sanscrit) */ +const LETag sndLanguageTag = 0x534E4420; /* 'SND' (Sindhi) */ +const LETag snhLanguageTag = 0x534E4820; /* 'SNH' (Sinhalese) */ +const LETag syrLanguageTag = 0x53595220; /* 'SYR' (Syriac) */ +const LETag tamLanguageTag = 0x54414D20; /* 'TAM' (Tamil) */ +const LETag telLanguageTag = 0x54454C20; /* 'TEL' (Telugu) */ +const LETag thaLanguageTag = 0x54484120; /* 'THA' (Thai) */ +const LETag urdLanguageTag = 0x55524420; /* 'URD' (Urdu) */ +const LETag zhpLanguageTag = 0x5A485020; /* 'ZHP' (Chinese (Phonetic)) */ +const LETag zhsLanguageTag = 0x5A485320; /* 'ZHS' (Chinese (Simplified)) */ +const LETag zhtLanguageTag = 0x5A485420; /* 'ZHT' (Chinese (Traditional)) */ +const LETag afkLanguageTag = 0x41464B20; /* 'AFK' (Afrikaans) */ +const LETag belLanguageTag = 0x42454C20; /* 'BEL' (Belarussian) */ +const LETag bgrLanguageTag = 0x42475220; /* 'BGR' (Bulgarian) */ +const LETag catLanguageTag = 0x43415420; /* 'CAT' (Catalan) */ +const LETag cheLanguageTag = 0x43484520; /* 'CHE' (Chechen) */ +const LETag copLanguageTag = 0x434F5020; /* 'COP' (Coptic) */ +const LETag csyLanguageTag = 0x43535920; /* 'CSY' (Czech) */ +const LETag danLanguageTag = 0x44414E20; /* 'DAN' (Danish) */ +const LETag deuLanguageTag = 0x44455520; /* 'DEU' (German) */ +const LETag dznLanguageTag = 0x445A4E20; /* 'DZN' (Dzongkha) */ +const LETag ellLanguageTag = 0x454C4C20; /* 'ELL' (Greek) */ +const LETag engLanguageTag = 0x454E4720; /* 'ENG' (English) */ +const LETag espLanguageTag = 0x45535020; /* 'ESP' (Spanish) */ +const LETag etiLanguageTag = 0x45544920; /* 'ETI' (Estonian) */ +const LETag euqLanguageTag = 0x45555120; /* 'EUQ' (Basque) */ +const LETag finLanguageTag = 0x46494E20; /* 'FIN' (Finnish) */ +const LETag fraLanguageTag = 0x46524120; /* 'FRA' (French) */ +const LETag gaeLanguageTag = 0x47414520; /* 'GAE' (Gaelic) */ +const LETag hauLanguageTag = 0x48415520; /* 'HAU' (Hausa) */ +const LETag hrvLanguageTag = 0x48525620; /* 'HRV' (Croation) */ +const LETag hunLanguageTag = 0x48554E20; /* 'HUN' (Hungarian) */ +const LETag hyeLanguageTag = 0x48594520; /* 'HYE' (Armenian) */ +const LETag indLanguageTag = 0x494E4420; /* 'IND' (Indonesian) */ +const LETag itaLanguageTag = 0x49544120; /* 'ITA' (Italian) */ +const LETag khmLanguageTag = 0x4B484D20; /* 'KHM' (Khmer) */ +const LETag mngLanguageTag = 0x4D4E4720; /* 'MNG' (Mongolian) */ +const LETag mtsLanguageTag = 0x4D545320; /* 'MTS' (Maltese) */ +const LETag nepLanguageTag = 0x4E455020; /* 'NEP' (Nepali) */ +const LETag nldLanguageTag = 0x4E4C4420; /* 'NLD' (Dutch) */ +const LETag pasLanguageTag = 0x50415320; /* 'PAS' (Pashto) */ +const LETag plkLanguageTag = 0x504C4B20; /* 'PLK' (Polish) */ +const LETag ptgLanguageTag = 0x50544720; /* 'PTG' (Portuguese) */ +const LETag romLanguageTag = 0x524F4D20; /* 'ROM' (Romanian) */ +const LETag rusLanguageTag = 0x52555320; /* 'RUS' (Russian) */ +const LETag skyLanguageTag = 0x534B5920; /* 'SKY' (Slovak) */ +const LETag slvLanguageTag = 0x534C5620; /* 'SLV' (Slovenian) */ +const LETag sqiLanguageTag = 0x53514920; /* 'SQI' (Albanian) */ +const LETag srbLanguageTag = 0x53524220; /* 'SRB' (Serbian) */ +const LETag sveLanguageTag = 0x53564520; /* 'SVE' (Swedish) */ +const LETag tibLanguageTag = 0x54494220; /* 'TIB' (Tibetan) */ +const LETag trkLanguageTag = 0x54524B20; /* 'TRK' (Turkish) */ +const LETag welLanguageTag = 0x57454C20; /* 'WEL' (Welsh) */ + + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/SegmentArrayProcessor.cpp b/Build/source/libs/icu/icu-50.1/layout/SegmentArrayProcessor.cpp new file mode 100644 index 00000000000..b915cb9b92c --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SegmentArrayProcessor.cpp @@ -0,0 +1,60 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" +#include "NonContextualGlyphSubstProc.h" +#include "SegmentArrayProcessor.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentArrayProcessor) + +SegmentArrayProcessor::SegmentArrayProcessor() +{ +} + +SegmentArrayProcessor::SegmentArrayProcessor(const MorphSubtableHeader *morphSubtableHeader) + : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader) +{ + const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader; + + segmentArrayLookupTable = (const SegmentArrayLookupTable *) &header->table; +} + +SegmentArrayProcessor::~SegmentArrayProcessor() +{ +} + +void SegmentArrayProcessor::process(LEGlyphStorage &glyphStorage) +{ + const LookupSegment *segments = segmentArrayLookupTable->segments; + le_int32 glyphCount = glyphStorage.getGlyphCount(); + le_int32 glyph; + + for (glyph = 0; glyph < glyphCount; glyph += 1) { + LEGlyphID thisGlyph = glyphStorage[glyph]; + const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segments, thisGlyph); + + if (lookupSegment != NULL) { + TTGlyphID firstGlyph = SWAPW(lookupSegment->firstGlyph); + le_int16 offset = SWAPW(lookupSegment->value); + + if (offset != 0) { + TTGlyphID *glyphArray = (TTGlyphID *) ((char *) subtableHeader + offset); + TTGlyphID newGlyph = SWAPW(glyphArray[LE_GET_GLYPH(thisGlyph) - firstGlyph]); + + glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); + } + } + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/SegmentArrayProcessor.h b/Build/source/libs/icu/icu-50.1/layout/SegmentArrayProcessor.h new file mode 100644 index 00000000000..7e2028c98b5 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SegmentArrayProcessor.h @@ -0,0 +1,58 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __SEGMENTARRAYPROCESSOR_H +#define __SEGMENTARRAYPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" +#include "NonContextualGlyphSubstProc.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class SegmentArrayProcessor : public NonContextualGlyphSubstitutionProcessor +{ +public: + virtual void process(LEGlyphStorage &glyphStorage); + + SegmentArrayProcessor(const MorphSubtableHeader *morphSubtableHeader); + + virtual ~SegmentArrayProcessor(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +private: + SegmentArrayProcessor(); + +protected: + const SegmentArrayLookupTable *segmentArrayLookupTable; + +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/SegmentSingleProcessor.cpp b/Build/source/libs/icu/icu-50.1/layout/SegmentSingleProcessor.cpp new file mode 100644 index 00000000000..75e33eb01d2 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SegmentSingleProcessor.cpp @@ -0,0 +1,54 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" +#include "NonContextualGlyphSubstProc.h" +#include "SegmentSingleProcessor.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentSingleProcessor) + +SegmentSingleProcessor::SegmentSingleProcessor() +{ +} + +SegmentSingleProcessor::SegmentSingleProcessor(const MorphSubtableHeader *morphSubtableHeader) + : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader) +{ + const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader; + + segmentSingleLookupTable = (const SegmentSingleLookupTable *) &header->table; +} + +SegmentSingleProcessor::~SegmentSingleProcessor() +{ +} + +void SegmentSingleProcessor::process(LEGlyphStorage &glyphStorage) +{ + const LookupSegment *segments = segmentSingleLookupTable->segments; + le_int32 glyphCount = glyphStorage.getGlyphCount(); + le_int32 glyph; + + for (glyph = 0; glyph < glyphCount; glyph += 1) { + LEGlyphID thisGlyph = glyphStorage[glyph]; + const LookupSegment *lookupSegment = segmentSingleLookupTable->lookupSegment(segments, thisGlyph); + + if (lookupSegment != NULL) { + TTGlyphID newGlyph = (TTGlyphID) LE_GET_GLYPH(thisGlyph) + SWAPW(lookupSegment->value); + + glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); + } + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/SegmentSingleProcessor.h b/Build/source/libs/icu/icu-50.1/layout/SegmentSingleProcessor.h new file mode 100644 index 00000000000..64b2b72f162 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SegmentSingleProcessor.h @@ -0,0 +1,58 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __SEGMENTSINGLEPROCESSOR_H +#define __SEGMENTSINGLEPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" +#include "NonContextualGlyphSubstProc.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class SegmentSingleProcessor : public NonContextualGlyphSubstitutionProcessor +{ +public: + virtual void process(LEGlyphStorage &glyphStorage); + + SegmentSingleProcessor(const MorphSubtableHeader *morphSubtableHeader); + + virtual ~SegmentSingleProcessor(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +private: + SegmentSingleProcessor(); + +protected: + const SegmentSingleLookupTable *segmentSingleLookupTable; + +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/ShapingTypeData.cpp b/Build/source/libs/icu/icu-50.1/layout/ShapingTypeData.cpp new file mode 100644 index 00000000000..75cf5524f3c --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ShapingTypeData.cpp @@ -0,0 +1,100 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008. All Rights Reserved. + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. + * + * Generated on: 05/29/2008 03:39:26 PM HST + */ + +#include "LETypes.h" +#include "ArabicShaping.h" + +U_NAMESPACE_BEGIN + +const le_uint8 ArabicShaping::shapingTypeTable[] = { + 0x00, 0x02, 0x00, 0xD7, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0x05, 0x03, 0x00, 0x03, 0x6F, 0x00, 0x05, + 0x04, 0x83, 0x04, 0x89, 0x00, 0x05, 0x05, 0x91, 0x05, 0xBD, 0x00, 0x05, 0x05, 0xBF, 0x05, 0xBF, + 0x00, 0x05, 0x05, 0xC1, 0x05, 0xC2, 0x00, 0x05, 0x05, 0xC4, 0x05, 0xC5, 0x00, 0x05, 0x05, 0xC7, + 0x05, 0xC7, 0x00, 0x05, 0x06, 0x10, 0x06, 0x1A, 0x00, 0x05, 0x06, 0x22, 0x06, 0x25, 0x00, 0x04, + 0x06, 0x26, 0x06, 0x26, 0x00, 0x02, 0x06, 0x27, 0x06, 0x27, 0x00, 0x04, 0x06, 0x28, 0x06, 0x28, + 0x00, 0x02, 0x06, 0x29, 0x06, 0x29, 0x00, 0x04, 0x06, 0x2A, 0x06, 0x2E, 0x00, 0x02, 0x06, 0x2F, + 0x06, 0x32, 0x00, 0x04, 0x06, 0x33, 0x06, 0x3F, 0x00, 0x02, 0x06, 0x40, 0x06, 0x40, 0x00, 0x01, + 0x06, 0x41, 0x06, 0x47, 0x00, 0x02, 0x06, 0x48, 0x06, 0x48, 0x00, 0x04, 0x06, 0x49, 0x06, 0x4A, + 0x00, 0x02, 0x06, 0x4B, 0x06, 0x5E, 0x00, 0x05, 0x06, 0x6E, 0x06, 0x6F, 0x00, 0x02, 0x06, 0x70, + 0x06, 0x70, 0x00, 0x05, 0x06, 0x71, 0x06, 0x73, 0x00, 0x04, 0x06, 0x75, 0x06, 0x77, 0x00, 0x04, + 0x06, 0x78, 0x06, 0x87, 0x00, 0x02, 0x06, 0x88, 0x06, 0x99, 0x00, 0x04, 0x06, 0x9A, 0x06, 0xBF, + 0x00, 0x02, 0x06, 0xC0, 0x06, 0xC0, 0x00, 0x04, 0x06, 0xC1, 0x06, 0xC2, 0x00, 0x02, 0x06, 0xC3, + 0x06, 0xCB, 0x00, 0x04, 0x06, 0xCC, 0x06, 0xCC, 0x00, 0x02, 0x06, 0xCD, 0x06, 0xCD, 0x00, 0x04, + 0x06, 0xCE, 0x06, 0xCE, 0x00, 0x02, 0x06, 0xCF, 0x06, 0xCF, 0x00, 0x04, 0x06, 0xD0, 0x06, 0xD1, + 0x00, 0x02, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04, 0x06, 0xD5, 0x06, 0xD5, 0x00, 0x04, 0x06, 0xD6, + 0x06, 0xDC, 0x00, 0x05, 0x06, 0xDE, 0x06, 0xE4, 0x00, 0x05, 0x06, 0xE7, 0x06, 0xE8, 0x00, 0x05, + 0x06, 0xEA, 0x06, 0xED, 0x00, 0x05, 0x06, 0xEE, 0x06, 0xEF, 0x00, 0x04, 0x06, 0xFA, 0x06, 0xFC, + 0x00, 0x02, 0x06, 0xFF, 0x06, 0xFF, 0x00, 0x02, 0x07, 0x0F, 0x07, 0x0F, 0x00, 0x05, 0x07, 0x10, + 0x07, 0x10, 0x00, 0x04, 0x07, 0x11, 0x07, 0x11, 0x00, 0x05, 0x07, 0x12, 0x07, 0x14, 0x00, 0x02, + 0x07, 0x15, 0x07, 0x19, 0x00, 0x04, 0x07, 0x1A, 0x07, 0x1D, 0x00, 0x02, 0x07, 0x1E, 0x07, 0x1E, + 0x00, 0x04, 0x07, 0x1F, 0x07, 0x27, 0x00, 0x02, 0x07, 0x28, 0x07, 0x28, 0x00, 0x04, 0x07, 0x29, + 0x07, 0x29, 0x00, 0x02, 0x07, 0x2A, 0x07, 0x2A, 0x00, 0x04, 0x07, 0x2B, 0x07, 0x2B, 0x00, 0x02, + 0x07, 0x2C, 0x07, 0x2C, 0x00, 0x04, 0x07, 0x2D, 0x07, 0x2E, 0x00, 0x02, 0x07, 0x2F, 0x07, 0x2F, + 0x00, 0x04, 0x07, 0x30, 0x07, 0x4A, 0x00, 0x05, 0x07, 0x4D, 0x07, 0x4D, 0x00, 0x04, 0x07, 0x4E, + 0x07, 0x58, 0x00, 0x02, 0x07, 0x59, 0x07, 0x5B, 0x00, 0x04, 0x07, 0x5C, 0x07, 0x6A, 0x00, 0x02, + 0x07, 0x6B, 0x07, 0x6C, 0x00, 0x04, 0x07, 0x6D, 0x07, 0x70, 0x00, 0x02, 0x07, 0x71, 0x07, 0x71, + 0x00, 0x04, 0x07, 0x72, 0x07, 0x72, 0x00, 0x02, 0x07, 0x73, 0x07, 0x74, 0x00, 0x04, 0x07, 0x75, + 0x07, 0x77, 0x00, 0x02, 0x07, 0x78, 0x07, 0x79, 0x00, 0x04, 0x07, 0x7A, 0x07, 0x7F, 0x00, 0x02, + 0x07, 0xA6, 0x07, 0xB0, 0x00, 0x05, 0x07, 0xCA, 0x07, 0xEA, 0x00, 0x02, 0x07, 0xEB, 0x07, 0xF3, + 0x00, 0x05, 0x07, 0xFA, 0x07, 0xFA, 0x00, 0x01, 0x09, 0x01, 0x09, 0x02, 0x00, 0x05, 0x09, 0x3C, + 0x09, 0x3C, 0x00, 0x05, 0x09, 0x41, 0x09, 0x48, 0x00, 0x05, 0x09, 0x4D, 0x09, 0x4D, 0x00, 0x05, + 0x09, 0x51, 0x09, 0x54, 0x00, 0x05, 0x09, 0x62, 0x09, 0x63, 0x00, 0x05, 0x09, 0x81, 0x09, 0x81, + 0x00, 0x05, 0x09, 0xBC, 0x09, 0xBC, 0x00, 0x05, 0x09, 0xC1, 0x09, 0xC4, 0x00, 0x05, 0x09, 0xCD, + 0x09, 0xCD, 0x00, 0x05, 0x09, 0xE2, 0x09, 0xE3, 0x00, 0x05, 0x0A, 0x01, 0x0A, 0x02, 0x00, 0x05, + 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x05, 0x0A, 0x41, 0x0A, 0x42, 0x00, 0x05, 0x0A, 0x47, 0x0A, 0x48, + 0x00, 0x05, 0x0A, 0x4B, 0x0A, 0x4D, 0x00, 0x05, 0x0A, 0x51, 0x0A, 0x51, 0x00, 0x05, 0x0A, 0x70, + 0x0A, 0x71, 0x00, 0x05, 0x0A, 0x75, 0x0A, 0x75, 0x00, 0x05, 0x0A, 0x81, 0x0A, 0x82, 0x00, 0x05, + 0x0A, 0xBC, 0x0A, 0xBC, 0x00, 0x05, 0x0A, 0xC1, 0x0A, 0xC5, 0x00, 0x05, 0x0A, 0xC7, 0x0A, 0xC8, + 0x00, 0x05, 0x0A, 0xCD, 0x0A, 0xCD, 0x00, 0x05, 0x0A, 0xE2, 0x0A, 0xE3, 0x00, 0x05, 0x0B, 0x01, + 0x0B, 0x01, 0x00, 0x05, 0x0B, 0x3C, 0x0B, 0x3C, 0x00, 0x05, 0x0B, 0x3F, 0x0B, 0x3F, 0x00, 0x05, + 0x0B, 0x41, 0x0B, 0x44, 0x00, 0x05, 0x0B, 0x4D, 0x0B, 0x4D, 0x00, 0x05, 0x0B, 0x56, 0x0B, 0x56, + 0x00, 0x05, 0x0B, 0x62, 0x0B, 0x63, 0x00, 0x05, 0x0B, 0x82, 0x0B, 0x82, 0x00, 0x05, 0x0B, 0xC0, + 0x0B, 0xC0, 0x00, 0x05, 0x0B, 0xCD, 0x0B, 0xCD, 0x00, 0x05, 0x0C, 0x3E, 0x0C, 0x40, 0x00, 0x05, + 0x0C, 0x46, 0x0C, 0x48, 0x00, 0x05, 0x0C, 0x4A, 0x0C, 0x4D, 0x00, 0x05, 0x0C, 0x55, 0x0C, 0x56, + 0x00, 0x05, 0x0C, 0x62, 0x0C, 0x63, 0x00, 0x05, 0x0C, 0xBC, 0x0C, 0xBC, 0x00, 0x05, 0x0C, 0xBF, + 0x0C, 0xBF, 0x00, 0x05, 0x0C, 0xC6, 0x0C, 0xC6, 0x00, 0x05, 0x0C, 0xCC, 0x0C, 0xCD, 0x00, 0x05, + 0x0C, 0xE2, 0x0C, 0xE3, 0x00, 0x05, 0x0D, 0x41, 0x0D, 0x44, 0x00, 0x05, 0x0D, 0x4D, 0x0D, 0x4D, + 0x00, 0x05, 0x0D, 0x62, 0x0D, 0x63, 0x00, 0x05, 0x0D, 0xCA, 0x0D, 0xCA, 0x00, 0x05, 0x0D, 0xD2, + 0x0D, 0xD4, 0x00, 0x05, 0x0D, 0xD6, 0x0D, 0xD6, 0x00, 0x05, 0x0E, 0x31, 0x0E, 0x31, 0x00, 0x05, + 0x0E, 0x34, 0x0E, 0x3A, 0x00, 0x05, 0x0E, 0x47, 0x0E, 0x4E, 0x00, 0x05, 0x0E, 0xB1, 0x0E, 0xB1, + 0x00, 0x05, 0x0E, 0xB4, 0x0E, 0xB9, 0x00, 0x05, 0x0E, 0xBB, 0x0E, 0xBC, 0x00, 0x05, 0x0E, 0xC8, + 0x0E, 0xCD, 0x00, 0x05, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0x05, 0x0F, 0x35, 0x0F, 0x35, 0x00, 0x05, + 0x0F, 0x37, 0x0F, 0x37, 0x00, 0x05, 0x0F, 0x39, 0x0F, 0x39, 0x00, 0x05, 0x0F, 0x71, 0x0F, 0x7E, + 0x00, 0x05, 0x0F, 0x80, 0x0F, 0x84, 0x00, 0x05, 0x0F, 0x86, 0x0F, 0x87, 0x00, 0x05, 0x0F, 0x90, + 0x0F, 0x97, 0x00, 0x05, 0x0F, 0x99, 0x0F, 0xBC, 0x00, 0x05, 0x0F, 0xC6, 0x0F, 0xC6, 0x00, 0x05, + 0x10, 0x2D, 0x10, 0x30, 0x00, 0x05, 0x10, 0x32, 0x10, 0x37, 0x00, 0x05, 0x10, 0x39, 0x10, 0x3A, + 0x00, 0x05, 0x10, 0x3D, 0x10, 0x3E, 0x00, 0x05, 0x10, 0x58, 0x10, 0x59, 0x00, 0x05, 0x10, 0x5E, + 0x10, 0x60, 0x00, 0x05, 0x10, 0x71, 0x10, 0x74, 0x00, 0x05, 0x10, 0x82, 0x10, 0x82, 0x00, 0x05, + 0x10, 0x85, 0x10, 0x86, 0x00, 0x05, 0x10, 0x8D, 0x10, 0x8D, 0x00, 0x05, 0x13, 0x5F, 0x13, 0x5F, + 0x00, 0x05, 0x17, 0x12, 0x17, 0x14, 0x00, 0x05, 0x17, 0x32, 0x17, 0x34, 0x00, 0x05, 0x17, 0x52, + 0x17, 0x53, 0x00, 0x05, 0x17, 0x72, 0x17, 0x73, 0x00, 0x05, 0x17, 0xB4, 0x17, 0xB5, 0x00, 0x05, + 0x17, 0xB7, 0x17, 0xBD, 0x00, 0x05, 0x17, 0xC6, 0x17, 0xC6, 0x00, 0x05, 0x17, 0xC9, 0x17, 0xD3, + 0x00, 0x05, 0x17, 0xDD, 0x17, 0xDD, 0x00, 0x05, 0x18, 0x0B, 0x18, 0x0D, 0x00, 0x05, 0x18, 0xA9, + 0x18, 0xA9, 0x00, 0x05, 0x19, 0x20, 0x19, 0x22, 0x00, 0x05, 0x19, 0x27, 0x19, 0x28, 0x00, 0x05, + 0x19, 0x32, 0x19, 0x32, 0x00, 0x05, 0x19, 0x39, 0x19, 0x3B, 0x00, 0x05, 0x1A, 0x17, 0x1A, 0x18, + 0x00, 0x05, 0x1B, 0x00, 0x1B, 0x03, 0x00, 0x05, 0x1B, 0x34, 0x1B, 0x34, 0x00, 0x05, 0x1B, 0x36, + 0x1B, 0x3A, 0x00, 0x05, 0x1B, 0x3C, 0x1B, 0x3C, 0x00, 0x05, 0x1B, 0x42, 0x1B, 0x42, 0x00, 0x05, + 0x1B, 0x6B, 0x1B, 0x73, 0x00, 0x05, 0x1B, 0x80, 0x1B, 0x81, 0x00, 0x05, 0x1B, 0xA2, 0x1B, 0xA5, + 0x00, 0x05, 0x1B, 0xA8, 0x1B, 0xA9, 0x00, 0x05, 0x1C, 0x2C, 0x1C, 0x33, 0x00, 0x05, 0x1C, 0x36, + 0x1C, 0x37, 0x00, 0x05, 0x1D, 0xC0, 0x1D, 0xE6, 0x00, 0x05, 0x1D, 0xFE, 0x1D, 0xFF, 0x00, 0x05, + 0x20, 0x0B, 0x20, 0x0B, 0x00, 0x05, 0x20, 0x0D, 0x20, 0x0D, 0x00, 0x01, 0x20, 0x0E, 0x20, 0x0F, + 0x00, 0x05, 0x20, 0x2A, 0x20, 0x2E, 0x00, 0x05, 0x20, 0x60, 0x20, 0x64, 0x00, 0x05, 0x20, 0x6A, + 0x20, 0x6F, 0x00, 0x05, 0x20, 0xD0, 0x20, 0xF0, 0x00, 0x05, 0x2D, 0xE0, 0x2D, 0xFF, 0x00, 0x05, + 0x30, 0x2A, 0x30, 0x2F, 0x00, 0x05, 0x30, 0x99, 0x30, 0x9A, 0x00, 0x05, 0xA6, 0x6F, 0xA6, 0x72, + 0x00, 0x05, 0xA6, 0x7C, 0xA6, 0x7D, 0x00, 0x05, 0xA8, 0x02, 0xA8, 0x02, 0x00, 0x05, 0xA8, 0x06, + 0xA8, 0x06, 0x00, 0x05, 0xA8, 0x0B, 0xA8, 0x0B, 0x00, 0x05, 0xA8, 0x25, 0xA8, 0x26, 0x00, 0x05, + 0xA8, 0xC4, 0xA8, 0xC4, 0x00, 0x05, 0xA9, 0x26, 0xA9, 0x2D, 0x00, 0x05, 0xA9, 0x47, 0xA9, 0x51, + 0x00, 0x05, 0xAA, 0x29, 0xAA, 0x2E, 0x00, 0x05, 0xAA, 0x31, 0xAA, 0x32, 0x00, 0x05, 0xAA, 0x35, + 0xAA, 0x36, 0x00, 0x05, 0xAA, 0x43, 0xAA, 0x43, 0x00, 0x05, 0xAA, 0x4C, 0xAA, 0x4C, 0x00, 0x05, + 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x05, 0xFE, 0x00, 0xFE, 0x0F, 0x00, 0x05, 0xFE, 0x20, 0xFE, 0x26, + 0x00, 0x05, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x05, 0xFF, 0xF9, 0xFF, 0xFB, 0x00, 0x05 +}; + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/SimpleArrayProcessor.cpp b/Build/source/libs/icu/icu-50.1/layout/SimpleArrayProcessor.cpp new file mode 100644 index 00000000000..d677f545f6b --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SimpleArrayProcessor.cpp @@ -0,0 +1,51 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" +#include "NonContextualGlyphSubstProc.h" +#include "SimpleArrayProcessor.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleArrayProcessor) + +SimpleArrayProcessor::SimpleArrayProcessor() +{ +} + +SimpleArrayProcessor::SimpleArrayProcessor(const MorphSubtableHeader *morphSubtableHeader) + : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader) +{ + const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader; + + simpleArrayLookupTable = (const SimpleArrayLookupTable *) &header->table; +} + +SimpleArrayProcessor::~SimpleArrayProcessor() +{ +} + +void SimpleArrayProcessor::process(LEGlyphStorage &glyphStorage) +{ + le_int32 glyphCount = glyphStorage.getGlyphCount(); + le_int32 glyph; + + for (glyph = 0; glyph < glyphCount; glyph += 1) { + LEGlyphID thisGlyph = glyphStorage[glyph]; + if (LE_GET_GLYPH(thisGlyph) < 0xFFFF) { + TTGlyphID newGlyph = SWAPW(simpleArrayLookupTable->valueArray[LE_GET_GLYPH(thisGlyph)]); + + glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); + } + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/SimpleArrayProcessor.h b/Build/source/libs/icu/icu-50.1/layout/SimpleArrayProcessor.h new file mode 100644 index 00000000000..afee79c4971 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SimpleArrayProcessor.h @@ -0,0 +1,58 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __SIMPLEARRAYPROCESSOR_H +#define __SIMPLEARRAYPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" +#include "NonContextualGlyphSubstProc.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class SimpleArrayProcessor : public NonContextualGlyphSubstitutionProcessor +{ +public: + virtual void process(LEGlyphStorage &glyphStorage); + + SimpleArrayProcessor(const MorphSubtableHeader *morphSubtableHeader); + + virtual ~SimpleArrayProcessor(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +private: + SimpleArrayProcessor(); + +protected: + const SimpleArrayLookupTable *simpleArrayLookupTable; + +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/SinglePositioningSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/SinglePositioningSubtables.cpp new file mode 100644 index 00000000000..e8759d21a19 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SinglePositioningSubtables.cpp @@ -0,0 +1,72 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphPositioningTables.h" +#include "SinglePositioningSubtables.h" +#include "ValueRecords.h" +#include "GlyphIterator.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_uint32 SinglePositioningSubtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const +{ + switch(SWAPW(subtableFormat)) + { + case 0: + return 0; + + case 1: + { + const SinglePositioningFormat1Subtable *subtable = (const SinglePositioningFormat1Subtable *) this; + + return subtable->process(glyphIterator, fontInstance); + } + + case 2: + { + const SinglePositioningFormat2Subtable *subtable = (const SinglePositioningFormat2Subtable *) this; + + return subtable->process(glyphIterator, fontInstance); + } + + default: + return 0; + } +} + +le_uint32 SinglePositioningFormat1Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const +{ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + valueRecord.adjustPosition(SWAPW(valueFormat), (const char *) this, *glyphIterator, fontInstance); + + return 1; + } + + return 0; +} + +le_uint32 SinglePositioningFormat2Subtable::process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const +{ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int16 coverageIndex = (le_int16) getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + valueRecordArray[0].adjustPosition(coverageIndex, SWAPW(valueFormat), (const char *) this, *glyphIterator, fontInstance); + + return 1; + } + + return 0; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/SinglePositioningSubtables.h b/Build/source/libs/icu/icu-50.1/layout/SinglePositioningSubtables.h new file mode 100644 index 00000000000..ec2ffcc9269 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SinglePositioningSubtables.h @@ -0,0 +1,49 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __SINGLEPOSITIONINGSUBTABLES_H +#define __SINGLEPOSITIONINGSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphPositioningTables.h" +#include "ValueRecords.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +struct SinglePositioningSubtable : GlyphPositioningSubtable +{ + le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; +}; + +struct SinglePositioningFormat1Subtable : SinglePositioningSubtable +{ + ValueFormat valueFormat; + ValueRecord valueRecord; + + le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; +}; + +struct SinglePositioningFormat2Subtable : SinglePositioningSubtable +{ + ValueFormat valueFormat; + le_uint16 valueCount; + ValueRecord valueRecordArray[ANY_NUMBER]; + + le_uint32 process(GlyphIterator *glyphIterator, const LEFontInstance *fontInstance) const; +}; + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/SingleSubstitutionSubtables.cpp b/Build/source/libs/icu/icu-50.1/layout/SingleSubstitutionSubtables.cpp new file mode 100644 index 00000000000..ae72ddfd04f --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SingleSubstitutionSubtables.cpp @@ -0,0 +1,79 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "SingleSubstitutionSubtables.h" +#include "GlyphIterator.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +le_uint32 SingleSubstitutionSubtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const +{ + switch(SWAPW(subtableFormat)) + { + case 0: + return 0; + + case 1: + { + const SingleSubstitutionFormat1Subtable *subtable = (const SingleSubstitutionFormat1Subtable *) this; + + return subtable->process(glyphIterator, filter); + } + + case 2: + { + const SingleSubstitutionFormat2Subtable *subtable = (const SingleSubstitutionFormat2Subtable *) this; + + return subtable->process(glyphIterator, filter); + } + + default: + return 0; + } +} + +le_uint32 SingleSubstitutionFormat1Subtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const +{ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + TTGlyphID substitute = ((TTGlyphID) LE_GET_GLYPH(glyph)) + SWAPW(deltaGlyphID); + + if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, substitute))) { + glyphIterator->setCurrGlyphID(substitute); + } + + return 1; + } + + return 0; +} + +le_uint32 SingleSubstitutionFormat2Subtable::process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter) const +{ + LEGlyphID glyph = glyphIterator->getCurrGlyphID(); + le_int32 coverageIndex = getGlyphCoverage(glyph); + + if (coverageIndex >= 0) { + TTGlyphID substitute = SWAPW(substituteArray[coverageIndex]); + + if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, substitute))) { + glyphIterator->setCurrGlyphID(substitute); + } + + return 1; + } + + return 0; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/SingleSubstitutionSubtables.h b/Build/source/libs/icu/icu-50.1/layout/SingleSubstitutionSubtables.h new file mode 100644 index 00000000000..dfd2dad8809 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SingleSubstitutionSubtables.h @@ -0,0 +1,46 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __SINGLESUBSTITUTIONSUBTABLES_H +#define __SINGLESUBSTITUTIONSUBTABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +struct SingleSubstitutionSubtable : GlyphSubstitutionSubtable +{ + le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; +}; + +struct SingleSubstitutionFormat1Subtable : SingleSubstitutionSubtable +{ + le_int16 deltaGlyphID; + + le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; +}; + +struct SingleSubstitutionFormat2Subtable : SingleSubstitutionSubtable +{ + le_uint16 glyphCount; + TTGlyphID substituteArray[ANY_NUMBER]; + + le_uint32 process(GlyphIterator *glyphIterator, const LEGlyphFilter *filter = NULL) const; +}; + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/SingleTableProcessor.cpp b/Build/source/libs/icu/icu-50.1/layout/SingleTableProcessor.cpp new file mode 100644 index 00000000000..94a4edd7571 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SingleTableProcessor.cpp @@ -0,0 +1,51 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" +#include "NonContextualGlyphSubstProc.h" +#include "SingleTableProcessor.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SingleTableProcessor) + +SingleTableProcessor::SingleTableProcessor() +{ +} + +SingleTableProcessor::SingleTableProcessor(const MorphSubtableHeader *moprhSubtableHeader) + : NonContextualGlyphSubstitutionProcessor(moprhSubtableHeader) +{ + const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) moprhSubtableHeader; + + singleTableLookupTable = (const SingleTableLookupTable *) &header->table; +} + +SingleTableProcessor::~SingleTableProcessor() +{ +} + +void SingleTableProcessor::process(LEGlyphStorage &glyphStorage) +{ + const LookupSingle *entries = singleTableLookupTable->entries; + le_int32 glyph; + le_int32 glyphCount = glyphStorage.getGlyphCount(); + + for (glyph = 0; glyph < glyphCount; glyph += 1) { + const LookupSingle *lookupSingle = singleTableLookupTable->lookupSingle(entries, glyphStorage[glyph]); + + if (lookupSingle != NULL) { + glyphStorage[glyph] = SWAPW(lookupSingle->value); + } + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/SingleTableProcessor.h b/Build/source/libs/icu/icu-50.1/layout/SingleTableProcessor.h new file mode 100644 index 00000000000..d6ca048b049 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SingleTableProcessor.h @@ -0,0 +1,57 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __SINGLETABLEPROCESSOR_H +#define __SINGLETABLEPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" +#include "NonContextualGlyphSubstProc.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class SingleTableProcessor : public NonContextualGlyphSubstitutionProcessor +{ +public: + virtual void process(LEGlyphStorage &glyphStorage); + + SingleTableProcessor(const MorphSubtableHeader *morphSubtableHeader); + + virtual ~SingleTableProcessor(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +private: + SingleTableProcessor(); + +protected: + const SingleTableLookupTable *singleTableLookupTable; + +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/StateTableProcessor.cpp b/Build/source/libs/icu/icu-50.1/layout/StateTableProcessor.cpp new file mode 100644 index 00000000000..223959b8b16 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/StateTableProcessor.cpp @@ -0,0 +1,77 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "StateTables.h" +#include "MorphStateTables.h" +#include "SubtableProcessor.h" +#include "StateTableProcessor.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +StateTableProcessor::StateTableProcessor() +{ +} + +StateTableProcessor::StateTableProcessor(const MorphSubtableHeader *morphSubtableHeader) + : SubtableProcessor(morphSubtableHeader) +{ + stateTableHeader = (const MorphStateTableHeader *) morphSubtableHeader; + + stateSize = SWAPW(stateTableHeader->stHeader.stateSize); + classTableOffset = SWAPW(stateTableHeader->stHeader.classTableOffset); + stateArrayOffset = SWAPW(stateTableHeader->stHeader.stateArrayOffset); + entryTableOffset = SWAPW(stateTableHeader->stHeader.entryTableOffset); + + classTable = (const ClassTable *) ((char *) &stateTableHeader->stHeader + classTableOffset); + firstGlyph = SWAPW(classTable->firstGlyph); + lastGlyph = firstGlyph + SWAPW(classTable->nGlyphs); +} + +StateTableProcessor::~StateTableProcessor() +{ +} + +void StateTableProcessor::process(LEGlyphStorage &glyphStorage) +{ + // Start at state 0 + // XXX: How do we know when to start at state 1? + ByteOffset currentState = stateArrayOffset; + + // XXX: reverse? + le_int32 currGlyph = 0; + le_int32 glyphCount = glyphStorage.getGlyphCount(); + + beginStateTable(); + + while (currGlyph <= glyphCount) { + ClassCode classCode = classCodeOOB; + if (currGlyph == glyphCount) { + // XXX: How do we handle EOT vs. EOL? + classCode = classCodeEOT; + } else { + TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(glyphStorage[currGlyph]); + + if (glyphCode == 0xFFFF) { + classCode = classCodeDEL; + } else if ((glyphCode >= firstGlyph) && (glyphCode < lastGlyph)) { + classCode = classTable->classArray[glyphCode - firstGlyph]; + } + } + + const EntryTableIndex *stateArray = (const EntryTableIndex *) ((char *) &stateTableHeader->stHeader + currentState); + EntryTableIndex entryTableIndex = stateArray[(le_uint8)classCode]; + + currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex); + } + + endStateTable(); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/StateTableProcessor.h b/Build/source/libs/icu/icu-50.1/layout/StateTableProcessor.h new file mode 100644 index 00000000000..41c50debe94 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/StateTableProcessor.h @@ -0,0 +1,58 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __STATETABLEPROCESSOR_H +#define __STATETABLEPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "MorphStateTables.h" +#include "SubtableProcessor.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class StateTableProcessor : public SubtableProcessor +{ +public: + void process(LEGlyphStorage &glyphStorage); + + virtual void beginStateTable() = 0; + + virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) = 0; + + virtual void endStateTable() = 0; + +protected: + StateTableProcessor(const MorphSubtableHeader *morphSubtableHeader); + virtual ~StateTableProcessor(); + + StateTableProcessor(); + + le_int16 stateSize; + ByteOffset classTableOffset; + ByteOffset stateArrayOffset; + ByteOffset entryTableOffset; + + const ClassTable *classTable; + TTGlyphID firstGlyph; + TTGlyphID lastGlyph; + + const MorphStateTableHeader *stateTableHeader; + +private: + StateTableProcessor(const StateTableProcessor &other); // forbid copying of this class + StateTableProcessor &operator=(const StateTableProcessor &other); // forbid copying of this class +}; + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/StateTables.h b/Build/source/libs/icu/icu-50.1/layout/StateTables.h new file mode 100644 index 00000000000..8b5f867770a --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/StateTables.h @@ -0,0 +1,65 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __STATETABLES_H +#define __STATETABLES_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LayoutTables.h" + +U_NAMESPACE_BEGIN + +struct StateTableHeader +{ + le_int16 stateSize; + ByteOffset classTableOffset; + ByteOffset stateArrayOffset; + ByteOffset entryTableOffset; +}; + +enum ClassCodes +{ + classCodeEOT = 0, + classCodeOOB = 1, + classCodeDEL = 2, + classCodeEOL = 3, + classCodeFirstFree = 4, + classCodeMAX = 0xFF +}; + +typedef le_uint8 ClassCode; + +struct ClassTable +{ + TTGlyphID firstGlyph; + le_uint16 nGlyphs; + ClassCode classArray[ANY_NUMBER]; +}; + +enum StateNumber +{ + stateSOT = 0, + stateSOL = 1, + stateFirstFree = 2, + stateMAX = 0xFF +}; + +typedef le_uint8 EntryTableIndex; + +struct StateEntry +{ + ByteOffset newStateOffset; + le_int16 flags; +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/SubstitutionLookups.cpp b/Build/source/libs/icu/icu-50.1/layout/SubstitutionLookups.cpp new file mode 100644 index 00000000000..1fb281300ed --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SubstitutionLookups.cpp @@ -0,0 +1,51 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "GlyphIterator.h" +#include "LookupProcessor.h" +#include "SubstitutionLookups.h" +#include "CoverageTables.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +/* + NOTE: This could be optimized somewhat by keeping track + of the previous sequenceIndex in the loop and doing next() + or prev() of the delta between that and the current + sequenceIndex instead of always resetting to the front. +*/ +void SubstitutionLookup::applySubstitutionLookups( + LookupProcessor *lookupProcessor, + SubstitutionLookupRecord *substLookupRecordArray, + le_uint16 substCount, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + le_int32 position, + LEErrorCode& success) +{ + if (LE_FAILURE(success)) { + return; + } + + GlyphIterator tempIterator(*glyphIterator); + + for (le_uint16 subst = 0; subst < substCount && LE_SUCCESS(success); subst += 1) { + le_uint16 sequenceIndex = SWAPW(substLookupRecordArray[subst].sequenceIndex); + le_uint16 lookupListIndex = SWAPW(substLookupRecordArray[subst].lookupListIndex); + + tempIterator.setCurrStreamPosition(position); + tempIterator.next(sequenceIndex); + + lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance, success); + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/SubstitutionLookups.h b/Build/source/libs/icu/icu-50.1/layout/SubstitutionLookups.h new file mode 100644 index 00000000000..582b6f661e4 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SubstitutionLookups.h @@ -0,0 +1,44 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#ifndef __SUBSTITUTIONLOOKUPS_H +#define __SUBSTITUTIONLOOKUPS_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphSubstitutionTables.h" +#include "GlyphIterator.h" +#include "LookupProcessor.h" + +U_NAMESPACE_BEGIN + +struct SubstitutionLookupRecord +{ + le_uint16 sequenceIndex; + le_uint16 lookupListIndex; +}; + +struct SubstitutionLookup +{ + static void applySubstitutionLookups( + LookupProcessor *lookupProcessor, + SubstitutionLookupRecord *substLookupRecordArray, + le_uint16 substCount, + GlyphIterator *glyphIterator, + const LEFontInstance *fontInstance, + le_int32 position, + LEErrorCode& success); +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/SubtableProcessor.cpp b/Build/source/libs/icu/icu-50.1/layout/SubtableProcessor.cpp new file mode 100644 index 00000000000..dd5ce187b21 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SubtableProcessor.cpp @@ -0,0 +1,31 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +SubtableProcessor::SubtableProcessor() +{ +} + +SubtableProcessor::SubtableProcessor(const MorphSubtableHeader *morphSubtableHeader) +{ + subtableHeader = morphSubtableHeader; + + length = SWAPW(subtableHeader->length); + coverage = SWAPW(subtableHeader->coverage); + subtableFeatures = SWAPL(subtableHeader->subtableFeatures); +} + +SubtableProcessor::~SubtableProcessor() +{ +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/SubtableProcessor.h b/Build/source/libs/icu/icu-50.1/layout/SubtableProcessor.h new file mode 100644 index 00000000000..f304cb956e9 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/SubtableProcessor.h @@ -0,0 +1,46 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __SUBTABLEPROCESSOR_H +#define __SUBTABLEPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "MorphTables.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class SubtableProcessor : public UMemory { +public: + virtual void process(LEGlyphStorage &glyphStorage) = 0; + virtual ~SubtableProcessor(); + +protected: + SubtableProcessor(const MorphSubtableHeader *morphSubtableHeader); + + SubtableProcessor(); + + le_int16 length; + SubtableCoverage coverage; + FeatureFlags subtableFeatures; + + const MorphSubtableHeader *subtableHeader; + +private: + + SubtableProcessor(const SubtableProcessor &other); // forbid copying of this class + SubtableProcessor &operator=(const SubtableProcessor &other); // forbid copying of this class +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/ThaiLayoutEngine.cpp b/Build/source/libs/icu/icu-50.1/layout/ThaiLayoutEngine.cpp new file mode 100644 index 00000000000..f9d77a791f3 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ThaiLayoutEngine.cpp @@ -0,0 +1,123 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LayoutEngine.h" +#include "ThaiLayoutEngine.h" +#include "ScriptAndLanguageTags.h" +#include "LEGlyphStorage.h" + +#include "KernTable.h" + +#include "ThaiShaping.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ThaiLayoutEngine) + +ThaiLayoutEngine::ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) + : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) +{ + fErrorChar = 0x25CC; + + // Figure out which presentation forms the font uses + if (! fontInstance->canDisplay(0x0E01)) { + // No Thai in font; don't use presentation forms. + fGlyphSet = 3; + } else if (fontInstance->canDisplay(0x0E64)) { + // WorldType uses reserved space in Thai block + fGlyphSet = 0; + } else if (fontInstance->canDisplay(0xF701)) { + // Microsoft corporate zone + fGlyphSet = 1; + + if (!fontInstance->canDisplay(fErrorChar)) { + fErrorChar = 0xF71B; + } + } else if (fontInstance->canDisplay(0xF885)) { + // Apple corporate zone + fGlyphSet = 2; + } else { + // no presentation forms in the font + fGlyphSet = 3; + } +} + +ThaiLayoutEngine::~ThaiLayoutEngine() +{ + // nothing to do +} + +// Input: characters (0..max provided for context) +// Output: glyphs, char indices +// Returns: the glyph count +// NOTE: this assumes that ThaiShaping::compose will allocate the outChars array... +le_int32 ThaiLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + LEUnicode *outChars; + le_int32 glyphCount; + + // This is enough room for the worst-case expansion + // (it says here...) + outChars = LE_NEW_ARRAY(LEUnicode, count * 2); + + if (outChars == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + glyphStorage.allocateGlyphArray(count * 2, FALSE, success); + + if (LE_FAILURE(success)) { + LE_DELETE_ARRAY(outChars); + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + glyphCount = ThaiShaping::compose(chars, offset, count, fGlyphSet, fErrorChar, outChars, glyphStorage); + mapCharsToGlyphs(outChars, 0, glyphCount, FALSE, FALSE, glyphStorage, success); + + LE_DELETE_ARRAY(outChars); + + glyphStorage.adoptGlyphCount(glyphCount); + return glyphCount; +} + +// This is the same as LayoutEngline::adjustGlyphPositions() except that it doesn't call adjustMarkGlyphs +void ThaiLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/, + LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return; + } + + if (chars == NULL || offset < 0 || count < 0) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + if (fTypoFlags & 0x1) { /* kerning enabled */ + static const le_uint32 kernTableTag = LE_KERN_TABLE_TAG; + + KernTable kt(fFontInstance, getFontTable(kernTableTag)); + kt.process(glyphStorage); + } + + // default is no adjustments + return; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/ThaiLayoutEngine.h b/Build/source/libs/icu/icu-50.1/layout/ThaiLayoutEngine.h new file mode 100644 index 00000000000..08a154d2272 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ThaiLayoutEngine.h @@ -0,0 +1,144 @@ + +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + */ + +#ifndef __THAILAYOUTENGINE_H +#define __THAILAYOUTENGINE_H + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "LayoutEngine.h" + +#include "ThaiShaping.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +/** + * This class implements layout for the Thai script, using the ThaiShapingClass. + * All existing Thai fonts use an encoding which assigns character codes to all + * the variant forms needed to display accents and tone marks correctly in context. + * This class can deal with fonts using the Microsoft, Macintosh, and WorldType encodings. + * + * @internal + */ +class ThaiLayoutEngine : public LayoutEngine +{ +public: + /** + * This constructs an instance of ThaiLayoutEngine for the given font, script and + * language. It examines the font, using LEFontInstance::canDisplay, to set fGlyphSet + * and fErrorChar. (see below) + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param languageCode - the language + * @param success - set to an error code if the operation fails + * + * @see LEFontInstance + * @see ScriptAndLanguageTags.h for script and language codes + * + * @internal + */ + ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. + * + * @internal + */ + virtual ~ThaiLayoutEngine(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +protected: + /** + * A small integer indicating which Thai encoding + * the font uses. + * + * @see ThaiShaping + * + * @internal + */ + le_uint8 fGlyphSet; + + /** + * The character used as a base for vowels and + * tone marks that are out of sequence. Usually + * this will be Unicode 0x25CC, if the font can + * display it. + * + * @see ThaiShaping + * + * @internal + */ + LEUnicode fErrorChar; + + /** + * This method performs Thai layout. It calls ThaiShaping::compose to + * generate the correct contextual character codes, and then calls + * mapCharsToGlyphs to generate the glyph indices. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - <code>TRUE</code> if the text is in a right to left directional run + * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. + * + * Output parameters: + * @param success - set to an error code if the operation fails + * + * @return the number of glyphs in the glyph index array + * + * @see ThaiShaping + * + * @internal + */ + virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEGlyphStorage &glyphStorage, LEErrorCode &success); + + /** + * This method does positioning adjustments like accent positioning and + * kerning. The default implementation does nothing. Subclasses needing + * position adjustments must override this method. + * + * Note that this method has both characters and glyphs as input so that + * it can use the character codes to determine glyph types if that information + * isn't directly available. (e.g. Some Arabic OpenType fonts don't have a GDEF + * table) + * + * @param chars - the input character context + * @param offset - the offset of the first character to process + * @param count - the number of characters to process + * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered + * @param glyphStorage - the object which holds the per-glyph storage. The glyph positions will be + * adjusted as needed. + * @param success - output parameter set to an error code if the operation fails + * + * @internal + */ + virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); + +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/ThaiShaping.cpp b/Build/source/libs/icu/icu-50.1/layout/ThaiShaping.cpp new file mode 100644 index 00000000000..1680f0fe515 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ThaiShaping.cpp @@ -0,0 +1,307 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" +#include "LEGlyphStorage.h" +#include "ThaiShaping.h" + +U_NAMESPACE_BEGIN + +enum { + CH_SPACE = 0x0020, + CH_YAMAKKAN = 0x0E4E, + CH_MAI_HANAKAT = 0x0E31, + CH_SARA_AA = 0x0E32, + CH_SARA_AM = 0x0E33, + CH_SARA_UEE = 0x0E37, + CH_MAITAIKHU = 0x0E47, + CH_NIKHAHIT = 0x0E4D, + CH_SARA_U = 0x0E38, + CH_PHINTHU = 0x0E3A, + CH_YO_YING = 0x0E0D, + CH_THO_THAN = 0x0E10, + CH_DOTTED_CIRCLE = 0x25CC +}; + + le_uint8 ThaiShaping::getCharClass(LEUnicode ch) +{ + le_uint8 charClass = NON; + + if (ch >= 0x0E00 && ch <= 0x0E5B) { + charClass = classTable[ch - 0x0E00]; + } + + return charClass; +} + + +LEUnicode ThaiShaping::leftAboveVowel(LEUnicode vowel, le_uint8 glyphSet) +{ + static const LEUnicode leftAboveVowels[][7] = { + {0x0E61, 0x0E32, 0x0E33, 0x0E64, 0x0E65, 0x0E66, 0x0E67}, + {0xF710, 0x0E32, 0x0E33, 0xF701, 0xF702, 0xF703, 0xF704}, + {0xF884, 0x0E32, 0x0E33, 0xF885, 0xF886, 0xF887, 0xF788}, + {0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37} + }; + + if (vowel >= CH_MAI_HANAKAT && vowel <= CH_SARA_UEE) { + return leftAboveVowels[glyphSet][vowel - CH_MAI_HANAKAT]; + } + + if (vowel == CH_YAMAKKAN && glyphSet == 0) { + return 0x0E7E; + } + + return vowel; +} + +LEUnicode ThaiShaping::lowerRightTone(LEUnicode tone, le_uint8 glyphSet) +{ + static const LEUnicode lowerRightTones[][7] = { + {0x0E68, 0x0E69, 0x0E6A, 0x0E6B, 0x0E6C, 0x0E6D, 0x0E6E}, + {0x0E47, 0xF70A, 0xF70B, 0xF70C, 0xF70D, 0xF70E, 0x0E4D}, + {0x0E47, 0xF88B, 0xF88E, 0xF891, 0xF894, 0xF897, 0x0E4D}, + {0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D} + }; + + if (tone >= CH_MAITAIKHU && tone <= CH_NIKHAHIT) { + return lowerRightTones[glyphSet][tone - CH_MAITAIKHU]; + } + + return tone; +} + +LEUnicode ThaiShaping::lowerLeftTone(LEUnicode tone, le_uint8 glyphSet) +{ + static const LEUnicode lowerLeftTones[][7] = { + {0x0E76, 0x0E77, 0x0E78, 0x0E79, 0x0E7A, 0x0E7B, 0x0E7C}, + {0xF712, 0xF705, 0xF706, 0xF707, 0xF708, 0xF709, 0xF711}, + {0xF889, 0xF88C, 0xF88F, 0xF892, 0xF895, 0xF898, 0xF899}, + {0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D} + }; + + if (tone >= CH_MAITAIKHU && tone <= CH_NIKHAHIT) { + return lowerLeftTones[glyphSet][tone - CH_MAITAIKHU]; + } + + return tone; +} + +LEUnicode ThaiShaping::upperLeftTone(LEUnicode tone, le_uint8 glyphSet) +{ + static const LEUnicode upperLeftTones[][7] = { + {0x0E6F, 0x0E70, 0x0E71, 0x0E72, 0x0E73, 0x0E74, 0x0E75}, + {0xF712, 0xF713, 0xF714, 0xF715, 0xF716, 0xF717, 0xF711}, + {0xF889, 0xF88A, 0xF88D, 0xF890, 0xF893, 0xF896, 0xF899}, + {0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D} + }; + + if (tone >= CH_MAITAIKHU && tone <= CH_NIKHAHIT) { + return upperLeftTones[glyphSet][tone - CH_MAITAIKHU]; + } + + return tone; +} + +LEUnicode ThaiShaping::lowerBelowVowel(LEUnicode vowel, le_uint8 glyphSet) +{ + static const LEUnicode lowerBelowVowels[][3] = { + {0x0E3C, 0x0E3D, 0x0E3E}, + {0xF718, 0xF719, 0xF71A}, + {0x0E38, 0x0E39, 0x0E3A}, + {0x0E38, 0x0E39, 0x0E3A} + + }; + + if (vowel >= CH_SARA_U && vowel <= CH_PHINTHU) { + return lowerBelowVowels[glyphSet][vowel - CH_SARA_U]; + } + + return vowel; +} + +LEUnicode ThaiShaping::noDescenderCOD(LEUnicode cod, le_uint8 glyphSet) +{ + static const LEUnicode noDescenderCODs[][4] = { + {0x0E60, 0x0E0E, 0x0E0F, 0x0E63}, + {0xF70F, 0x0E0E, 0x0E0F, 0xF700}, + {0x0E0D, 0x0E0E, 0x0E0F, 0x0E10}, + {0x0E0D, 0x0E0E, 0x0E0F, 0x0E10} + + }; + + if (cod >= CH_YO_YING && cod <= CH_THO_THAN) { + return noDescenderCODs[glyphSet][cod - CH_YO_YING]; + } + + return cod; +} + +le_uint8 ThaiShaping::doTransition (StateTransition transition, LEUnicode currChar, le_int32 inputIndex, le_uint8 glyphSet, + LEUnicode errorChar, LEUnicode *outputBuffer, LEGlyphStorage &glyphStorage, le_int32 &outputIndex) +{ + LEErrorCode success = LE_NO_ERROR; + + switch (transition.action) { + case tA: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = currChar; + break; + + case tC: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = currChar; + break; + + case tD: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = leftAboveVowel(currChar, glyphSet); + break; + + case tE: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = lowerRightTone(currChar, glyphSet); + break; + + case tF: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = lowerLeftTone(currChar, glyphSet); + break; + + case tG: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = upperLeftTone(currChar, glyphSet); + break; + + case tH: + { + LEUnicode cod = outputBuffer[outputIndex - 1]; + LEUnicode coa = noDescenderCOD(cod, glyphSet); + + if (cod != coa) { + outputBuffer[outputIndex - 1] = coa; + + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = currChar; + break; + } + + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = lowerBelowVowel(currChar, glyphSet); + break; + } + + case tR: + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = errorChar; + + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = currChar; + break; + + case tS: + if (currChar == CH_SARA_AM) { + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = errorChar; + } + + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = currChar; + break; + + default: + // FIXME: if we get here, there's an error + // in the state table! + glyphStorage.setCharIndex(outputIndex, inputIndex, success); + outputBuffer[outputIndex++] = currChar; + break; + } + + return transition.nextState; +} + +le_uint8 ThaiShaping::getNextState(LEUnicode ch, le_uint8 prevState, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar, + le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex) +{ + StateTransition transition; + + charClass = getCharClass(ch); + transition = getTransition(prevState, charClass); + + return doTransition(transition, ch, inputIndex, glyphSet, errorChar, output, glyphStorage, outputIndex); +} + +le_bool ThaiShaping::isLegalHere(LEUnicode ch, le_uint8 prevState) +{ + le_uint8 charClass = getCharClass(ch); + StateTransition transition = getTransition(prevState, charClass); + + switch (transition.action) { + case tA: + case tC: + case tD: + case tE: + case tF: + case tG: + case tH: + return TRUE; + + case tR: + case tS: + return FALSE; + + default: + // FIXME: if we get here, there's an error + // in the state table! + return FALSE; + } +} + +le_int32 ThaiShaping::compose(const LEUnicode *input, le_int32 offset, le_int32 charCount, le_uint8 glyphSet, + LEUnicode errorChar, LEUnicode *output, LEGlyphStorage &glyphStorage) +{ + le_uint8 state = 0; + le_int32 inputIndex; + le_int32 outputIndex = 0; + le_uint8 conState = 0xFF; + le_int32 conInput = -1; + le_int32 conOutput = -1; + + for (inputIndex = 0; inputIndex < charCount; inputIndex += 1) { + LEUnicode ch = input[inputIndex + offset]; + le_uint8 charClass; + + // Decompose SARA AM into NIKHAHIT + SARA AA + if (ch == CH_SARA_AM && isLegalHere(ch, state)) { + outputIndex = conOutput; + state = getNextState(CH_NIKHAHIT, conState, inputIndex, glyphSet, errorChar, charClass, + output, glyphStorage, outputIndex); + + for (int j = conInput + 1; j < inputIndex; j += 1) { + ch = input[j + offset]; + state = getNextState(ch, state, j, glyphSet, errorChar, charClass, + output, glyphStorage, outputIndex); + } + + ch = CH_SARA_AA; + } + + state = getNextState(ch, state, inputIndex, glyphSet, errorChar, charClass, + output, glyphStorage, outputIndex); + + if (charClass >= CON && charClass <= COD) { + conState = state; + conInput = inputIndex; + conOutput = outputIndex; + } + } + + return outputIndex; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/ThaiShaping.h b/Build/source/libs/icu/icu-50.1/layout/ThaiShaping.h new file mode 100644 index 00000000000..4c6d6a51f4f --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ThaiShaping.h @@ -0,0 +1,108 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#ifndef __THAISHAPING_H +#define __THAISHAPING_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEGlyphFilter.h" +#include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class ThaiShaping /* not : public UObject because all methods are static */ { +public: + + enum { + // Character classes + NON = 0, + CON = 1, + COA = 2, + COD = 3, + LVO = 4, + FV1 = 5, + FV2 = 6, + FV3 = 7, + BV1 = 8, + BV2 = 9, + BDI = 10, + TON = 11, + AD1 = 12, + AD2 = 13, + AD3 = 14, + NIK = 15, + AV1 = 16, + AV2 = 17, + AV3 = 18, + classCount = 19, + + // State Transition actions + tA = 0, + tC = 1, + tD = 2, + tE = 3, + tF = 4, + tG = 5, + tH = 6, + tR = 7, + tS = 8 + }; + + struct StateTransition + { + le_uint8 nextState; + le_uint8 action; + + le_uint8 getNextState() { return nextState; }; + le_uint8 getAction() { return action; }; + }; + + static le_int32 compose(const LEUnicode *input, le_int32 offset, le_int32 charCount, le_uint8 glyphSet, + LEUnicode errorChar, LEUnicode *output, LEGlyphStorage &glyphStorage); + +private: + // forbid instantiation + ThaiShaping(); + + static const le_uint8 classTable[]; + static const StateTransition thaiStateTable[][classCount]; + + inline static StateTransition getTransition(le_uint8 state, le_uint8 currClass); + + static le_uint8 doTransition(StateTransition transition, LEUnicode currChar, le_int32 inputIndex, le_uint8 glyphSet, + LEUnicode errorChar, LEUnicode *outputBuffer, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); + + static le_uint8 getNextState(LEUnicode ch, le_uint8 state, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar, + le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); + + static le_bool isLegalHere(LEUnicode ch, le_uint8 prevState); + static le_uint8 getCharClass(LEUnicode ch); + + static LEUnicode noDescenderCOD(LEUnicode cod, le_uint8 glyphSet); + static LEUnicode leftAboveVowel(LEUnicode vowel, le_uint8 glyphSet); + static LEUnicode lowerBelowVowel(LEUnicode vowel, le_uint8 glyphSet); + static LEUnicode lowerRightTone(LEUnicode tone, le_uint8 glyphSet); + static LEUnicode lowerLeftTone(LEUnicode tone, le_uint8 glyphSet); + static LEUnicode upperLeftTone(LEUnicode tone, le_uint8 glyphSet); + +}; + +inline ThaiShaping::StateTransition ThaiShaping::getTransition(le_uint8 state, le_uint8 currClass) +{ + return thaiStateTable[state][currClass]; +} + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/ThaiStateTables.cpp b/Build/source/libs/icu/icu-50.1/layout/ThaiStateTables.cpp new file mode 100644 index 00000000000..b1f8b184fbf --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ThaiStateTables.cpp @@ -0,0 +1,87 @@ +/* + * %W% %E% + * + * (C) Copyright IBM Corp. 1999-2003 - All Rights Reserved + * + * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS + * YOU REALLY KNOW WHAT YOU'RE DOING. + * + */ + +#include "LETypes.h" +#include "ThaiShaping.h" + +U_NAMESPACE_BEGIN + +const le_uint8 ThaiShaping::classTable[] = { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + // ------------------------------------------------------------------------------- + /*0E00*/ NON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, COD, COD, COD, + /*0E10*/ COD, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, COA, CON, COA, CON, COA, + /*0E20*/ CON, CON, CON, CON, FV3, CON, FV3, CON, CON, CON, CON, CON, CON, CON, CON, NON, + /*0E30*/ FV1, AV2, FV1, FV1, AV1, AV3, AV2, AV3, BV1, BV2, BDI, NON, NON, NON, NON, NON, + /*0E40*/ LVO, LVO, LVO, LVO, LVO, FV2, NON, AD2, TON, TON, TON, TON, AD1, NIK, AD3, NON, + /*0E50*/ NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON +}; + +const ThaiShaping::StateTransition ThaiShaping::thaiStateTable[][ThaiShaping::classCount] = { + //+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + //| N C C C L F F F B B B T A A A N A A A | + //| O O O O V V V V V V D O D D D I V V V | + //| N N A D O 1 2 3 1 2 I N 1 2 3 K 1 2 3 | + //+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + /*00*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*01*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 2, tC}, { 6, tC}, { 0, tC}, { 8, tE}, { 0, tE}, { 0, tE}, { 0, tC}, { 9, tE}, {11, tC}, {14, tC}, {16, tC}}, + /*02*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 3, tE}, { 0, tE}, { 0, tR}, { 0, tR}, { 4, tE}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*03*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*04*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 5, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*05*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*06*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 7, tE}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*07*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*08*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*09*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {10, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*10*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*11*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {12, tC}, { 0, tC}, { 0, tR}, { 0, tR}, {13, tC}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*12*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*13*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*14*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {15, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*15*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*16*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {17, tC}, { 0, tR}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*17*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*18*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tS}, { 0, tA}, {19, tC}, {23, tC}, { 0, tC}, {25, tF}, { 0, tF}, { 0, tF}, { 0, tD}, {26, tF}, {28, tD}, {31, tD}, {33, tD}}, + /*19*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {20, tF}, { 0, tF}, { 0, tR}, { 0, tR}, {21, tF}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*20*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*21*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {22, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*22*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*23*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {24, tF}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*24*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*25*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*26*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {27, tG}, { 0, tG}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*27*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*28*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {29, tG}, { 0, tG}, { 0, tR}, { 0, tR}, {30, tG}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*29*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*30*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*31*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {32, tG}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*32*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*33*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {34, tG}, { 0, tR}, { 0, tG}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*34*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*35*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tS}, { 0, tA}, {36, tH}, {40, tH}, { 0, tH}, {42, tE}, { 0, tE}, { 0, tE}, { 0, tC}, {43, tE}, {45, tC}, {48, tC}, {50, tC}}, + /*36*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {37, tE}, { 0, tE}, { 0, tR}, { 0, tR}, {38, tE}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*37*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*38*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {39, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*39*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*40*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {41, tE}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*41*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*42*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*43*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {44, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*44*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*45*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {46, tC}, { 0, tC}, { 0, tR}, { 0, tR}, {47, tC}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*46*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*47*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*48*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {49, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*49*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*50*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {51, tC}, { 0, tR}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, + /*51*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}} +}; + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/TibetanLayoutEngine.cpp b/Build/source/libs/icu/icu-50.1/layout/TibetanLayoutEngine.cpp new file mode 100644 index 00000000000..d89879f6f29 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/TibetanLayoutEngine.cpp @@ -0,0 +1,87 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + * Developed at DIT - Government of Bhutan + * + * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> + * + * This file is a modification of the ICU file KhmerReordering.cpp + * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan + * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. + * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola + * + */ + + +#include "OpenTypeLayoutEngine.h" +#include "TibetanLayoutEngine.h" +#include "LEGlyphStorage.h" +#include "TibetanReordering.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TibetanOpenTypeLayoutEngine) + +TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) +{ + fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; +} + +TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success) + : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) +{ + fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount); + fFeatureOrder = TRUE; +} + +TibetanOpenTypeLayoutEngine::~TibetanOpenTypeLayoutEngine() +{ + // nothing to do +} + +// Input: characters +// Output: characters, char indices, tags +// Returns: output character count +le_int32 TibetanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { + success = LE_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + le_int32 worstCase = count * 3; // worst case is 3 for Khmer TODO check if 2 is enough + + outChars = LE_NEW_ARRAY(LEUnicode, worstCase); + + if (outChars == NULL) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); + glyphStorage.allocateAuxData(success); + + if (LE_FAILURE(success)) { + LE_DELETE_ARRAY(outChars); + return 0; + } + + // NOTE: assumes this allocates featureTags... + // (probably better than doing the worst case stuff here...) + le_int32 outCharCount = TibetanReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage); + + glyphStorage.adoptGlyphCount(outCharCount); + return outCharCount; +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/TibetanLayoutEngine.h b/Build/source/libs/icu/icu-50.1/layout/TibetanLayoutEngine.h new file mode 100644 index 00000000000..6ad38cbf873 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/TibetanLayoutEngine.h @@ -0,0 +1,131 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved + * + * Developed at DIT - Government of Bhutan + * + * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> + * + * This file is a modification of the ICU file KhmerReordering.cpp + * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan + * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. + * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola + * + */ + +#ifndef __TIBETANLAYOUTENGINE_H +#define __TIBETANLAYOUTENGINE_H + +// #include "LETypes.h" +// #include "LEFontInstance.h" +// #include "LEGlyphFilter.h" +// #include "LayoutEngine.h" +// #include "OpenTypeLayoutEngine.h" + +// #include "GlyphSubstitutionTables.h" +// #include "GlyphDefinitionTables.h" +// #include "GlyphPositioningTables.h" + +U_NAMESPACE_BEGIN + +// class MPreFixups; +// class LEGlyphStorage; + +/** + * This class implements OpenType layout for Dzongkha and Tibetan OpenType fonts + * + * @internal + */ +class TibetanOpenTypeLayoutEngine : public OpenTypeLayoutEngine +{ +public: + /** + * This is the main constructor. It constructs an instance of TibetanOpenTypeLayoutEngine for + * a particular font, script and language. It takes the GSUB table as a parameter since + * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an + * Tibetan OpenType font. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param gsubTable - the GSUB table + * @param success - set to an error code if the operation fails + * + * @see LayoutEngine::layoutEngineFactory + * @see OpenTypeLayoutEngine + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ + TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success); + + /** + * This constructor is used when the font requires a "canned" GSUB table which can't be known + * until after this constructor has been invoked. + * + * @param fontInstance - the font + * @param scriptCode - the script + * @param langaugeCode - the language + * @param success - set to an error code if the operation fails + * + * @see OpenTypeLayoutEngine + * @see ScriptAndLangaugeTags.h for script and language codes + * + * @internal + */ + TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, + le_int32 typoFlags, LEErrorCode &success); + + /** + * The destructor, virtual for correct polymorphic invocation. + * + * @internal + */ + virtual ~TibetanOpenTypeLayoutEngine(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @internal ICU 3.6 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @internal ICU 3.6 + */ + static UClassID getStaticClassID(); + +protected: + + /** + * This method does Tibetan OpenType character processing. It assigns the OpenType feature + * tags to the characters, and may generate output characters which have been reordered. + * It may also split some vowels, resulting in more output characters than input characters. + * + * Input parameters: + * @param chars - the input character context + * @param offset - the index of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run + * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. + * the auxillary data array will be set to the feature tags. + * + * Output parameters: + * @param success - set to an error code if the operation fails + * + * @return the output character count + * + * @internal + */ + virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, + LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); + +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/TibetanReordering.cpp b/Build/source/libs/icu/icu-50.1/layout/TibetanReordering.cpp new file mode 100644 index 00000000000..4296d637fd4 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/TibetanReordering.cpp @@ -0,0 +1,389 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved + * + * Developed at DIT - Government of Bhutan + * + * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> + * + * This file is a modification of the ICU file KhmerReordering.cpp + * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan + * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. + * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola + * + */ + +//#include <stdio.h> +#include "LETypes.h" +#include "OpenTypeTables.h" +#include "TibetanReordering.h" +#include "LEGlyphStorage.h" + + +U_NAMESPACE_BEGIN + +// Characters that get refered to by name... +enum +{ + C_DOTTED_CIRCLE = 0x25CC, + C_PRE_NUMBER_MARK = 0x0F3F + }; + + +enum +{ + // simple classes, they are used in the statetable (in this file) to control the length of a syllable + // they are also used to know where a character should be placed (location in reference to the base character) + // and also to know if a character, when independtly displayed, should be displayed with a dotted-circle to + // indicate error in syllable construction + _xx = TibetanClassTable::CC_RESERVED, + _ba = TibetanClassTable::CC_BASE, + _sj = TibetanClassTable::CC_SUBJOINED | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, + _tp = TibetanClassTable::CC_TSA_PHRU | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, + _ac = TibetanClassTable::CC_A_CHUNG | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, + _cs = TibetanClassTable::CC_COMP_SANSKRIT | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, + _ha = TibetanClassTable::CC_HALANTA | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, + _bv = TibetanClassTable::CC_BELOW_VOWEL | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, + _av = TibetanClassTable::CC_ABOVE_VOWEL | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, + _an = TibetanClassTable::CC_ANUSVARA | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, + _cb = TibetanClassTable::CC_CANDRABINDU | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, + _vs = TibetanClassTable::CC_VISARGA | TibetanClassTable::CF_DOTTED_CIRCLE| TibetanClassTable::CF_POS_AFTER, + _as = TibetanClassTable::CC_ABOVE_S_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, + _bs = TibetanClassTable::CC_BELOW_S_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, + _di = TibetanClassTable::CC_DIGIT | TibetanClassTable::CF_DIGIT, + _pd = TibetanClassTable::CC_PRE_DIGIT_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_PREDIGIT | TibetanClassTable::CF_POS_BEFORE , + _bd = TibetanClassTable::CC_POST_BELOW_DIGIT_M | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_AFTER +}; + + +// Character class tables +//_xx Non Combining characters +//_ba Base Consonants +//_sj Subjoined consonants +//_tp Tsa - phru +//_ac A-chung, Vowel Lengthening mark +//_cs Precomposed Sanskrit vowel + subjoined consonants +//_ha Halanta/Virama +//_bv Below vowel +//_av above vowel +//_an Anusvara +//_cb Candrabindu +//_vs Visaraga/Post mark +//_as Upper Stress marks +//_bs Lower Stress marks +//_di Digit +//_pd Number pre combining, Needs reordering +//_bd Other number combining marks + +static const TibetanClassTable::CharClass tibetanCharClasses[] = +{ + // 0 1 2 3 4 5 6 7 8 9 a b c d e f + _xx, _ba, _xx, _xx, _ba, _ba, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0F00 - 0F0F 0 + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _bd, _bd, _xx, _xx, _xx, _xx, _xx, _xx, // 0F10 - 0F1F 1 + _di, _di, _di, _di, _di, _di, _di, _di, _di, _di, _xx, _xx, _xx, _xx, _xx, _xx, // 0F20 - 0F2F 2 + _xx, _xx, _xx, _xx, _xx, _bs, _xx, _bs, _xx, _tp, _xx, _xx, _xx, _xx, _bd, _pd, // 0F30 - 0F3F 3 + _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _xx, _ba, _ba, _ba, _ba, _ba, _ba, _ba, // 0F40 - 0F4F 4 + _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, // 0F50 - 0F5F 5 + _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _xx, _xx, _xx, _xx, _xx, // 0F60 - 0F6F 6 + _xx, _ac, _av, _cs, _bv, _bv, _cs, _cs, _cs, _cs, _av, _av, _av, _av, _an, _vs, // 0F70 - 0F7F 7 + _av, _cs, _cb, _cb, _ha, _xx, _as, _as, _ba, _ba, _ba, _ba, _xx, _xx, _xx, _xx, // 0F80 - 0F8F 8 + _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _xx, _sj, _sj, _sj, _sj, _sj, _sj, _sj, // 0F90 - 0F9F 9 + _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, // 0FA0 - 0FAF a + _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _xx, _sj, _sj, // 0FB0 - 0FBF b + _xx, _xx, _xx, _xx, _xx, _xx, _bs, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FC0 - 0FCF c + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx,// 0FD0 - 0FDF d + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FE0 - 0FEF e + _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FF0 - 0FFF f +}; + + +// +// Tibetan Class Tables +// + +// +// The range of characters defined in the above table is defined here. For Tibetan 0F00 to 0FFF +// Even if the Tibetan range is bigger, most of the characters are not combinable, and therefore treated +// as _xx +static const TibetanClassTable tibetanClassTable = {0x0F00, 0x0FFF, tibetanCharClasses}; + + +// Below we define how a character in the input string is either in the tibetanCharClasses table +// (in which case we get its type back), or an unknown object in which case we get _xx (CC_RESERVED) back +TibetanClassTable::CharClass TibetanClassTable::getCharClass(LEUnicode ch) const +{ + if (ch < firstChar || ch > lastChar) { + return CC_RESERVED; + } + + return classTable[ch - firstChar]; +} + +const TibetanClassTable *TibetanClassTable::getTibetanClassTable() +{ + return &tibetanClassTable; +} + + + +class TibetanReorderingOutput : public UMemory { +private: + le_int32 fSyllableCount; + le_int32 fOutIndex; + LEUnicode *fOutChars; + + LEGlyphStorage &fGlyphStorage; + + +public: + TibetanReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage) + : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage) + { + // nothing else to do... + } + + ~TibetanReorderingOutput() + { + // nothing to do here... + } + + void reset() + { + fSyllableCount += 1; + } + + void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask featureMask) + { + LEErrorCode success = LE_NO_ERROR; + + fOutChars[fOutIndex] = ch; + + fGlyphStorage.setCharIndex(fOutIndex, charIndex, success); + fGlyphStorage.setAuxData(fOutIndex, featureMask, success); + + fOutIndex += 1; + } + + le_int32 getOutputIndex() + { + return fOutIndex; + } +}; + + +//TODO remove unused flags +#define ccmpFeatureTag LE_CCMP_FEATURE_TAG +#define blwfFeatureTag LE_BLWF_FEATURE_TAG +#define pstfFeatureTag LE_PSTF_FEATURE_TAG +#define presFeatureTag LE_PRES_FEATURE_TAG +#define blwsFeatureTag LE_BLWS_FEATURE_TAG +#define abvsFeatureTag LE_ABVS_FEATURE_TAG +#define pstsFeatureTag LE_PSTS_FEATURE_TAG + +#define blwmFeatureTag LE_BLWM_FEATURE_TAG +#define abvmFeatureTag LE_ABVM_FEATURE_TAG +#define distFeatureTag LE_DIST_FEATURE_TAG + +#define prefFeatureTag LE_PREF_FEATURE_TAG +#define abvfFeatureTag LE_ABVF_FEATURE_TAG +#define cligFeatureTag LE_CLIG_FEATURE_TAG +#define mkmkFeatureTag LE_MKMK_FEATURE_TAG + +// Shaping features +#define prefFeatureMask 0x80000000UL +#define blwfFeatureMask 0x40000000UL +#define abvfFeatureMask 0x20000000UL +#define pstfFeatureMask 0x10000000UL +#define presFeatureMask 0x08000000UL +#define blwsFeatureMask 0x04000000UL +#define abvsFeatureMask 0x02000000UL +#define pstsFeatureMask 0x01000000UL +#define cligFeatureMask 0x00800000UL +#define ccmpFeatureMask 0x00040000UL + +// Positioning features +#define distFeatureMask 0x00400000UL +#define blwmFeatureMask 0x00200000UL +#define abvmFeatureMask 0x00100000UL +#define mkmkFeatureMask 0x00080000UL + +#define tagPref (ccmpFeatureMask | prefFeatureMask | presFeatureMask | cligFeatureMask | distFeatureMask) +#define tagAbvf (ccmpFeatureMask | abvfFeatureMask | abvsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | mkmkFeatureMask) +#define tagPstf (ccmpFeatureMask | blwfFeatureMask | blwsFeatureMask | prefFeatureMask | presFeatureMask | pstfFeatureMask | pstsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask) +#define tagBlwf (ccmpFeatureMask | blwfFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask | mkmkFeatureMask) +#define tagDefault (ccmpFeatureMask | prefFeatureMask | blwfFeatureMask | presFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask | mkmkFeatureMask) + + + +// These are in the order in which the features need to be applied +// for correct processing +static const FeatureMap featureMap[] = +{ + // Shaping features + {ccmpFeatureTag, ccmpFeatureMask}, + {prefFeatureTag, prefFeatureMask}, + {blwfFeatureTag, blwfFeatureMask}, + {abvfFeatureTag, abvfFeatureMask}, + {pstfFeatureTag, pstfFeatureMask}, + {presFeatureTag, presFeatureMask}, + {blwsFeatureTag, blwsFeatureMask}, + {abvsFeatureTag, abvsFeatureMask}, + {pstsFeatureTag, pstsFeatureMask}, + {cligFeatureTag, cligFeatureMask}, + + // Positioning features + {distFeatureTag, distFeatureMask}, + {blwmFeatureTag, blwmFeatureMask}, + {abvmFeatureTag, abvmFeatureMask}, + {mkmkFeatureTag, mkmkFeatureMask}, +}; + +static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); + +// The stateTable is used to calculate the end (the length) of a well +// formed Tibetan Syllable. +// +// Each horizontal line is ordered exactly the same way as the values in TibetanClassTable +// CharClassValues in TibetanReordering.h This coincidence of values allows the +// follow up of the table. +// +// Each line corresponds to a state, which does not necessarily need to be a type +// of component... for example, state 2 is a base, with is always a first character +// in the syllable, but the state could be produced a consonant of any type when +// it is the first character that is analysed (in ground state). +// +static const le_int8 tibetanStateTable[][TibetanClassTable::CC_COUNT] = +{ + + + //Dzongkha state table + //xx ba sj tp ac cs ha bv av an cb vs as bs di pd bd + { 1, 2, 4, 3, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, 20, 21, 21,}, // 0 - ground state + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 1 - exit state (or sign to the right of the syllable) + {-1, -1, 4, 3, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 2 - Base consonant + {-1, -1, 5, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 3 - Tsa phru after base + {-1, -1, 4, 6, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 4 - Subjoined consonant after base + {-1, -1, 5, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 5 - Subjoined consonant after tsa phru + {-1, -1, -1, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 6 - Tsa phru after subjoined consonant + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 19, -1, -1, -1,}, // 7 - Pre Composed Sanskrit + {-1, -1, -1, -1, -1, -1, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 8 - A-chung + {-1, -1, -1, -1, -1, -1, -1, -1, 14, 13, 17, -1, 19, 19, -1, -1, -1,}, // 9 - Halanta + {-1, -1, -1, -1, -1, -1, -1, 11, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 10 - below vowel 1 + {-1, -1, -1, -1, -1, -1, -1, 12, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 11 - below vowel 2 + {-1, -1, -1, -1, -1, -1, -1, -1, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 12 - below vowel 3 + {-1, -1, -1, -1, -1, -1, -1, -1, 14, 17, 17, 18, 19, 19, -1, -1, -1,}, // 13 - Anusvara before vowel + {-1, -1, -1, -1, -1, -1, -1, -1, 15, 17, 17, 18, 19, 19, -1, -1, -1,}, // 14 - above vowel 1 + {-1, -1, -1, -1, -1, -1, -1, -1, 16, 17, 17, 18, 19, 19, -1, -1, -1,}, // 15 - above vowel 2 + {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 17, 18, 19, 19, -1, -1, -1,}, // 16 - above vowel 3 + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, 19, -1, -1, -1,}, // 17 - Anusvara or Candrabindu after vowel + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 19, -1, -1, -1,}, // 18 - Visarga + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 19 - strss mark + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, 21,}, // 20 - digit + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 21 - digit mark + + +}; + + +const FeatureMap *TibetanReordering::getFeatureMap(le_int32 &count) +{ + count = featureMapCount; + + return featureMap; +} + + +// Given an input string of characters and a location in which to start looking +// calculate, using the state table, which one is the last character of the syllable +// that starts in the starting position. +le_int32 TibetanReordering::findSyllable(const TibetanClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount) +{ + le_int32 cursor = prev; + le_int8 state = 0; + + while (cursor < charCount) { + TibetanClassTable::CharClass charClass = (classTable->getCharClass(chars[cursor]) & TibetanClassTable::CF_CLASS_MASK); + + state = tibetanStateTable[state][charClass]; + + if (state < 0) { + break; + } + + cursor += 1; + } + + return cursor; +} + + +// This is the real reordering function as applied to the Tibetan language + +le_int32 TibetanReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32, + LEUnicode *outChars, LEGlyphStorage &glyphStorage) +{ + const TibetanClassTable *classTable = TibetanClassTable::getTibetanClassTable(); + + TibetanReorderingOutput output(outChars, glyphStorage); + TibetanClassTable::CharClass charClass; + le_int32 i, prev = 0; + + // This loop only exits when we reach the end of a run, which may contain + // several syllables. + while (prev < charCount) { + le_int32 syllable = findSyllable(classTable, chars, prev, charCount); + + output.reset(); + + // shall we add a dotted circle? + // If in the position in which the base should be (first char in the string) there is + // a character that has the Dotted circle flag (a character that cannot be a base) + // then write a dotted circle + if (classTable->getCharClass(chars[prev]) & TibetanClassTable::CF_DOTTED_CIRCLE) { + output.writeChar(C_DOTTED_CIRCLE, prev, tagDefault); + } + + // copy the rest to output, inverting the pre-number mark if present after a digit. + for (i = prev; i < syllable; i += 1) { + charClass = classTable->getCharClass(chars[i]); + + if ((TibetanClassTable::CF_DIGIT & charClass) + && ( classTable->getCharClass(chars[i+1]) & TibetanClassTable::CF_PREDIGIT)) + { + output.writeChar(C_PRE_NUMBER_MARK, i, tagPref); + output.writeChar(chars[i], i+1 , tagPref); + i += 1; + } else { + switch (charClass & TibetanClassTable::CF_POS_MASK) { + + // If the present character is a number, and the next character is a pre-number combining mark + // then the two characters are reordered + + case TibetanClassTable::CF_POS_ABOVE : + output.writeChar(chars[i], i, tagAbvf); + break; + + case TibetanClassTable::CF_POS_AFTER : + output.writeChar(chars[i], i, tagPstf); + break; + + case TibetanClassTable::CF_POS_BELOW : + output.writeChar(chars[i], i, tagBlwf); + break; + + default: + // default - any other characters + output.writeChar(chars[i], i, tagDefault); + break; + } // switch + } // if + } // for + + prev = syllable; // move the pointer to the start of next syllable + } + + return output.getOutputIndex(); +} + + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/TibetanReordering.h b/Build/source/libs/icu/icu-50.1/layout/TibetanReordering.h new file mode 100644 index 00000000000..cafcf5646c8 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/TibetanReordering.h @@ -0,0 +1,151 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + * Developed at DIT - Government of Bhutan + * + * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> + * + * This file is a modification of the ICU file KhmerReordering.h + * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan + * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. + * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola + * + */ + +#ifndef __TIBETANREORDERING_H +#define __TIBETANORDERING_H + +/** + * \file + * \internal + */ + +// #include "LETypes.h" +// #include "OpenTypeTables.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +// Vocabulary +// Base -> A consonant in its full (not subscript) form. It is the +// center of the syllable, it can be souranded by subjoined consonants, vowels, +// signs... but there is only one base in a stack, it has to be coded as +// the first character of the syllable.Included here are also groups of base + subjoined +// which are represented by one single code point in unicode (e.g. 0F43) Also other characters that might take +// subjoined consonants or other combining characters. +// Subjoined -> Subjoined consonants and groups of subjoined consonants which have a single code-point +// to repersent the group (even if each subjoined consonant is represented independently +// by anothe code-point +// Tsa Phru --> Tsa Phru character, Bhutanese people will always place it right after the base, but sometimes, due to +// "normalization" +// is placed after all the subjoined consonants, and it is also permitted there. +// A Chung Vowel lengthening mark --> . 0F71 It is placed after the base and any subjoined consonants but before any vowels +// Precomposed Sanskrit vowels --> The are combinations of subjoined consonants + vowels that have been assigned +// a given code-point (in spite of each single part of them having also a code-point +// They are avoided, and users are encouraged to use the combination of code-points that +// represents the same sound instead of using this combined characters. This is included here +// for compatibility with possible texts that use them (they are not in the Dzongkha keyboard). +// Halanta -> The Halanta or Virama character 0F84 indicates that a consonant should not use its inheernt vowel, +// in spite of not having other vowels present. It is usually placed immediatly after a base consonant, +// but in some special cases it can also be placed after a subjoined consonant, so this is also +// permitted in this algorithm. (Halanta is always displayed in Tibetan not used as a connecting char) +// +// Subjoined vowels -> Dependent vowels (matras) placed below the base and below all subjoined consonants. There +// might be as much as three subjoined vowels in a given stack (only one in general text, but up +// to three for abreviations, they have to be permitted). +// Superscript vowels -> There are three superscript vowels, and they can be repeated or combined (up to three +// times. They can combine with subjoined vowels, and are always coded after these. +// Anusvara --> Nasalisation sign. Traditioinally placed in absence of vowels, but also after vowels. In some +// special cases it can be placed before a vowel, so this is also permitted +// Candrabindu -> Forms of the Anusvara with different glyphs (and different in identity) which can be placed +// without vowel or after the vowel, but never before. Cannot combine with Anusvara. +// Stress marks -> Marks placed above or below a syllable, affecting the whole syllable. They are combining +// marks, so they have to be attached to a specific stack. The are using to emphasise a syllable. +// +// Digits -> Digits are not considered as non-combining characters because there are a few characters which +// combine with them, so they have to be considered independently. +// Digit combining marks -> dependent marks that combine with digits. +// +// TODO +// There are a number of characters in the CJK block that are used in Tibetan script, two of these are symbols +// are used as bases for combining glyphs, and have not been encoded in Tibetan. As these characters are outside +// of the tibetan block, they have not been treated in this program. + + +struct TibetanClassTable // This list must include all types of components that can be used inside a syllable +{ + enum CharClassValues // order is important here! This order must be the same that is found in each horizontal + // line in the statetable for Tibetan (file TibetanReordering.cpp). It assigns one number + // to each type of character that has to be considered when analysing the order in which + // characters can be placed + { + CC_RESERVED = 0, //Non Combining Characters + CC_BASE = 1, // Base Consonants, Base Consonants with Subjoined attached in code point, Sanskrit base marks + CC_SUBJOINED = 2, // Subjoined Consonats, combination of more than Subjoined Consonants in the code point + CC_TSA_PHRU = 3, // Tsa-Phru character 0F39 + CC_A_CHUNG = 4, // Vowel Lenthening a-chung mark 0F71 + CC_COMP_SANSKRIT = 5, // Precomposed Sanskrit vowels including Subjoined characters and vowels + CC_HALANTA = 6, // Halanta Character 0F84 + CC_BELOW_VOWEL = 7, // Subjoined vowels + CC_ABOVE_VOWEL = 8, // Superscript vowels + CC_ANUSVARA = 9, // Tibetan sign Rjes Su Nga Ro 0F7E + CC_CANDRABINDU = 10, // Tibetan sign Sna Ldan and Nyi Zla Naa Da 0F82, 0F83 + CC_VISARGA = 11, // Tibetan sign Rnam Bcad (0F7F) + CC_ABOVE_S_MARK = 12, // Stress Marks placed above the text + CC_BELOW_S_MARK = 13, // Stress Marks placed below the text + CC_DIGIT = 14, // Dzongkha Digits + CC_PRE_DIGIT_MARK = 15, // Mark placed before the digit + CC_POST_BELOW_DIGIT_M = 16, // Mark placed below or after the digit + CC_COUNT = 17 // This is the number of character classes + }; + + enum CharClassFlags + { + CF_CLASS_MASK = 0x0000FFFF, + + CF_DOTTED_CIRCLE = 0x04000000, // add a dotted circle if a character with this flag is the first in a syllable + CF_DIGIT = 0x01000000, // flag to speed up comparaisson + CF_PREDIGIT = 0x02000000, // flag to detect pre-digit marks for reordering + + // position flags + CF_POS_BEFORE = 0x00080000, + CF_POS_BELOW = 0x00040000, + CF_POS_ABOVE = 0x00020000, + CF_POS_AFTER = 0x00010000, + CF_POS_MASK = 0x000f0000 + }; + + typedef le_uint32 CharClass; + + typedef le_int32 ScriptFlags; + + LEUnicode firstChar; // for Tibetan this will become xOF00 + LEUnicode lastChar; // and this x0FFF + const CharClass *classTable; + + CharClass getCharClass(LEUnicode ch) const; + + static const TibetanClassTable *getTibetanClassTable(); +}; + + +class TibetanReordering /* not : public UObject because all methods are static */ { +public: + static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, + LEUnicode *outChars, LEGlyphStorage &glyphStorage); + + static const FeatureMap *getFeatureMap(le_int32 &count); + +private: + // do not instantiate + TibetanReordering(); + + static le_int32 findSyllable(const TibetanClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount); + +}; + + +U_NAMESPACE_END +#endif diff --git a/Build/source/libs/icu/icu-50.1/layout/TrimmedArrayProcessor.cpp b/Build/source/libs/icu/icu-50.1/layout/TrimmedArrayProcessor.cpp new file mode 100644 index 00000000000..a68c056267f --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/TrimmedArrayProcessor.cpp @@ -0,0 +1,55 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" +#include "NonContextualGlyphSubstProc.h" +#include "TrimmedArrayProcessor.h" +#include "LEGlyphStorage.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TrimmedArrayProcessor) + +TrimmedArrayProcessor::TrimmedArrayProcessor() +{ +} + +TrimmedArrayProcessor::TrimmedArrayProcessor(const MorphSubtableHeader *morphSubtableHeader) + : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader) +{ + const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader; + + trimmedArrayLookupTable = (const TrimmedArrayLookupTable *) &header->table; + firstGlyph = SWAPW(trimmedArrayLookupTable->firstGlyph); + lastGlyph = firstGlyph + SWAPW(trimmedArrayLookupTable->glyphCount); +} + +TrimmedArrayProcessor::~TrimmedArrayProcessor() +{ +} + +void TrimmedArrayProcessor::process(LEGlyphStorage &glyphStorage) +{ + le_int32 glyphCount = glyphStorage.getGlyphCount(); + le_int32 glyph; + + for (glyph = 0; glyph < glyphCount; glyph += 1) { + LEGlyphID thisGlyph = glyphStorage[glyph]; + TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(thisGlyph); + + if ((ttGlyph > firstGlyph) && (ttGlyph < lastGlyph)) { + TTGlyphID newGlyph = SWAPW(trimmedArrayLookupTable->valueArray[ttGlyph - firstGlyph]); + + glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); + } + } +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/TrimmedArrayProcessor.h b/Build/source/libs/icu/icu-50.1/layout/TrimmedArrayProcessor.h new file mode 100644 index 00000000000..9d86980c327 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/TrimmedArrayProcessor.h @@ -0,0 +1,60 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved + * + */ + +#ifndef __TRIMMEDARRAYPROCESSOR_H +#define __TRIMMEDARRAYPROCESSOR_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "MorphTables.h" +#include "SubtableProcessor.h" +#include "NonContextualGlyphSubst.h" +#include "NonContextualGlyphSubstProc.h" + +U_NAMESPACE_BEGIN + +class LEGlyphStorage; + +class TrimmedArrayProcessor : public NonContextualGlyphSubstitutionProcessor +{ +public: + virtual void process(LEGlyphStorage &glyphStorage); + + TrimmedArrayProcessor(const MorphSubtableHeader *morphSubtableHeader); + + virtual ~TrimmedArrayProcessor(); + + /** + * ICU "poor man's RTTI", returns a UClassID for the actual class. + * + * @stable ICU 2.8 + */ + virtual UClassID getDynamicClassID() const; + + /** + * ICU "poor man's RTTI", returns a UClassID for this class. + * + * @stable ICU 2.8 + */ + static UClassID getStaticClassID(); + +private: + TrimmedArrayProcessor(); + +protected: + TTGlyphID firstGlyph; + TTGlyphID lastGlyph; + const TrimmedArrayLookupTable *trimmedArrayLookupTable; + +}; + +U_NAMESPACE_END +#endif + diff --git a/Build/source/libs/icu/icu-50.1/layout/ValueRecords.cpp b/Build/source/libs/icu/icu-50.1/layout/ValueRecords.cpp new file mode 100644 index 00000000000..bdf68468d0c --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ValueRecords.cpp @@ -0,0 +1,360 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "ValueRecords.h" +#include "DeviceTables.h" +#include "GlyphIterator.h" +#include "LESwaps.h" + +U_NAMESPACE_BEGIN + +#define Nibble(value, nibble) ((value >> (nibble * 4)) & 0xF) +#define NibbleBits(value, nibble) (bitsInNibble[Nibble(value, nibble)]) + +le_int16 ValueRecord::getFieldValue(ValueFormat valueFormat, ValueRecordField field) const +{ + le_int16 valueIndex = getFieldIndex(valueFormat, field); + le_int16 value = values[valueIndex]; + + return SWAPW(value); +} + +le_int16 ValueRecord::getFieldValue(le_int16 index, ValueFormat valueFormat, ValueRecordField field) const +{ + le_int16 baseIndex = getFieldCount(valueFormat) * index; + le_int16 valueIndex = getFieldIndex(valueFormat, field); + le_int16 value = values[baseIndex + valueIndex]; + + return SWAPW(value); +} + +void ValueRecord::adjustPosition(ValueFormat valueFormat, const char *base, GlyphIterator &glyphIterator, + const LEFontInstance *fontInstance) const +{ + float xPlacementAdjustment = 0; + float yPlacementAdjustment = 0; + float xAdvanceAdjustment = 0; + float yAdvanceAdjustment = 0; + + if ((valueFormat & vfbXPlacement) != 0) { + le_int16 value = getFieldValue(valueFormat, vrfXPlacement); + LEPoint pixels; + + fontInstance->transformFunits(value, 0, pixels); + + xPlacementAdjustment += fontInstance->getLayoutDirVertical() + ? -fontInstance->yPixelsToUnits(pixels.fY) + : fontInstance->xPixelsToUnits(pixels.fX); + yPlacementAdjustment += fontInstance->getLayoutDirVertical() + ? fontInstance->xPixelsToUnits(pixels.fX) + : fontInstance->yPixelsToUnits(pixels.fY); + } + + if ((valueFormat & vfbYPlacement) != 0) { + le_int16 value = getFieldValue(valueFormat, vrfYPlacement); + LEPoint pixels; + + fontInstance->transformFunits(0, value, pixels); + + xPlacementAdjustment += fontInstance->getLayoutDirVertical() + ? -fontInstance->yPixelsToUnits(pixels.fY) + : fontInstance->xPixelsToUnits(pixels.fX); + yPlacementAdjustment += fontInstance->getLayoutDirVertical() + ? fontInstance->xPixelsToUnits(pixels.fX) + : fontInstance->yPixelsToUnits(pixels.fY); + } + + if ((valueFormat & vfbXAdvance) != 0) { + le_int16 value = getFieldValue(valueFormat, vrfXAdvance); + LEPoint pixels; + + fontInstance->transformFunits(value, 0, pixels); + + xAdvanceAdjustment += fontInstance->getLayoutDirVertical() + ? fontInstance->yPixelsToUnits(pixels.fY) + : fontInstance->xPixelsToUnits(pixels.fX); + yAdvanceAdjustment += fontInstance->getLayoutDirVertical() + ? -fontInstance->xPixelsToUnits(pixels.fX) + : fontInstance->yPixelsToUnits(pixels.fY); + } + + if ((valueFormat & vfbYAdvance) != 0) { + le_int16 value = getFieldValue(valueFormat, vrfYAdvance); + LEPoint pixels; + + fontInstance->transformFunits(0, value, pixels); + + xAdvanceAdjustment += fontInstance->getLayoutDirVertical() + ? fontInstance->yPixelsToUnits(pixels.fY) + : fontInstance->xPixelsToUnits(pixels.fX); + yAdvanceAdjustment += fontInstance->getLayoutDirVertical() + ? -fontInstance->xPixelsToUnits(pixels.fX) + : fontInstance->yPixelsToUnits(pixels.fY); + } + + // FIXME: The device adjustments should really be transformed, but + // the only way I know how to do that is to convert them to le_int16 units, + // transform them, and then convert them back to pixels. Sigh... + if ((valueFormat & vfbAnyDevice) != 0) { + le_int16 xppem = (le_int16) fontInstance->getXPixelsPerEm(); + le_int16 yppem = (le_int16) fontInstance->getYPixelsPerEm(); + + if ((valueFormat & vfbXPlaDevice) != 0) { + Offset dtOffset = getFieldValue(valueFormat, vrfXPlaDevice); + + if (dtOffset != 0) { + const DeviceTable *dt = (const DeviceTable *) (base + dtOffset); + le_int16 xAdj = dt->getAdjustment(xppem); + + if (fontInstance->getLayoutDirVertical()) + yPlacementAdjustment += fontInstance->xPixelsToUnits(xAdj); + else + xPlacementAdjustment += fontInstance->xPixelsToUnits(xAdj); + } + } + + if ((valueFormat & vfbYPlaDevice) != 0) { + Offset dtOffset = getFieldValue(valueFormat, vrfYPlaDevice); + + if (dtOffset != 0) { + const DeviceTable *dt = (const DeviceTable *) (base + dtOffset); + le_int16 yAdj = dt->getAdjustment(yppem); + + if (fontInstance->getLayoutDirVertical()) + xPlacementAdjustment -= fontInstance->yPixelsToUnits(yAdj); + else + yPlacementAdjustment += fontInstance->yPixelsToUnits(yAdj); + } + } + + if ((valueFormat & vfbXAdvDevice) != 0) { + Offset dtOffset = getFieldValue(valueFormat, vrfXAdvDevice); + + if (dtOffset != 0) { + const DeviceTable *dt = (const DeviceTable *) (base + dtOffset); + le_int16 xAdj = dt->getAdjustment(xppem); + + if (fontInstance->getLayoutDirVertical()) + yAdvanceAdjustment -= fontInstance->xPixelsToUnits(xAdj); + else + xAdvanceAdjustment += fontInstance->xPixelsToUnits(xAdj); + } + } + + if ((valueFormat & vfbYAdvDevice) != 0) { + Offset dtOffset = getFieldValue(valueFormat, vrfYAdvDevice); + + if (dtOffset != 0) { + const DeviceTable *dt = (const DeviceTable *) (base + dtOffset); + le_int16 yAdj = dt->getAdjustment(yppem); + + if (fontInstance->getLayoutDirVertical()) + xAdvanceAdjustment += fontInstance->yPixelsToUnits(yAdj); + else + yAdvanceAdjustment += fontInstance->yPixelsToUnits(yAdj); + } + } + } + + glyphIterator.adjustCurrGlyphPositionAdjustment( + xPlacementAdjustment, yPlacementAdjustment, xAdvanceAdjustment, yAdvanceAdjustment); +} + +void ValueRecord::adjustPosition(le_int16 index, ValueFormat valueFormat, const char *base, GlyphIterator &glyphIterator, + const LEFontInstance *fontInstance) const +{ + float xPlacementAdjustment = 0; + float yPlacementAdjustment = 0; + float xAdvanceAdjustment = 0; + float yAdvanceAdjustment = 0; + + if ((valueFormat & vfbXPlacement) != 0) { + le_int16 value = getFieldValue(index, valueFormat, vrfXPlacement); + LEPoint pixels; + + fontInstance->transformFunits(value, 0, pixels); + + xPlacementAdjustment += fontInstance->getLayoutDirVertical() + ? -fontInstance->yPixelsToUnits(pixels.fY) + : fontInstance->xPixelsToUnits(pixels.fX); + yPlacementAdjustment += fontInstance->getLayoutDirVertical() + ? fontInstance->xPixelsToUnits(pixels.fX) + : fontInstance->yPixelsToUnits(pixels.fY); + } + + if ((valueFormat & vfbYPlacement) != 0) { + le_int16 value = getFieldValue(index, valueFormat, vrfYPlacement); + LEPoint pixels; + + fontInstance->transformFunits(0, value, pixels); + + xPlacementAdjustment += fontInstance->getLayoutDirVertical() + ? -fontInstance->yPixelsToUnits(pixels.fY) + : fontInstance->xPixelsToUnits(pixels.fX); + yPlacementAdjustment += fontInstance->getLayoutDirVertical() + ? fontInstance->xPixelsToUnits(pixels.fX) + : fontInstance->yPixelsToUnits(pixels.fY); + } + + if ((valueFormat & vfbXAdvance) != 0) { + le_int16 value = getFieldValue(index, valueFormat, vrfXAdvance); + LEPoint pixels; + + fontInstance->transformFunits(value, 0, pixels); + + xAdvanceAdjustment += fontInstance->getLayoutDirVertical() + ? fontInstance->yPixelsToUnits(pixels.fY) + : fontInstance->xPixelsToUnits(pixels.fX); + yAdvanceAdjustment += fontInstance->getLayoutDirVertical() + ? -fontInstance->xPixelsToUnits(pixels.fX) + : fontInstance->yPixelsToUnits(pixels.fY); + } + + if ((valueFormat & vfbYAdvance) != 0) { + le_int16 value = getFieldValue(index, valueFormat, vrfYAdvance); + LEPoint pixels; + + fontInstance->transformFunits(0, value, pixels); + + xAdvanceAdjustment += fontInstance->getLayoutDirVertical() + ? fontInstance->yPixelsToUnits(pixels.fY) + : fontInstance->xPixelsToUnits(pixels.fX); + yAdvanceAdjustment += fontInstance->getLayoutDirVertical() + ? -fontInstance->xPixelsToUnits(pixels.fX) + : fontInstance->yPixelsToUnits(pixels.fY); + } + + // FIXME: The device adjustments should really be transformed, but + // the only way I know how to do that is to convert them to le_int16 units, + // transform them, and then convert them back to pixels. Sigh... + if ((valueFormat & vfbAnyDevice) != 0) { + le_int16 xppem = (le_int16) fontInstance->getXPixelsPerEm(); + le_int16 yppem = (le_int16) fontInstance->getYPixelsPerEm(); + + if ((valueFormat & vfbXPlaDevice) != 0) { + Offset dtOffset = getFieldValue(index, valueFormat, vrfXPlaDevice); + + if (dtOffset != 0) { + const DeviceTable *dt = (const DeviceTable *) (base + dtOffset); + le_int16 xAdj = dt->getAdjustment(xppem); + + if (fontInstance->getLayoutDirVertical()) + yPlacementAdjustment += fontInstance->xPixelsToUnits(xAdj); + else + xPlacementAdjustment += fontInstance->xPixelsToUnits(xAdj); + } + } + + if ((valueFormat & vfbYPlaDevice) != 0) { + Offset dtOffset = getFieldValue(index, valueFormat, vrfYPlaDevice); + + if (dtOffset != 0) { + const DeviceTable *dt = (const DeviceTable *) (base + dtOffset); + le_int16 yAdj = dt->getAdjustment(yppem); + + if (fontInstance->getLayoutDirVertical()) + xPlacementAdjustment -= fontInstance->yPixelsToUnits(yAdj); + else + yPlacementAdjustment += fontInstance->yPixelsToUnits(yAdj); + } + } + + if ((valueFormat & vfbXAdvDevice) != 0) { + Offset dtOffset = getFieldValue(index, valueFormat, vrfXAdvDevice); + + if (dtOffset != 0) { + const DeviceTable *dt = (const DeviceTable *) (base + dtOffset); + le_int16 xAdj = dt->getAdjustment(xppem); + + if (fontInstance->getLayoutDirVertical()) + yAdvanceAdjustment -= fontInstance->xPixelsToUnits(xAdj); + else + xAdvanceAdjustment += fontInstance->xPixelsToUnits(xAdj); + } + } + + if ((valueFormat & vfbYAdvDevice) != 0) { + Offset dtOffset = getFieldValue(index, valueFormat, vrfYAdvDevice); + + if (dtOffset != 0) { + const DeviceTable *dt = (const DeviceTable *) (base + dtOffset); + le_int16 yAdj = dt->getAdjustment(yppem); + + if (fontInstance->getLayoutDirVertical()) + xAdvanceAdjustment += fontInstance->yPixelsToUnits(yAdj); + else + yAdvanceAdjustment += fontInstance->yPixelsToUnits(yAdj); + } + } + } + + glyphIterator.adjustCurrGlyphPositionAdjustment( + xPlacementAdjustment, yPlacementAdjustment, xAdvanceAdjustment, yAdvanceAdjustment); +} + +le_int16 ValueRecord::getSize(ValueFormat valueFormat) +{ + return getFieldCount(valueFormat) * sizeof(le_int16); +} + +le_int16 ValueRecord::getFieldCount(ValueFormat valueFormat) +{ + static const le_int16 bitsInNibble[] = + { + 0 + 0 + 0 + 0, + 0 + 0 + 0 + 1, + 0 + 0 + 1 + 0, + 0 + 0 + 1 + 1, + 0 + 1 + 0 + 0, + 0 + 1 + 0 + 1, + 0 + 1 + 1 + 0, + 0 + 1 + 1 + 1, + 1 + 0 + 0 + 0, + 1 + 0 + 0 + 1, + 1 + 0 + 1 + 0, + 1 + 0 + 1 + 1, + 1 + 1 + 0 + 0, + 1 + 1 + 0 + 1, + 1 + 1 + 1 + 0, + 1 + 1 + 1 + 1 + }; + + valueFormat &= ~vfbReserved; + + return NibbleBits(valueFormat, 0) + NibbleBits(valueFormat, 1) + + NibbleBits(valueFormat, 2) + NibbleBits(valueFormat, 3); +} + +le_int16 ValueRecord::getFieldIndex(ValueFormat valueFormat, ValueRecordField field) +{ + static const le_uint16 beforeMasks[] = + { + 0x0000, + 0x0001, + 0x0003, + 0x0007, + 0x000F, + 0x001F, + 0x003F, + 0x007F, + 0x00FF, + 0x01FF, + 0x03FF, + 0x07FF, + 0x0FFF, + 0x1FFF, + 0x3FFF, + 0x7FFF, + 0xFFFF + }; + + return getFieldCount(valueFormat & beforeMasks[field]); +} + +U_NAMESPACE_END diff --git a/Build/source/libs/icu/icu-50.1/layout/ValueRecords.h b/Build/source/libs/icu/icu-50.1/layout/ValueRecords.h new file mode 100644 index 00000000000..83db7b31972 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/ValueRecords.h @@ -0,0 +1,72 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved + * + */ + +#ifndef __VALUERECORDS_H +#define __VALUERECORDS_H + +/** + * \file + * \internal + */ + +#include "LETypes.h" +#include "LEFontInstance.h" +#include "OpenTypeTables.h" +#include "GlyphIterator.h" + +U_NAMESPACE_BEGIN + +typedef le_uint16 ValueFormat; +typedef le_int16 ValueRecordField; + +struct ValueRecord +{ + le_int16 values[ANY_NUMBER]; + + le_int16 getFieldValue(ValueFormat valueFormat, ValueRecordField field) const; + le_int16 getFieldValue(le_int16 index, ValueFormat valueFormat, ValueRecordField field) const; + void adjustPosition(ValueFormat valueFormat, const char *base, GlyphIterator &glyphIterator, + const LEFontInstance *fontInstance) const; + void adjustPosition(le_int16 index, ValueFormat valueFormat, const char *base, GlyphIterator &glyphIterator, + const LEFontInstance *fontInstance) const; + + static le_int16 getSize(ValueFormat valueFormat); + +private: + static le_int16 getFieldCount(ValueFormat valueFormat); + static le_int16 getFieldIndex(ValueFormat valueFormat, ValueRecordField field); +}; + +enum ValueRecordFields +{ + vrfXPlacement = 0, + vrfYPlacement = 1, + vrfXAdvance = 2, + vrfYAdvance = 3, + vrfXPlaDevice = 4, + vrfYPlaDevice = 5, + vrfXAdvDevice = 6, + vrfYAdvDevice = 7 +}; + +enum ValueFormatBits +{ + vfbXPlacement = 0x0001, + vfbYPlacement = 0x0002, + vfbXAdvance = 0x0004, + vfbYAdvance = 0x0008, + vfbXPlaDevice = 0x0010, + vfbYPlaDevice = 0x0020, + vfbXAdvDevice = 0x0040, + vfbYAdvDevice = 0x0080, + vfbReserved = 0xFF00, + vfbAnyDevice = vfbXPlaDevice + vfbYPlaDevice + vfbXAdvDevice + vfbYAdvDevice +}; + +U_NAMESPACE_END +#endif + + diff --git a/Build/source/libs/icu/icu-50.1/layout/layout.rc b/Build/source/libs/icu/icu-50.1/layout/layout.rc new file mode 100644 index 00000000000..b8c512d3cbd --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/layout.rc @@ -0,0 +1,108 @@ +// Do not edit with Microsoft Developer Studio Resource Editor. +// It will permanently substitute version numbers that are intended to be +// picked up by the pre-processor during each build. +// Copyright (c) 2001-2010 International Business Machines +// Corporation and others. All Rights Reserved. +// +#include "../common/msvcres.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include <winresrc.h> +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1252) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "../common/msvcres.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include <winresrc.h>\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// +#define STR(s) #s +#define CommaVersionString(a, b, c, d) STR(a) ", " STR(b) ", " STR(c) ", " STR(d) "\0" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM + PRODUCTVERSION U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "00000000" + BEGIN + VALUE "Comments", ICU_WEBSITE "\0" + VALUE "CompanyName", ICU_COMPANY "\0" + VALUE "FileDescription", ICU_PRODUCT_PREFIX " Layout DLL\0" + VALUE "FileVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM) + VALUE "LegalCopyright", U_COPYRIGHT_STRING "\0" +#ifdef _DEBUG + VALUE "OriginalFilename", "icule" U_ICU_VERSION_SHORT "d.dll\0" +#else + VALUE "OriginalFilename", "icule" U_ICU_VERSION_SHORT ".dll\0" +#endif + VALUE "PrivateBuild", "\0" + VALUE "ProductName", ICU_PRODUCT "\0" + VALUE "ProductVersion", CommaVersionString(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, U_ICU_VERSION_PATCHLEVEL_NUM, U_ICU_VERSION_BUILDLEVEL_NUM) + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x000, 0000 + END +END + +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Build/source/libs/icu/icu-50.1/layout/layout.vcxproj b/Build/source/libs/icu/icu-50.1/layout/layout.vcxproj new file mode 100644 index 00000000000..f71b332ab07 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/layout.vcxproj @@ -0,0 +1,552 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{C920062A-0647-4553-A3B2-37C58065664B}</ProjectGuid> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseOfMfc>false</UseOfMfc> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Midl> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MkTypLibCompatible>true</MkTypLibCompatible> + <SuppressStartupBanner>true</SuppressStartupBanner> + <TargetEnvironment>Win32</TargetEnvironment> + <TypeLibraryName>.\..\..\lib\iculed.tlb</TypeLibraryName> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_LAYOUT_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <DisableLanguageExtensions>true</DisableLanguageExtensions> + <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> + <PrecompiledHeaderOutputFile>.\x86\Debug/layout.pch</PrecompiledHeaderOutputFile> + <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation> + <ObjectFileName>.\x86\Debug/</ObjectFileName> + <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level3</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + <CompileAs>Default</CompileAs> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <OutputFile>..\..\bin\icule50d.dll</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>.\..\..\lib\iculed.pdb</ProgramDatabaseFile> + <BaseAddress>0x4ac00000</BaseAddress> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <DataExecutionPrevention> + </DataExecutionPrevention> + <ImportLibrary>..\..\lib\iculed.lib</ImportLibrary> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Midl> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MkTypLibCompatible>true</MkTypLibCompatible> + <SuppressStartupBanner>true</SuppressStartupBanner> + <TargetEnvironment>Win32</TargetEnvironment> + <TypeLibraryName>.\..\..\lib\icule.tlb</TypeLibraryName> + </Midl> + <ClCompile> + <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_LAYOUT_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <DisableLanguageExtensions>true</DisableLanguageExtensions> + <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> + <PrecompiledHeaderOutputFile>.\x86\Release/layout.pch</PrecompiledHeaderOutputFile> + <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation> + <ObjectFileName>.\x86\Release/</ObjectFileName> + <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName> + <WarningLevel>Level3</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <CompileAs>Default</CompileAs> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <OutputFile>..\..\bin\icule50.dll</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <ProgramDatabaseFile>.\..\..\lib\icule.pdb</ProgramDatabaseFile> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <BaseAddress>0x4ac00000</BaseAddress> + <RandomizedBaseAddress>false</RandomizedBaseAddress> + <DataExecutionPrevention> + </DataExecutionPrevention> + <ImportLibrary>..\..\lib\icule.lib</ImportLibrary> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Midl> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MkTypLibCompatible>true</MkTypLibCompatible> + <SuppressStartupBanner>true</SuppressStartupBanner> + <TargetEnvironment>X64</TargetEnvironment> + <TypeLibraryName>.\..\..\lib64\iculed.tlb</TypeLibraryName> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_LAYOUT_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <BufferSecurityCheck>true</BufferSecurityCheck> + <DisableLanguageExtensions>true</DisableLanguageExtensions> + <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> + <PrecompiledHeaderOutputFile>.\x64\Debug/layout.pch</PrecompiledHeaderOutputFile> + <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation> + <ObjectFileName>.\x64\Debug/</ObjectFileName> + <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName> + <BrowseInformation>true</BrowseInformation> + <WarningLevel>Level3</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <CompileAs>Default</CompileAs> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <OutputFile>..\..\bin64\icule50d.dll</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>.\..\..\lib64\iculed.pdb</ProgramDatabaseFile> + <BaseAddress>0x4ac00000</BaseAddress> + <ImportLibrary>..\..\lib64\iculed.lib</ImportLibrary> + <TargetMachine>MachineX64</TargetMachine> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Midl> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MkTypLibCompatible>true</MkTypLibCompatible> + <SuppressStartupBanner>true</SuppressStartupBanner> + <TargetEnvironment>X64</TargetEnvironment> + <TypeLibraryName>.\..\..\lib64\icule.tlb</TypeLibraryName> + </Midl> + <ClCompile> + <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_LAYOUT_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <StringPooling>true</StringPooling> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <DisableLanguageExtensions>true</DisableLanguageExtensions> + <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType> + <PrecompiledHeaderOutputFile>.\x64\Release/layout.pch</PrecompiledHeaderOutputFile> + <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation> + <ObjectFileName>.\x64\Release/</ObjectFileName> + <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName> + <WarningLevel>Level3</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <CompileAs>Default</CompileAs> + </ClCompile> + <ResourceCompile> + <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <Culture>0x0409</Culture> + <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ResourceCompile> + <Link> + <OutputFile>..\..\bin64\icule50.dll</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <ProgramDatabaseFile>.\..\..\lib64\icule.pdb</ProgramDatabaseFile> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <BaseAddress>0x4ac00000</BaseAddress> + <ImportLibrary>..\..\lib64\icule.lib</ImportLibrary> + <TargetMachine>MachineX64</TargetMachine> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="AlternateSubstSubtables.cpp" /> + <ClCompile Include="AnchorTables.cpp" /> + <ClCompile Include="ArabicLayoutEngine.cpp" /> + <ClCompile Include="ArabicShaping.cpp" /> + <ClCompile Include="CanonData.cpp" /> + <ClCompile Include="CanonShaping.cpp" /> + <ClCompile Include="ClassDefinitionTables.cpp" /> + <ClCompile Include="ContextualGlyphSubstProc.cpp" /> + <ClCompile Include="ContextualSubstSubtables.cpp" /> + <ClCompile Include="CoverageTables.cpp" /> + <ClCompile Include="CursiveAttachmentSubtables.cpp" /> + <ClCompile Include="DeviceTables.cpp" /> + <ClCompile Include="ExtensionSubtables.cpp" /> + <ClCompile Include="Features.cpp" /> + <ClCompile Include="GDEFMarkFilter.cpp" /> + <ClCompile Include="GlyphDefinitionTables.cpp" /> + <ClCompile Include="GlyphIterator.cpp" /> + <ClCompile Include="GlyphLookupTables.cpp" /> + <ClCompile Include="GlyphPositionAdjustments.cpp" /> + <ClCompile Include="GlyphPositioningTables.cpp" /> + <ClCompile Include="GlyphPosnLookupProc.cpp" /> + <ClCompile Include="GlyphSubstitutionTables.cpp" /> + <ClCompile Include="GlyphSubstLookupProc.cpp" /> + <ClCompile Include="GXLayoutEngine.cpp" /> + <ClCompile Include="HangulLayoutEngine.cpp" /> + <ClCompile Include="HanLayoutEngine.cpp" /> + <ClCompile Include="IndicClassTables.cpp" /> + <ClCompile Include="IndicLayoutEngine.cpp" /> + <ClCompile Include="IndicRearrangementProcessor.cpp" /> + <ClCompile Include="IndicReordering.cpp" /> + <ClCompile Include="KernTable.cpp" /> + <ClCompile Include="KhmerLayoutEngine.cpp" /> + <ClCompile Include="KhmerReordering.cpp" /> + <ClCompile Include="LayoutEngine.cpp" /> + <ClCompile Include="LEFontInstance.cpp" /> + <ClCompile Include="LEGlyphStorage.cpp" /> + <ClCompile Include="LEInsertionList.cpp" /> + <ClCompile Include="LigatureSubstProc.cpp" /> + <ClCompile Include="LigatureSubstSubtables.cpp" /> + <ClCompile Include="loengine.cpp" /> + <ClCompile Include="LookupProcessor.cpp" /> + <ClCompile Include="Lookups.cpp" /> + <ClCompile Include="LookupTables.cpp" /> + <ClCompile Include="MarkArrays.cpp" /> + <ClCompile Include="MarkToBasePosnSubtables.cpp" /> + <ClCompile Include="MarkToLigaturePosnSubtables.cpp" /> + <ClCompile Include="MarkToMarkPosnSubtables.cpp" /> + <ClCompile Include="MirroredCharData.cpp" /> + <ClCompile Include="MorphTables.cpp" /> + <ClCompile Include="MPreFixups.cpp" /> + <ClCompile Include="MultipleSubstSubtables.cpp" /> + <ClCompile Include="NonContextualGlyphSubstProc.cpp" /> + <ClCompile Include="OpenTypeLayoutEngine.cpp" /> + <ClCompile Include="OpenTypeUtilities.cpp" /> + <ClCompile Include="PairPositioningSubtables.cpp" /> + <ClCompile Include="ScriptAndLanguage.cpp" /> + <ClCompile Include="ScriptAndLanguageTags.cpp" /> + <ClCompile Include="SegmentArrayProcessor.cpp" /> + <ClCompile Include="SegmentSingleProcessor.cpp" /> + <ClCompile Include="ShapingTypeData.cpp" /> + <ClCompile Include="SimpleArrayProcessor.cpp" /> + <ClCompile Include="SinglePositioningSubtables.cpp" /> + <ClCompile Include="SingleSubstitutionSubtables.cpp" /> + <ClCompile Include="SingleTableProcessor.cpp" /> + <ClCompile Include="StateTableProcessor.cpp" /> + <ClCompile Include="SubstitutionLookups.cpp" /> + <ClCompile Include="SubtableProcessor.cpp" /> + <ClCompile Include="ThaiLayoutEngine.cpp" /> + <ClCompile Include="ThaiShaping.cpp" /> + <ClCompile Include="ThaiStateTables.cpp" /> + <ClCompile Include="TibetanLayoutEngine.cpp" /> + <ClCompile Include="TibetanReordering.cpp" /> + <ClCompile Include="TrimmedArrayProcessor.cpp" /> + <ClCompile Include="ValueRecords.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="AlternateSubstSubtables.h" /> + <ClInclude Include="AnchorTables.h" /> + <ClInclude Include="ArabicLayoutEngine.h" /> + <ClInclude Include="ArabicShaping.h" /> + <ClInclude Include="AttachmentPosnSubtables.h" /> + <ClInclude Include="CanonShaping.h" /> + <ClInclude Include="CharSubstitutionFilter.h" /> + <ClInclude Include="ClassDefinitionTables.h" /> + <ClInclude Include="ContextualGlyphInsertion.h" /> + <ClInclude Include="ContextualGlyphSubstitution.h" /> + <ClInclude Include="ContextualGlyphSubstProc.h" /> + <ClInclude Include="ContextualSubstSubtables.h" /> + <ClInclude Include="CoverageTables.h" /> + <ClInclude Include="CursiveAttachmentSubtables.h" /> + <ClInclude Include="DefaultCharMapper.h" /> + <ClInclude Include="DeviceTables.h" /> + <ClInclude Include="ExtensionSubtables.h" /> + <ClInclude Include="GDEFMarkFilter.h" /> + <ClInclude Include="GlyphDefinitionTables.h" /> + <ClInclude Include="GlyphIterator.h" /> + <ClInclude Include="GlyphLookupTables.h" /> + <ClInclude Include="GlyphPositionAdjustments.h" /> + <ClInclude Include="GlyphPositioningTables.h" /> + <ClInclude Include="GlyphPosnLookupProc.h" /> + <ClInclude Include="GlyphSubstitutionTables.h" /> + <ClInclude Include="GlyphSubstLookupProc.h" /> + <ClInclude Include="GXLayoutEngine.h" /> + <ClInclude Include="HangulLayoutEngine.h" /> + <ClInclude Include="HanLayoutEngine.h" /> + <ClInclude Include="ICUFeatures.h" /> + <ClInclude Include="IndicLayoutEngine.h" /> + <ClInclude Include="IndicRearrangement.h" /> + <ClInclude Include="IndicRearrangementProcessor.h" /> + <ClInclude Include="IndicReordering.h" /> + <ClInclude Include="KernTable.h" /> + <ClInclude Include="KhmerLayoutEngine.h" /> + <ClInclude Include="KhmerReordering.h" /> + <CustomBuild Include="LayoutEngine.h"> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + </CustomBuild> + <ClInclude Include="LayoutTables.h" /> + <CustomBuild Include="LEFontInstance.h"> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + </CustomBuild> + <CustomBuild Include="LEGlyphFilter.h"> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + </CustomBuild> + <CustomBuild Include="LEGlyphStorage.h"> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + </CustomBuild> + <CustomBuild Include="LEInsertionList.h"> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + </CustomBuild> + <CustomBuild Include="LELanguages.h"> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + </CustomBuild> + <CustomBuild Include="LEScripts.h"> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + </CustomBuild> + <CustomBuild Include="LESwaps.h"> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + </CustomBuild> + <CustomBuild Include="LETypes.h"> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + </CustomBuild> + <ClInclude Include="LigatureSubstitution.h" /> + <ClInclude Include="LigatureSubstProc.h" /> + <ClInclude Include="LigatureSubstSubtables.h" /> + <CustomBuild Include="loengine.h"> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\layout +</Command> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\layout\%(Filename)%(Extension);%(Outputs)</Outputs> + </CustomBuild> + <ClInclude Include="LookupProcessor.h" /> + <ClInclude Include="Lookups.h" /> + <ClInclude Include="LookupTables.h" /> + <ClInclude Include="MarkArrays.h" /> + <ClInclude Include="MarkToBasePosnSubtables.h" /> + <ClInclude Include="MarkToLigaturePosnSubtables.h" /> + <ClInclude Include="MarkToMarkPosnSubtables.h" /> + <ClInclude Include="MorphStateTables.h" /> + <ClInclude Include="MorphTables.h" /> + <ClInclude Include="MPreFixups.h" /> + <ClInclude Include="MultipleSubstSubtables.h" /> + <ClInclude Include="NonContextualGlyphSubst.h" /> + <ClInclude Include="NonContextualGlyphSubstProc.h" /> + <ClInclude Include="OpenTypeLayoutEngine.h" /> + <ClInclude Include="OpenTypeTables.h" /> + <ClInclude Include="OpenTypeUtilities.h" /> + <ClInclude Include="PairPositioningSubtables.h" /> + <ClInclude Include="ScriptAndLanguage.h" /> + <ClInclude Include="ScriptAndLanguageTags.h" /> + <ClInclude Include="SegmentArrayProcessor.h" /> + <ClInclude Include="SegmentSingleProcessor.h" /> + <ClInclude Include="SimpleArrayProcessor.h" /> + <ClInclude Include="SinglePositioningSubtables.h" /> + <ClInclude Include="SingleSubstitutionSubtables.h" /> + <ClInclude Include="SingleTableProcessor.h" /> + <ClInclude Include="StateTableProcessor.h" /> + <ClInclude Include="StateTables.h" /> + <ClInclude Include="SubstitutionLookups.h" /> + <ClInclude Include="SubtableProcessor.h" /> + <ClInclude Include="ThaiLayoutEngine.h" /> + <ClInclude Include="ThaiShaping.h" /> + <ClInclude Include="TibetanLayoutEngine.h" /> + <ClInclude Include="TibetanReordering.h" /> + <ClInclude Include="TrimmedArrayProcessor.h" /> + <ClInclude Include="ValueRecords.h" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="layout.rc" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\common\common.vcxproj"> + <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project> + <ReferenceOutputAssembly>false</ReferenceOutputAssembly> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> diff --git a/Build/source/libs/icu/icu-50.1/layout/layout.vcxproj.filters b/Build/source/libs/icu/icu-50.1/layout/layout.vcxproj.filters new file mode 100644 index 00000000000..33a68fd665e --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/layout.vcxproj.filters @@ -0,0 +1,508 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{612bee68-b22e-47ed-8cb2-2c5ca5ea6350}</UniqueIdentifier> + <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{6ccc0372-c74a-4a85-b31a-da1c0c72b56d}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{ea7162f2-e3c7-47a7-98aa-e19c06f9e195}</UniqueIdentifier> + <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="AlternateSubstSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="AnchorTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ArabicLayoutEngine.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ArabicShaping.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="CanonData.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="CanonShaping.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ClassDefinitionTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ContextualGlyphSubstProc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ContextualSubstSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="CoverageTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="CursiveAttachmentSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="DeviceTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ExtensionSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="Features.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="GDEFMarkFilter.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="GlyphDefinitionTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="GlyphIterator.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="GlyphLookupTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="GlyphPositionAdjustments.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="GlyphPositioningTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="GlyphPosnLookupProc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="GlyphSubstitutionTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="GlyphSubstLookupProc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="GXLayoutEngine.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="HangulLayoutEngine.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="HanLayoutEngine.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="IndicClassTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="IndicLayoutEngine.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="IndicRearrangementProcessor.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="IndicReordering.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="KernTable.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="KhmerLayoutEngine.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="KhmerReordering.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="LayoutEngine.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="LEFontInstance.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="LEGlyphStorage.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="LEInsertionList.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="LigatureSubstProc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="LigatureSubstSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="loengine.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="LookupProcessor.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="Lookups.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="LookupTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="MarkArrays.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="MarkToBasePosnSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="MarkToLigaturePosnSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="MarkToMarkPosnSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="MirroredCharData.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="MorphTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="MPreFixups.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="MultipleSubstSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="NonContextualGlyphSubstProc.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="OpenTypeLayoutEngine.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="OpenTypeUtilities.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="PairPositioningSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ScriptAndLanguage.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ScriptAndLanguageTags.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SegmentArrayProcessor.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SegmentSingleProcessor.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ShapingTypeData.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SimpleArrayProcessor.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SinglePositioningSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SingleSubstitutionSubtables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SingleTableProcessor.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="StateTableProcessor.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SubstitutionLookups.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="SubtableProcessor.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ThaiLayoutEngine.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ThaiShaping.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ThaiStateTables.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="TibetanLayoutEngine.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="TibetanReordering.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="TrimmedArrayProcessor.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="ValueRecords.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="AlternateSubstSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="AnchorTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ArabicLayoutEngine.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ArabicShaping.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="AttachmentPosnSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="CanonShaping.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="CharSubstitutionFilter.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ClassDefinitionTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ContextualGlyphInsertion.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ContextualGlyphSubstitution.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ContextualGlyphSubstProc.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ContextualSubstSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="CoverageTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="CursiveAttachmentSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="DefaultCharMapper.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="DeviceTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ExtensionSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="GDEFMarkFilter.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="GlyphDefinitionTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="GlyphIterator.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="GlyphLookupTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="GlyphPositionAdjustments.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="GlyphPositioningTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="GlyphPosnLookupProc.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="GlyphSubstitutionTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="GlyphSubstLookupProc.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="GXLayoutEngine.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="HangulLayoutEngine.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="HanLayoutEngine.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ICUFeatures.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="IndicLayoutEngine.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="IndicRearrangement.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="IndicRearrangementProcessor.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="IndicReordering.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="KernTable.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="KhmerLayoutEngine.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="KhmerReordering.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="LayoutTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="LigatureSubstitution.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="LigatureSubstProc.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="LigatureSubstSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="LookupProcessor.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="Lookups.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="LookupTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="MarkArrays.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="MarkToBasePosnSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="MarkToLigaturePosnSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="MarkToMarkPosnSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="MorphStateTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="MorphTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="MPreFixups.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="MultipleSubstSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="NonContextualGlyphSubst.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="NonContextualGlyphSubstProc.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="OpenTypeLayoutEngine.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="OpenTypeTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="OpenTypeUtilities.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="PairPositioningSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ScriptAndLanguage.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ScriptAndLanguageTags.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="SegmentArrayProcessor.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="SegmentSingleProcessor.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="SimpleArrayProcessor.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="SinglePositioningSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="SingleSubstitutionSubtables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="SingleTableProcessor.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="StateTableProcessor.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="StateTables.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="SubstitutionLookups.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="SubtableProcessor.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ThaiLayoutEngine.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ThaiShaping.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="TibetanLayoutEngine.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="TibetanReordering.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="TrimmedArrayProcessor.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="ValueRecords.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="layout.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> + <ItemGroup> + <CustomBuild Include="LayoutEngine.h"> + <Filter>Header Files</Filter> + </CustomBuild> + <CustomBuild Include="LEFontInstance.h"> + <Filter>Header Files</Filter> + </CustomBuild> + <CustomBuild Include="LEGlyphFilter.h"> + <Filter>Header Files</Filter> + </CustomBuild> + <CustomBuild Include="LEGlyphStorage.h"> + <Filter>Header Files</Filter> + </CustomBuild> + <CustomBuild Include="LEInsertionList.h"> + <Filter>Header Files</Filter> + </CustomBuild> + <CustomBuild Include="LELanguages.h"> + <Filter>Header Files</Filter> + </CustomBuild> + <CustomBuild Include="LEScripts.h"> + <Filter>Header Files</Filter> + </CustomBuild> + <CustomBuild Include="LESwaps.h"> + <Filter>Header Files</Filter> + </CustomBuild> + <CustomBuild Include="LETypes.h"> + <Filter>Header Files</Filter> + </CustomBuild> + <CustomBuild Include="loengine.h"> + <Filter>Header Files</Filter> + </CustomBuild> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/Build/source/libs/icu/icu-50.1/layout/loengine.cpp b/Build/source/libs/icu/icu-50.1/layout/loengine.cpp new file mode 100644 index 00000000000..3718b9f6f8a --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/loengine.cpp @@ -0,0 +1,163 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved + * + */ + +#include "LETypes.h" +#include "loengine.h" +#include "LayoutEngine.h" + +/** + * \file + * \brief C API for complex text layout. + */ + +U_NAMESPACE_USE + +U_CAPI le_engine * U_EXPORT2 +le_create(const le_font *font, + le_int32 scriptCode, + le_int32 languageCode, + le_int32 typo_flags, + LEErrorCode *success) +{ + LEFontInstance *fontInstance = (LEFontInstance *) font; + + return (le_engine *) LayoutEngine::layoutEngineFactory(fontInstance, scriptCode, languageCode, typo_flags, *success); +} + +U_CAPI void U_EXPORT2 +le_close(le_engine *engine) +{ + LayoutEngine *le = (LayoutEngine *) engine; + + delete le; +} + +U_CAPI le_int32 U_EXPORT2 +le_layoutChars(le_engine *engine, + const LEUnicode chars[], + le_int32 offset, + le_int32 count, + le_int32 max, + le_bool rightToLeft, + float x, + float y, + LEErrorCode *success) +{ + LayoutEngine *le = (LayoutEngine *) engine; + + if (le == NULL) { + *success = LE_ILLEGAL_ARGUMENT_ERROR; + return -1; + } + + return le->layoutChars(chars, offset, count, max, rightToLeft, x, y, *success); +} + +U_CAPI le_int32 U_EXPORT2 +le_getGlyphCount(le_engine *engine, + LEErrorCode *success) +{ + LayoutEngine *le = (LayoutEngine *) engine; + + if (le == NULL) { + *success = LE_ILLEGAL_ARGUMENT_ERROR; + return -1; + } + + return le->getGlyphCount(); +} + +U_CAPI void U_EXPORT2 +le_getGlyphs(le_engine *engine, + LEGlyphID glyphs[], + LEErrorCode *success) +{ + LayoutEngine *le = (LayoutEngine *) engine; + + if (le == NULL) { + *success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + le->getGlyphs(glyphs, *success); +} + +U_CAPI void U_EXPORT2 +le_getCharIndices(le_engine *engine, + le_int32 charIndices[], + LEErrorCode *success) +{ + LayoutEngine *le = (LayoutEngine *) engine; + + if (le == NULL) { + *success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + le->getCharIndices(charIndices, *success); +} + +U_CAPI void U_EXPORT2 +le_getCharIndicesWithBase(le_engine *engine, + le_int32 charIndices[], + le_int32 indexBase, + LEErrorCode *success) +{ + LayoutEngine *le = (LayoutEngine *) engine; + + if (le == NULL) { + *success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + le->getCharIndices(charIndices, indexBase, *success); +} + +U_CAPI void U_EXPORT2 +le_getGlyphPositions(le_engine *engine, + float positions[], + LEErrorCode *success) +{ + LayoutEngine *le = (LayoutEngine *) engine; + + if (le == NULL) { + *success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + le->getGlyphPositions(positions, *success); +} + +U_CAPI void U_EXPORT2 +le_getGlyphPosition(le_engine *engine, + le_int32 glyphIndex, + float *x, + float *y, + LEErrorCode *success) +{ + LayoutEngine *le = (LayoutEngine *) engine; + + if (le == NULL) { + *success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + le->getGlyphPosition(glyphIndex, *x, *y, *success); +} + +U_CAPI void U_EXPORT2 +le_reset(le_engine *engine, + LEErrorCode *success) +{ + LayoutEngine *le = (LayoutEngine *) engine; + + if (le == NULL) { + *success = LE_ILLEGAL_ARGUMENT_ERROR; + return; + } + + le->reset(); +} diff --git a/Build/source/libs/icu/icu-50.1/layout/loengine.h b/Build/source/libs/icu/icu-50.1/layout/loengine.h new file mode 100644 index 00000000000..7b882dd6909 --- /dev/null +++ b/Build/source/libs/icu/icu-50.1/layout/loengine.h @@ -0,0 +1,225 @@ +/* + * + * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved + * + */ + +#ifndef __LOENGINE_H +#define __LOENGINE_H + +#include "LETypes.h" + +#ifndef U_HIDE_INTERNAL_API +/** + * \file + * \brief C API for complex text layout. + * \internal + * + * This is a technology preview. The API may + * change significantly. + * + */ + +/** + * The opaque type for a LayoutEngine. + * + * @internal + */ +typedef void le_engine; + +/** + * The opaque type for a font instance. + * + * @internal + */ +typedef void le_font; + +/** + * This function returns an le_engine capable of laying out text + * in the given font, script and langauge. Note that the LayoutEngine + * returned may be a subclass of LayoutEngine. + * + * @param font - the font of the text + * @param scriptCode - the script of the text + * @param languageCode - the language of the text + * @param typo_flags - flags that control layout features like kerning and ligatures. + * @param success - output parameter set to an error code if the operation fails + * + * @return an le_engine which can layout text in the given font. + * + * @internal + */ +U_INTERNAL le_engine * U_EXPORT2 +le_create(const le_font *font, + le_int32 scriptCode, + le_int32 languageCode, + le_int32 typo_flags, + LEErrorCode *success); + +/** + * This function closes the given LayoutEngine. After + * it returns, the le_engine is no longer valid. + * + * @param engine - the LayoutEngine to close. + * + * @internal + */ +U_INTERNAL void U_EXPORT2 +le_close(le_engine *engine); + +/** + * This routine will compute the glyph, character index and position arrays. + * + * @param engine - the LayoutEngine + * @param chars - the input character context + * @param offset - the offset of the first character to process + * @param count - the number of characters to process + * @param max - the number of characters in the input context + * @param rightToLeft - TRUE if the characers are in a right to left directional run + * @param x - the initial X position + * @param y - the initial Y position + * @param success - output parameter set to an error code if the operation fails + * + * @return the number of glyphs in the glyph array + * + * Note: The glyph, character index and position array can be accessed + * using the getter routines below. + * + * Note: If you call this function more than once, you must call the reset() + * function first to free the glyph, character index and position arrays + * allocated by the previous call. + * + * @internal + */ +U_INTERNAL le_int32 U_EXPORT2 +le_layoutChars(le_engine *engine, + const LEUnicode chars[], + le_int32 offset, + le_int32 count, + le_int32 max, + le_bool rightToLeft, + float x, + float y, + LEErrorCode *success); + +/** + * This function returns the number of glyphs in the glyph array. Note + * that the number of glyphs will be greater than or equal to the number + * of characters used to create the LayoutEngine. + * + * @param engine - the LayoutEngine + * @param success - output parameter set to an error code if the operation fails. + * + * @return the number of glyphs in the glyph array + * + * @internal + */ +U_INTERNAL le_int32 U_EXPORT2 +le_getGlyphCount(le_engine *engine, + LEErrorCode *success); + +/** + * This function copies the glyph array into a caller supplied array. + * The caller must ensure that the array is large enough to hold all + * the glyphs. + * + * @param engine - the LayoutEngine + * @param glyphs - the destiniation glyph array + * @param success - set to an error code if the operation fails + * + * @internal + */ +U_INTERNAL void U_EXPORT2 +le_getGlyphs(le_engine *engine, + LEGlyphID glyphs[], + LEErrorCode *success); + +/** + * This function copies the character index array into a caller supplied array. + * The caller must ensure that the array is large enough to hold a + * character index for each glyph. + * + * @param engine - the LayoutEngine + * @param charIndices - the destiniation character index array + * @param success - set to an error code if the operation fails + * + * @internal + */ +U_INTERNAL void U_EXPORT2 +le_getCharIndices(le_engine *engine, + le_int32 charIndices[], + LEErrorCode *success); + +/** + * This function copies the character index array into a caller supplied array. + * The caller must ensure that the array is large enough to hold a + * character index for each glyph. + * + * @param engine - the LayoutEngine + * @param charIndices - the destiniation character index array + * @param indexBase - an offset that will be added to each index. + * @param success - set to an error code if the operation fails + * + * @internal + */ +U_INTERNAL void U_EXPORT2 +le_getCharIndicesWithBase(le_engine *engine, + le_int32 charIndices[], + le_int32 indexBase, + LEErrorCode *success); + +/** + * This function copies the position array into a caller supplied array. + * The caller must ensure that the array is large enough to hold an + * X and Y position for each glyph, plus an extra X and Y for the + * advance of the last glyph. + * + * @param engine - the LayoutEngine + * @param positions - the destiniation position array + * @param success - set to an error code if the operation fails + * + * @internal + */ +U_INTERNAL void U_EXPORT2 +le_getGlyphPositions(le_engine *engine, + float positions[], + LEErrorCode *success); + +/** + * This function returns the X and Y position of the glyph at + * the given index. + * + * Input parameters: + * @param engine - the LayoutEngine + * @param glyphIndex - the index of the glyph + * + * Output parameters: + * @param x - the glyph's X position + * @param y - the glyph's Y position + * @param success - set to an error code if the operation fails + * + * @internal + */ +U_INTERNAL void U_EXPORT2 +le_getGlyphPosition(le_engine *engine, + le_int32 glyphIndex, + float *x, + float *y, + LEErrorCode *success); + +/** + * This function frees the glyph, character index and position arrays + * so that the LayoutEngine can be reused to layout a different + * characer array. (This function is also called by le_close) + * + * @param engine - the LayoutEngine + * @param success - set to an error code if the operation fails + * + * @internal + */ +U_INTERNAL void U_EXPORT2 +le_reset(le_engine *engine, + LEErrorCode *success); +#endif /* U_HIDE_INTERNAL_API */ + +#endif |