diff --git a/src/SixLabors.Fonts/FileFontMetrics.cs b/src/SixLabors.Fonts/FileFontMetrics.cs
index e1eda515b..77f2c27fa 100644
--- a/src/SixLabors.Fonts/FileFontMetrics.cs
+++ b/src/SixLabors.Fonts/FileFontMetrics.cs
@@ -119,6 +119,10 @@ internal override bool TryGetGlyphClass(ushort glyphId, [NotNullWhen(true)] out
internal override bool TryGetMarkAttachmentClass(ushort glyphId, [NotNullWhen(true)] out GlyphClassDef? markAttachmentClass)
=> this.fontMetrics.Value.TryGetMarkAttachmentClass(glyphId, out markAttachmentClass);
+ ///
+ internal override bool IsInMarkFilteringSet(ushort markGlyphSetIndex, ushort glyphId)
+ => this.fontMetrics.Value.IsInMarkFilteringSet(markGlyphSetIndex, glyphId);
+
///
public override bool TryGetGlyphMetrics(
CodePoint codePoint,
diff --git a/src/SixLabors.Fonts/FontMetrics.cs b/src/SixLabors.Fonts/FontMetrics.cs
index ffd582f6e..2e95e649c 100644
--- a/src/SixLabors.Fonts/FontMetrics.cs
+++ b/src/SixLabors.Fonts/FontMetrics.cs
@@ -172,6 +172,17 @@ internal FontMetrics()
/// true, if the mark attachment class could be retrieved.
internal abstract bool TryGetMarkAttachmentClass(ushort glyphId, [NotNullWhen(true)] out GlyphClassDef? markAttachmentClass);
+ ///
+ /// Returns a value indicating whether the specified glyph is in the given mark filtering set.
+ /// The font needs to have a GDEF table defined.
+ ///
+ /// The mark glyph set index.
+ /// The glyph identifier.
+ ///
+ /// true, if the glyph is in the mark filtering set.
+ ///
+ internal abstract bool IsInMarkFilteringSet(ushort markGlyphSetIndex, ushort glyphId);
+
///
/// Gets the glyph metrics for a given code point.
///
diff --git a/src/SixLabors.Fonts/GlyphLayout.cs b/src/SixLabors.Fonts/GlyphLayout.cs
index a4bd7dbf4..35ebf5db0 100644
--- a/src/SixLabors.Fonts/GlyphLayout.cs
+++ b/src/SixLabors.Fonts/GlyphLayout.cs
@@ -100,7 +100,7 @@ internal GlyphLayout(
internal FontRectangle BoundingBox(float dpi)
{
- // Same logic as in TrueTypeGlyphMetrics.RenderTo
+ // Same logic as in GlyphMetrics.RenderTo
Vector2 location = this.PenLocation;
Vector2 offset = this.Offset;
diff --git a/src/SixLabors.Fonts/GlyphShapingData.cs b/src/SixLabors.Fonts/GlyphShapingData.cs
index 0d306bbe4..c28e9b032 100644
--- a/src/SixLabors.Fonts/GlyphShapingData.cs
+++ b/src/SixLabors.Fonts/GlyphShapingData.cs
@@ -4,7 +4,7 @@
using System.Diagnostics;
using SixLabors.Fonts.Tables.AdvancedTypographic;
using SixLabors.Fonts.Unicode;
-using SixLabors.Fonts.Unicode.Resources;
+using static SixLabors.Fonts.Unicode.Resources.IndicShapingData;
namespace SixLabors.Fonts;
@@ -188,16 +188,16 @@ public UniversalShapingEngineInfo(string category, string syllableType, int syll
public string Category { get; set; }
- public string SyllableType { get; }
+ public string SyllableType { get; set; }
- public int Syllable { get; }
+ public int Syllable { get; set; }
}
internal class IndicShapingEngineInfo
{
public IndicShapingEngineInfo(
- IndicShapingData.Categories category,
- IndicShapingData.Positions position,
+ Categories category,
+ Positions position,
string syllableType,
int syllable)
{
@@ -207,11 +207,13 @@ public IndicShapingEngineInfo(
this.Syllable = syllable;
}
- public IndicShapingData.Categories Category { get; set; }
+ public Categories Category { get; set; }
- public IndicShapingData.Positions Position { get; set; }
+ public MyanmarCategories MyanmarCategory => (MyanmarCategories)this.Category;
- public string SyllableType { get; }
+ public Positions Position { get; set; }
- public int Syllable { get; }
+ public string SyllableType { get; set; }
+
+ public int Syllable { get; set; }
}
diff --git a/src/SixLabors.Fonts/GlyphSubstitutionCollection.cs b/src/SixLabors.Fonts/GlyphSubstitutionCollection.cs
index f568cce21..fa2f68921 100644
--- a/src/SixLabors.Fonts/GlyphSubstitutionCollection.cs
+++ b/src/SixLabors.Fonts/GlyphSubstitutionCollection.cs
@@ -152,6 +152,41 @@ public void MoveGlyph(int fromIndex, int toIndex)
this.glyphs[toIndex].Data = data;
}
+ ///
+ /// Reverses the order of elements in the specified range of the collection.
+ ///
+ ///
+ /// The range is interpreted as half-open, from (inclusive)
+ /// to (exclusive).
+ ///
+ /// Both indices are clamped to the valid range [0, ].
+ /// If the resulting range contains fewer than two elements, the method performs no action.
+ /// The method does not throw if either index is equal to ; in such
+ /// cases the range is considered valid but may be empty.
+ ///
+ ///
+ /// The zero-based index at which to start reversing (inclusive). This value should be
+ /// greater than or equal to 0. Values greater than are treated as
+ /// .
+ ///
+ ///
+ /// The zero-based index at which to stop reversing (exclusive). This value should be
+ /// greater than or equal to . Values greater than
+ /// are treated as .
+ ///
+ public void ReverseRange(int startIndex, int endIndex)
+ {
+ int s = Math.Min(startIndex, this.Count);
+ int e = Math.Min(endIndex, this.Count);
+
+ if (e < s + 2)
+ {
+ return;
+ }
+
+ this.glyphs.Reverse(s, e - s);
+ }
+
///
/// Performs a stable sort of the glyphs by the comparison delegate starting at the specified index.
///
@@ -375,6 +410,12 @@ public void Replace(int index, ReadOnlySpan glyphIds, Tag feature)
}
}
+ public void Insert(int index, GlyphShapingData data)
+ {
+ OffsetGlyphDataPair pair = this.glyphs[index];
+ this.glyphs.Insert(index, new(pair.Offset, data));
+ }
+
[DebuggerDisplay("{DebuggerDisplay,nq}")]
private class OffsetGlyphDataPair
{
diff --git a/src/SixLabors.Fonts/StreamFontMetrics.cs b/src/SixLabors.Fonts/StreamFontMetrics.cs
index 04cc1701d..f65c8e75f 100644
--- a/src/SixLabors.Fonts/StreamFontMetrics.cs
+++ b/src/SixLabors.Fonts/StreamFontMetrics.cs
@@ -212,6 +212,16 @@ internal override bool TryGetMarkAttachmentClass(ushort glyphId, [NotNullWhen(tr
return gdef is not null && gdef.TryGetMarkAttachmentClass(glyphId, out markAttachmentClass);
}
+ ///
+ internal override bool IsInMarkFilteringSet(ushort markGlyphSetIndex, ushort glyphId)
+ {
+ GlyphDefinitionTable? gdef = this.outlineType == OutlineType.TrueType
+ ? this.trueTypeFontTables!.Gdef
+ : this.compactFontTables!.Gdef;
+
+ return gdef is not null && gdef.IsInMarkGlyphSet(markGlyphSetIndex, glyphId);
+ }
+
///
public override bool TryGetGlyphMetrics(
CodePoint codePoint,
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/AdvancedTypographicUtils.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/AdvancedTypographicUtils.cs
index d2947fd3f..fdad14a3c 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/AdvancedTypographicUtils.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/AdvancedTypographicUtils.cs
@@ -18,6 +18,12 @@ internal static class AdvancedTypographicUtils
private const int MaxOperationsMinimum = 16384;
private const int MaxShapingCharsLength = 0x3FFFFFFF; // Half int max.
+ internal enum MatchDirection
+ {
+ Forward,
+ Backward
+ }
+
///
/// Gets a value indicating whether the glyph represented by the codepoint should be interpreted vertically.
///
@@ -46,12 +52,13 @@ public static bool ApplyLookupList(
GSubTable table,
Tag feature,
LookupFlags lookupFlags,
+ ushort markFilteringSet,
SequenceLookupRecord[] records,
GlyphSubstitutionCollection collection,
int index,
int count)
{
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, lookupFlags);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, lookupFlags, markFilteringSet);
int currentCount = collection.Count;
foreach (SequenceLookupRecord lookupRecord in records)
@@ -79,12 +86,13 @@ public static bool ApplyLookupList(
GPosTable table,
Tag feature,
LookupFlags lookupFlags,
+ ushort markFilteringSet,
SequenceLookupRecord[] records,
GlyphPositioningCollection collection,
int index,
int count)
{
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, lookupFlags);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, lookupFlags, markFilteringSet);
foreach (SequenceLookupRecord lookupRecord in records)
{
ushort sequenceIndex = lookupRecord.SequenceIndex;
@@ -150,11 +158,29 @@ public static bool MatchClassSequence(
public static bool MatchCoverageSequence(
SkippingGlyphIterator iterator,
CoverageTable[] coverageTable,
- int increment)
+ int startIndex,
+ int endExclusive)
=> Match(
- increment,
+ iterator,
+ startIndex,
coverageTable,
+ MatchDirection.Forward,
+ endExclusive,
+ (component, data) => component.CoverageIndexOf(data.GlyphId) >= 0,
+ default);
+
+ // Backtrack variant (spec: backtrack[0] matches i-1, then i-2...)
+ public static bool MatchBacktrackCoverageSequence(
+ SkippingGlyphIterator iterator,
+ CoverageTable[] backtrack,
+ int startIndex,
+ int endExclusive)
+ => Match(
iterator,
+ startIndex,
+ backtrack,
+ MatchDirection.Backward,
+ endExclusive,
(component, data) => component.CoverageIndexOf(data.GlyphId) >= 0,
default);
@@ -212,6 +238,7 @@ public static bool ApplyChainedClassSequenceRule(
public static bool CheckAllCoverages(
FontMetrics fontMetrics,
LookupFlags lookupFlags,
+ ushort markFilteringSet,
IGlyphShapingCollection collection,
int index,
int count,
@@ -219,25 +246,42 @@ public static bool CheckAllCoverages(
CoverageTable[] backtrack,
CoverageTable[] lookahead)
{
- // Check that there are enough context glyphs.
- if (index < backtrack.Length || input.Length + lookahead.Length > count)
+ int endExclusive = index + count;
+
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, lookupFlags, markFilteringSet);
+
+ // Compute backtrack start using skippy prev(), not index-1.
+ int backtrackStart = index;
+ if (backtrack.Length > 0)
{
- return false;
+ SkippingGlyphIterator backIt = iterator;
+ backIt.Index = index;
+ backtrackStart = backIt.Prev(); // first backtrack glyph (i-1 in skippy space)
}
- // Check all coverages: if any of them does not match, abort update.
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, lookupFlags);
- if (!MatchCoverageSequence(iterator, backtrack, -backtrack.Length))
+ if (!MatchBacktrackCoverageSequence(iterator, backtrack, backtrackStart, endExclusive))
{
return false;
}
- if (!MatchCoverageSequence(iterator, input, 0))
+ // Input starts at the current glyph position.
+ if (!MatchCoverageSequence(iterator, input, index, endExclusive))
{
return false;
}
- if (!MatchCoverageSequence(iterator, lookahead, input.Length))
+ // Compute lookahead start by advancing through the input sequence using skippy Next(),
+ // not by raw index arithmetic.
+ int lookaheadStart = index;
+ if (lookahead.Length > 0)
+ {
+ SkippingGlyphIterator fwdIt = iterator;
+ fwdIt.Index = index;
+ fwdIt.Increment(input.Length); // advance input.Length steps in skippy space
+ lookaheadStart = fwdIt.Index;
+ }
+
+ if (!MatchCoverageSequence(iterator, lookahead, lookaheadStart, endExclusive))
{
return false;
}
@@ -331,6 +375,9 @@ public static GlyphShapingClass GetGlyphShapingClass(FontMetrics fontMetrics, us
return new GlyphShapingClass(isMark, isBase, isLigature, markAttachmentType);
}
+ public static bool IsInMarkFilteringSet(FontMetrics fontMetrics, ushort markFilteringSet, ushort glyphId)
+ => fontMetrics.IsInMarkFilteringSet(markFilteringSet, glyphId);
+
private static bool Match(
int increment,
T[] sequence,
@@ -367,4 +414,56 @@ private static bool Match(
iterator.Index = position;
return i == sequence.Length;
}
+
+ private static bool Match(
+ SkippingGlyphIterator iterator,
+ int startIndex,
+ T[] sequence,
+ MatchDirection direction,
+ int endExclusive,
+ Func condition,
+ Span matches)
+ {
+ if (sequence.Length == 0)
+ {
+ return true;
+ }
+
+ int saved = iterator.Index;
+ iterator.Index = startIndex;
+
+ IGlyphShapingCollection collection = iterator.Collection;
+ int limit = Math.Min(endExclusive, collection.Count);
+
+ for (int i = 0; i < sequence.Length && i < MaxContextLength; i++)
+ {
+ if (iterator.Index < 0 || iterator.Index >= limit)
+ {
+ iterator.Index = saved;
+ return false;
+ }
+
+ GlyphShapingData data = collection[iterator.Index];
+ if (!condition(sequence[i], data))
+ {
+ iterator.Index = saved;
+ return false;
+ }
+
+ if (matches.Length == MaxContextLength)
+ {
+ matches[i] = iterator.Index;
+ }
+
+ if (i + 1 < sequence.Length)
+ {
+ iterator.Index = direction == MatchDirection.Forward
+ ? iterator.Next()
+ : iterator.Prev();
+ }
+ }
+
+ iterator.Index = saved;
+ return true;
+ }
}
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupListTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupListTable.cs
index 2b65f424b..bfdb06af7 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupListTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupListTable.cs
@@ -38,7 +38,7 @@ public static LookupListTable Load(BigEndianBinaryReader reader, long offset)
Span lookupOffsets = lookupOffsetsBuffer.GetSpan();
reader.ReadUInt16Array(lookupOffsets);
- var lookupTables = new LookupTable[lookupCount];
+ LookupTable[] lookupTables = new LookupTable[lookupCount];
for (int i = 0; i < lookupTables.Length; i++)
{
@@ -111,28 +111,28 @@ public static LookupTable Load(BigEndianBinaryReader reader, long offset)
? reader.ReadUInt16()
: (ushort)0;
- var lookupSubTables = new LookupSubTable[subTableCount];
+ LookupSubTable[] lookupSubTables = new LookupSubTable[subTableCount];
for (int i = 0; i < lookupSubTables.Length; i++)
{
- lookupSubTables[i] = LoadLookupSubTable(lookupType, lookupFlags, reader, offset + subTableOffsets[i]);
+ lookupSubTables[i] = LoadLookupSubTable(lookupType, lookupFlags, markFilteringSet, reader, offset + subTableOffsets[i]);
}
return new LookupTable(lookupType, lookupFlags, markFilteringSet, lookupSubTables);
}
- private static LookupSubTable LoadLookupSubTable(ushort lookupType, LookupFlags lookupFlags, BigEndianBinaryReader reader, long offset)
+ private static LookupSubTable LoadLookupSubTable(ushort lookupType, LookupFlags lookupFlags, ushort markFilteringSet, BigEndianBinaryReader reader, long offset)
=> lookupType switch
{
- 1 => LookupType1SubTable.Load(reader, offset, lookupFlags),
- 2 => LookupType2SubTable.Load(reader, offset, lookupFlags),
- 3 => LookupType3SubTable.Load(reader, offset, lookupFlags),
- 4 => LookupType4SubTable.Load(reader, offset, lookupFlags),
- 5 => LookupType5SubTable.Load(reader, offset, lookupFlags),
- 6 => LookupType6SubTable.Load(reader, offset, lookupFlags),
- 7 => LookupType7SubTable.Load(reader, offset, lookupFlags),
- 8 => LookupType8SubTable.Load(reader, offset, lookupFlags),
- 9 => LookupType9SubTable.Load(reader, offset, lookupFlags, LoadLookupSubTable),
+ 1 => LookupType1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 2 => LookupType2SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 3 => LookupType3SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 4 => LookupType4SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 5 => LookupType5SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 6 => LookupType6SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 7 => LookupType7SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 8 => LookupType8SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 9 => LookupType9SubTable.Load(reader, offset, lookupFlags, markFilteringSet, LoadLookupSubTable),
_ => new NotImplementedSubTable()
};
@@ -160,10 +160,16 @@ public bool TryUpdatePosition(
internal abstract class LookupSubTable
{
- protected LookupSubTable(LookupFlags lookupFlags) => this.LookupFlags = lookupFlags;
+ protected LookupSubTable(LookupFlags lookupFlags, ushort markFilteringSet)
+ {
+ this.LookupFlags = lookupFlags;
+ this.MarkFilteringSet = markFilteringSet;
+ }
public LookupFlags LookupFlags { get; }
+ public ushort MarkFilteringSet { get; }
+
public abstract bool TryUpdatePosition(
FontMetrics fontMetrics,
GPosTable table,
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType1SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType1SubTable.cs
index e5307d754..d9f1cf861 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType1SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType1SubTable.cs
@@ -12,15 +12,15 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GPos;
///
internal static class LookupType1SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort posFormat = reader.ReadUInt16();
return posFormat switch
{
- 1 => LookupType1Format1SubTable.Load(reader, offset, lookupFlags),
- 2 => LookupType1Format2SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType1Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 2 => LookupType1Format2SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -31,14 +31,14 @@ internal sealed class LookupType1Format1SubTable : LookupSubTable
private readonly ValueRecord valueRecord;
private readonly CoverageTable coverageTable;
- private LookupType1Format1SubTable(ValueRecord valueRecord, CoverageTable coverageTable, LookupFlags lookupFlags)
- : base(lookupFlags)
+ private LookupType1Format1SubTable(ValueRecord valueRecord, CoverageTable coverageTable, LookupFlags lookupFlags, ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.valueRecord = valueRecord;
this.coverageTable = coverageTable;
}
- public static LookupType1Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType1Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// SinglePosFormat1
// +-------------+----------------+-----------------------------------------------+
@@ -56,11 +56,11 @@ public static LookupType1Format1SubTable Load(BigEndianBinaryReader reader, long
// +-------------+----------------+-----------------------------------------------+
ushort coverageOffset = reader.ReadOffset16();
ValueFormat valueFormat = reader.ReadUInt16();
- var valueRecord = new ValueRecord(reader, valueFormat);
+ ValueRecord valueRecord = new(reader, valueFormat);
- var coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
+ CoverageTable coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
- return new LookupType1Format1SubTable(valueRecord, coverageTable, lookupFlags);
+ return new LookupType1Format1SubTable(valueRecord, coverageTable, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
@@ -95,14 +95,14 @@ internal sealed class LookupType1Format2SubTable : LookupSubTable
private readonly CoverageTable coverageTable;
private readonly ValueRecord[] valueRecords;
- private LookupType1Format2SubTable(ValueRecord[] valueRecords, CoverageTable coverageTable, LookupFlags lookupFlags)
- : base(lookupFlags)
+ private LookupType1Format2SubTable(ValueRecord[] valueRecords, CoverageTable coverageTable, LookupFlags lookupFlags, ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.valueRecords = valueRecords;
this.coverageTable = coverageTable;
}
- public static LookupType1Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType1Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// SinglePosFormat2
// +-------------+--------------------------+-----------------------------------------------+
@@ -123,15 +123,15 @@ public static LookupType1Format2SubTable Load(BigEndianBinaryReader reader, long
ushort coverageOffset = reader.ReadOffset16();
ValueFormat valueFormat = reader.ReadUInt16();
ushort valueCount = reader.ReadUInt16();
- var valueRecords = new ValueRecord[valueCount];
+ ValueRecord[] valueRecords = new ValueRecord[valueCount];
for (int i = 0; i < valueCount; i++)
{
valueRecords[i] = new ValueRecord(reader, valueFormat);
}
- var coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
+ CoverageTable coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
- return new LookupType1Format2SubTable(valueRecords, coverageTable, lookupFlags);
+ return new LookupType1Format2SubTable(valueRecords, coverageTable, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType2SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType2SubTable.cs
index ecf296a74..b69522ffb 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType2SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType2SubTable.cs
@@ -16,15 +16,15 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GPos;
///
internal static class LookupType2SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort posFormat = reader.ReadUInt16();
return posFormat switch
{
- 1 => LookupType2Format1SubTable.Load(reader, offset, lookupFlags),
- 2 => LookupType2Format2SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType2Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 2 => LookupType2Format2SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -34,14 +34,14 @@ internal sealed class LookupType2Format1SubTable : LookupSubTable
private readonly CoverageTable coverageTable;
private readonly PairSetTable[] pairSets;
- public LookupType2Format1SubTable(CoverageTable coverageTable, PairSetTable[] pairSets, LookupFlags lookupFlags)
- : base(lookupFlags)
+ public LookupType2Format1SubTable(CoverageTable coverageTable, PairSetTable[] pairSets, LookupFlags lookupFlags, ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.coverageTable = coverageTable;
this.pairSets = pairSets;
}
- public static LookupType2Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType2Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// Pair Adjustment Positioning Subtable format 1.
// +-------------+------------------------------+------------------------------------------------+
@@ -73,16 +73,16 @@ public static LookupType2Format1SubTable Load(BigEndianBinaryReader reader, long
Span pairSetOffsets = pairSetOffsetsBuffer.GetSpan();
reader.ReadUInt16Array(pairSetOffsets);
- var pairSets = new PairSetTable[pairSetCount];
+ PairSetTable[] pairSets = new PairSetTable[pairSetCount];
for (int i = 0; i < pairSetCount; i++)
{
reader.Seek(offset + pairSetOffsets[i], SeekOrigin.Begin);
pairSets[i] = PairSetTable.Load(reader, offset + pairSetOffsets[i], valueFormat1, valueFormat2);
}
- var coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
+ CoverageTable coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
- return new LookupType2Format1SubTable(coverageTable, pairSets, lookupFlags);
+ return new LookupType2Format1SubTable(coverageTable, pairSets, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
@@ -148,7 +148,7 @@ public static PairSetTable Load(BigEndianBinaryReader reader, long offset, Value
// +-----------------+----------------------------------+---------------------------------------+
reader.Seek(offset, SeekOrigin.Begin);
ushort pairValueCount = reader.ReadUInt16();
- var pairValueRecords = new PairValueRecord[pairValueCount];
+ PairValueRecord[] pairValueRecords = new PairValueRecord[pairValueCount];
for (int i = 0; i < pairValueRecords.Length; i++)
{
pairValueRecords[i] = new PairValueRecord(reader, valueFormat1, valueFormat2);
@@ -186,8 +186,9 @@ public LookupType2Format2SubTable(
Class1Record[] class1Records,
ClassDefinitionTable classDefinitionTable1,
ClassDefinitionTable classDefinitionTable2,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.coverageTable = coverageTable;
this.class1Records = class1Records;
@@ -195,7 +196,7 @@ public LookupType2Format2SubTable(
this.classDefinitionTable2 = classDefinitionTable2;
}
- public static LookupType2Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType2Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// Pair Adjustment Positioning Subtable format 2.
// +-------------+------------------------------+------------------------------------------------+
@@ -237,17 +238,17 @@ public static LookupType2Format2SubTable Load(BigEndianBinaryReader reader, long
ushort class1Count = reader.ReadUInt16();
ushort class2Count = reader.ReadUInt16();
- var class1Records = new Class1Record[class1Count];
+ Class1Record[] class1Records = new Class1Record[class1Count];
for (int i = 0; i < class1Records.Length; i++)
{
class1Records[i] = Class1Record.Load(reader, class2Count, valueFormat1, valueFormat2);
}
- var coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
- var classDefTable1 = ClassDefinitionTable.Load(reader, offset + classDef1Offset);
- var classDefTable2 = ClassDefinitionTable.Load(reader, offset + classDef2Offset);
+ CoverageTable coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
+ ClassDefinitionTable classDefTable1 = ClassDefinitionTable.Load(reader, offset + classDef1Offset);
+ ClassDefinitionTable classDefTable2 = ClassDefinitionTable.Load(reader, offset + classDef2Offset);
- return new LookupType2Format2SubTable(coverageTable, class1Records, classDefTable1, classDefTable2, lookupFlags);
+ return new LookupType2Format2SubTable(coverageTable, class1Records, classDefTable1, classDefTable2, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType3SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType3SubTable.cs
index 8909bfbab..69fad8a22 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType3SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType3SubTable.cs
@@ -12,14 +12,14 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GPos;
///
internal static class LookupType3SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort posFormat = reader.ReadUInt16();
return posFormat switch
{
- 1 => LookupType3Format1SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType3Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -29,14 +29,18 @@ internal sealed class LookupType3Format1SubTable : LookupSubTable
private readonly CoverageTable coverageTable;
private readonly EntryExitAnchors[] entryExitAnchors;
- public LookupType3Format1SubTable(CoverageTable coverageTable, EntryExitAnchors[] entryExitAnchors, LookupFlags lookupFlags)
- : base(lookupFlags)
+ public LookupType3Format1SubTable(
+ CoverageTable coverageTable,
+ EntryExitAnchors[] entryExitAnchors,
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.coverageTable = coverageTable;
this.entryExitAnchors = entryExitAnchors;
}
- public static LookupType3Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType3Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// Cursive Attachment Positioning Format1.
// +--------------------+---------------------------------+------------------------------------------------------+
@@ -53,21 +57,21 @@ public static LookupType3Format1SubTable Load(BigEndianBinaryReader reader, long
// +--------------------+---------------------------------+------------------------------------------------------+
ushort coverageOffset = reader.ReadOffset16();
ushort entryExitCount = reader.ReadUInt16();
- var entryExitRecords = new EntryExitRecord[entryExitCount];
+ EntryExitRecord[] entryExitRecords = new EntryExitRecord[entryExitCount];
for (int i = 0; i < entryExitCount; i++)
{
entryExitRecords[i] = new EntryExitRecord(reader, offset);
}
- var entryExitAnchors = new EntryExitAnchors[entryExitCount];
+ EntryExitAnchors[] entryExitAnchors = new EntryExitAnchors[entryExitCount];
for (int i = 0; i < entryExitCount; i++)
{
entryExitAnchors[i] = new EntryExitAnchors(reader, offset, entryExitRecords[i]);
}
- var coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
+ CoverageTable coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
- return new LookupType3Format1SubTable(coverageTable, entryExitAnchors, lookupFlags);
+ return new LookupType3Format1SubTable(coverageTable, entryExitAnchors, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType4SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType4SubTable.cs
index 418ca5291..7edde7337 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType4SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType4SubTable.cs
@@ -10,14 +10,14 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GPos;
///
internal static class LookupType4SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort format = reader.ReadUInt16();
return format switch
{
- 1 => LookupType4Format1SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType4Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -34,8 +34,9 @@ public LookupType4Format1SubTable(
CoverageTable baseCoverage,
MarkArrayTable markArrayTable,
BaseArrayTable baseArrayTable,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.markCoverage = markCoverage;
this.baseCoverage = baseCoverage;
@@ -43,7 +44,7 @@ public LookupType4Format1SubTable(
this.baseArrayTable = baseArrayTable;
}
- public static LookupType4Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType4Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// MarkBasePosFormat1 Subtable.
// +--------------------+---------------------------------+------------------------------------------------------+
@@ -76,7 +77,7 @@ public static LookupType4Format1SubTable Load(BigEndianBinaryReader reader, long
MarkArrayTable markArrayTable = new(reader, offset + markArrayOffset);
BaseArrayTable baseArrayTable = new(reader, offset + baseArrayOffset, markClassCount);
- return new LookupType4Format1SubTable(markCoverage, baseCoverage, markArrayTable, baseArrayTable, lookupFlags);
+ return new LookupType4Format1SubTable(markCoverage, baseCoverage, markArrayTable, baseArrayTable, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType5SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType5SubTable.cs
index 4db3872e6..48b35da72 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType5SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType5SubTable.cs
@@ -13,14 +13,14 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GPos;
///
internal static class LookupType5SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort subTableFormat = reader.ReadUInt16();
return subTableFormat switch
{
- 1 => LookupType5Format1SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType5Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -37,8 +37,9 @@ public LookupType5Format1SubTable(
CoverageTable ligatureCoverage,
MarkArrayTable markArrayTable,
LigatureArrayTable ligatureArrayTable,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.markCoverage = markCoverage;
this.ligatureCoverage = ligatureCoverage;
@@ -46,7 +47,7 @@ public LookupType5Format1SubTable(
this.ligatureArrayTable = ligatureArrayTable;
}
- public static LookupType5Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType5Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// MarkLigPosFormat1 Subtable.
// +--------------------+---------------------------------+------------------------------------------------------+
@@ -74,12 +75,12 @@ public static LookupType5Format1SubTable Load(BigEndianBinaryReader reader, long
ushort markArrayOffset = reader.ReadOffset16();
ushort ligatureArrayOffset = reader.ReadOffset16();
- var markCoverage = CoverageTable.Load(reader, offset + markCoverageOffset);
- var ligatureCoverage = CoverageTable.Load(reader, offset + ligatureCoverageOffset);
- var markArrayTable = new MarkArrayTable(reader, offset + markArrayOffset);
- var ligatureArrayTable = new LigatureArrayTable(reader, offset + ligatureArrayOffset, markClassCount);
+ CoverageTable markCoverage = CoverageTable.Load(reader, offset + markCoverageOffset);
+ CoverageTable ligatureCoverage = CoverageTable.Load(reader, offset + ligatureCoverageOffset);
+ MarkArrayTable markArrayTable = new(reader, offset + markArrayOffset);
+ LigatureArrayTable ligatureArrayTable = new(reader, offset + ligatureArrayOffset, markClassCount);
- return new LookupType5Format1SubTable(markCoverage, ligatureCoverage, markArrayTable, ligatureArrayTable, lookupFlags);
+ return new LookupType5Format1SubTable(markCoverage, ligatureCoverage, markArrayTable, ligatureArrayTable, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType6SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType6SubTable.cs
index 2bc1f6d6e..9f9813c91 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType6SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType6SubTable.cs
@@ -12,14 +12,14 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GPos;
///
internal static class LookupType6SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort subTableFormat = reader.ReadUInt16();
return subTableFormat switch
{
- 1 => LookupType6Format1SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType6Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -36,8 +36,9 @@ public LookupType6Format1SubTable(
CoverageTable mark2Coverage,
MarkArrayTable mark1ArrayTable,
Mark2ArrayTable mark2ArrayTable,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.mark1Coverage = mark1Coverage;
this.mark2Coverage = mark2Coverage;
@@ -45,7 +46,7 @@ public LookupType6Format1SubTable(
this.mark2ArrayTable = mark2ArrayTable;
}
- public static LookupType6Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType6Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// MarkMarkPosFormat1 Subtable.
// +--------------------+---------------------------------+------------------------------------------------------+
@@ -73,12 +74,12 @@ public static LookupType6Format1SubTable Load(BigEndianBinaryReader reader, long
ushort mark1ArrayOffset = reader.ReadOffset16();
ushort mark2ArrayOffset = reader.ReadOffset16();
- var mark1Coverage = CoverageTable.Load(reader, offset + mark1CoverageOffset);
- var mark2Coverage = CoverageTable.Load(reader, offset + mark2CoverageOffset);
- var mark1ArrayTable = new MarkArrayTable(reader, offset + mark1ArrayOffset);
- var mark2ArrayTable = new Mark2ArrayTable(reader, markClassCount, offset + mark2ArrayOffset);
+ CoverageTable mark1Coverage = CoverageTable.Load(reader, offset + mark1CoverageOffset);
+ CoverageTable mark2Coverage = CoverageTable.Load(reader, offset + mark2CoverageOffset);
+ MarkArrayTable mark1ArrayTable = new(reader, offset + mark1ArrayOffset);
+ Mark2ArrayTable mark2ArrayTable = new(reader, markClassCount, offset + mark2ArrayOffset);
- return new LookupType6Format1SubTable(mark1Coverage, mark2Coverage, mark1ArrayTable, mark2ArrayTable, lookupFlags);
+ return new LookupType6Format1SubTable(mark1Coverage, mark2Coverage, mark1ArrayTable, mark2ArrayTable, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
@@ -98,51 +99,55 @@ public override bool TryUpdatePosition(
}
int mark1Index = this.mark1Coverage.CoverageIndexOf(glyphId);
- if (mark1Index == -1)
+ if (mark1Index < 0)
{
return false;
}
// Get the previous mark to attach to.
- if (index < 1)
+ // HarfBuzz: search backwards for a suitable mark glyph until a non-mark glyph.
+ // It clears ignore flags when searching, but keeps mark attachment / filtering behavior.
+ LookupFlags searchFlags = this.LookupFlags & ~(LookupFlags.IgnoreMarks | LookupFlags.IgnoreBaseGlyphs | LookupFlags.IgnoreLigatures);
+
+ SkippingGlyphIterator it = new(fontMetrics, collection, index, searchFlags, this.MarkFilteringSet);
+
+ int j = it.Prev();
+ if (j < 0)
{
return false;
}
- int prevIdx = index - 1;
- ushort prevGlyphId = collection[prevIdx].GlyphId;
- GlyphShapingData prevGlyph = collection[prevIdx];
- if (!AdvancedTypographicUtils.IsMarkGlyph(fontMetrics, prevGlyphId, prevGlyph))
+ GlyphShapingData prevGlyph = collection[j];
+ if (!AdvancedTypographicUtils.IsMarkGlyph(fontMetrics, prevGlyph.GlyphId, prevGlyph))
{
return false;
}
- // The following logic was borrowed from Harfbuzz,
- // see: https://github.com/harfbuzz/harfbuzz/blob/3e635cf5e26e33d6210d3092256a49291752deec/src/hb-ot-layout-gpos-table.hh#L2525
- bool good = false;
GlyphShapingData curGlyph = collection[index];
- if (curGlyph.LigatureId == prevGlyph.LigatureId)
+
+ bool good;
+ int id1 = curGlyph.LigatureId;
+ int id2 = prevGlyph.LigatureId;
+ int comp1 = curGlyph.LigatureComponent;
+ int comp2 = prevGlyph.LigatureComponent;
+
+ if (id1 == id2)
{
- if (curGlyph.LigatureId > 0)
+ if (id1 == 0)
{
// Marks belonging to the same base.
good = true;
}
- else if (curGlyph.LigatureComponent == prevGlyph.LigatureComponent)
+ else
{
// Marks belonging to the same ligature component.
- good = true;
+ good = comp1 == comp2;
}
}
else
{
- // If ligature ids don't match, it may be the case that one of the marks
- // itself is a ligature, in which case match.
- if ((curGlyph.LigatureId > 0 && curGlyph.LigatureComponent <= 0)
- || (prevGlyph.LigatureId > 0 && prevGlyph.LigatureComponent <= 0))
- {
- good = true;
- }
+ // If ligature ids don't match, one of the marks itself may be a ligature.
+ good = (id1 > 0 && comp1 <= 0) || (id2 > 0 && comp2 <= 0);
}
if (!good)
@@ -150,15 +155,15 @@ public override bool TryUpdatePosition(
return false;
}
- int mark2Index = this.mark2Coverage.CoverageIndexOf(prevGlyphId);
- if (mark2Index == -1)
+ int mark2Index = this.mark2Coverage.CoverageIndexOf(prevGlyph.GlyphId);
+ if (mark2Index < 0)
{
return false;
}
MarkRecord markRecord = this.mark1ArrayTable.MarkRecords[mark1Index];
- AnchorTable baseAnchor = this.mark2ArrayTable.Mark2Records[mark2Index].MarkAnchorTable[markRecord.MarkClass];
- AdvancedTypographicUtils.ApplyAnchor(fontMetrics, collection, index, baseAnchor, markRecord, prevIdx, feature);
+ AnchorTable? baseAnchor = this.mark2ArrayTable.Mark2Records[mark2Index].MarkAnchorTable[markRecord.MarkClass];
+ AdvancedTypographicUtils.ApplyAnchor(fontMetrics, collection, index, baseAnchor, markRecord, j, feature);
return true;
}
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType7SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType7SubTable.cs
index b996789c5..8e3a18160 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType7SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType7SubTable.cs
@@ -11,16 +11,16 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GPos;
///
internal static class LookupType7SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort subTableFormat = reader.ReadUInt16();
return subTableFormat switch
{
- 1 => LookupType7Format1SubTable.Load(reader, offset, lookupFlags),
- 2 => LookupType7Format2SubTable.Load(reader, offset, lookupFlags),
- 3 => LookupType7Format3SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType7Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 2 => LookupType7Format2SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 3 => LookupType7Format3SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -30,18 +30,22 @@ internal sealed class LookupType7Format1SubTable : LookupSubTable
private readonly CoverageTable coverageTable;
private readonly SequenceRuleSetTable[] seqRuleSetTables;
- public LookupType7Format1SubTable(CoverageTable coverageTable, SequenceRuleSetTable[] seqRuleSetTables, LookupFlags lookupFlags)
- : base(lookupFlags)
+ public LookupType7Format1SubTable(
+ CoverageTable coverageTable,
+ SequenceRuleSetTable[] seqRuleSetTables,
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.seqRuleSetTables = seqRuleSetTables;
this.coverageTable = coverageTable;
}
- public static LookupType7Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType7Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
SequenceRuleSetTable[] seqRuleSets = TableLoadingUtils.LoadSequenceContextFormat1(reader, offset, out CoverageTable coverageTable);
- return new LookupType7Format1SubTable(coverageTable, seqRuleSets, lookupFlags);
+ return new LookupType7Format1SubTable(coverageTable, seqRuleSets, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
@@ -67,7 +71,7 @@ public override bool TryUpdatePosition(
// TODO: Check this.
// https://docs.microsoft.com/en-us/typography/opentype/spec/gsub#example-7-contextual-substitution-format-1
SequenceRuleSetTable ruleSetTable = this.seqRuleSetTables[offset];
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags, this.MarkFilteringSet);
foreach (SequenceRuleTable ruleTable in ruleSetTable.SequenceRuleTables)
{
int remaining = count - 1;
@@ -88,6 +92,7 @@ public override bool TryUpdatePosition(
table,
feature,
this.LookupFlags,
+ this.MarkFilteringSet,
ruleTable.SequenceLookupRecords,
collection,
index,
@@ -108,19 +113,25 @@ public LookupType7Format2SubTable(
CoverageTable coverageTable,
ClassDefinitionTable classDefinitionTable,
ClassSequenceRuleSetTable[] sequenceRuleSetTables,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.coverageTable = coverageTable;
this.classDefinitionTable = classDefinitionTable;
this.sequenceRuleSetTables = sequenceRuleSetTables;
}
- public static LookupType7Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType7Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
- CoverageTable coverageTable = TableLoadingUtils.LoadSequenceContextFormat2(reader, offset, out ClassDefinitionTable classDefTable, out ClassSequenceRuleSetTable[] classSeqRuleSets);
-
- return new LookupType7Format2SubTable(coverageTable, classDefTable, classSeqRuleSets, lookupFlags);
+ CoverageTable coverageTable =
+ TableLoadingUtils.LoadSequenceContextFormat2(
+ reader,
+ offset,
+ out ClassDefinitionTable classDefTable,
+ out ClassSequenceRuleSetTable[] classSeqRuleSets);
+
+ return new LookupType7Format2SubTable(coverageTable, classDefTable, classSeqRuleSets, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
@@ -149,7 +160,7 @@ public override bool TryUpdatePosition(
}
ClassSequenceRuleSetTable ruleSetTable = this.sequenceRuleSetTables[offset];
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags, this.MarkFilteringSet);
foreach (ClassSequenceRuleTable ruleTable in ruleSetTable.SequenceRuleTables)
{
int remaining = count - 1;
@@ -170,6 +181,7 @@ public override bool TryUpdatePosition(
table,
feature,
this.LookupFlags,
+ this.MarkFilteringSet,
ruleTable.SequenceLookupRecords,
collection,
index,
@@ -185,18 +197,23 @@ internal sealed class LookupType7Format3SubTable : LookupSubTable
private readonly CoverageTable[] coverageTables;
private readonly SequenceLookupRecord[] sequenceLookupRecords;
- public LookupType7Format3SubTable(CoverageTable[] coverageTables, SequenceLookupRecord[] sequenceLookupRecords, LookupFlags lookupFlags)
- : base(lookupFlags)
+ public LookupType7Format3SubTable(
+ CoverageTable[] coverageTables,
+ SequenceLookupRecord[] sequenceLookupRecords,
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.coverageTables = coverageTables;
this.sequenceLookupRecords = sequenceLookupRecords;
}
- public static LookupType7Format3SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType7Format3SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
- SequenceLookupRecord[] seqLookupRecords = TableLoadingUtils.LoadSequenceContextFormat3(reader, offset, out CoverageTable[] coverageTables);
+ SequenceLookupRecord[] seqLookupRecords =
+ TableLoadingUtils.LoadSequenceContextFormat3(reader, offset, out CoverageTable[] coverageTables);
- return new LookupType7Format3SubTable(coverageTables, seqLookupRecords, lookupFlags);
+ return new LookupType7Format3SubTable(coverageTables, seqLookupRecords, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
@@ -213,8 +230,8 @@ public override bool TryUpdatePosition(
return false;
}
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);
- if (!AdvancedTypographicUtils.MatchCoverageSequence(iterator, this.coverageTables, 0))
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags, this.MarkFilteringSet);
+ if (!AdvancedTypographicUtils.MatchCoverageSequence(iterator, this.coverageTables, index, index + count))
{
return false;
}
@@ -224,6 +241,7 @@ public override bool TryUpdatePosition(
table,
feature,
this.LookupFlags,
+ this.MarkFilteringSet,
this.sequenceLookupRecords,
collection,
index,
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType8SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType8SubTable.cs
index 4c9ba6518..363748724 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType8SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType8SubTable.cs
@@ -12,16 +12,16 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GPos;
///
internal static class LookupType8SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort substFormat = reader.ReadUInt16();
return substFormat switch
{
- 1 => LookupType8Format1SubTable.Load(reader, offset, lookupFlags),
- 2 => LookupType8Format2SubTable.Load(reader, offset, lookupFlags),
- 3 => LookupType8Format3SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType8Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 2 => LookupType8Format2SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 3 => LookupType8Format3SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -34,17 +34,20 @@ internal sealed class LookupType8Format1SubTable : LookupSubTable
private LookupType8Format1SubTable(
CoverageTable coverageTable,
ChainedSequenceRuleSetTable[] seqRuleSetTables,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.coverageTable = coverageTable;
this.seqRuleSetTables = seqRuleSetTables;
}
- public static LookupType8Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType8Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
- ChainedSequenceRuleSetTable[] seqRuleSets = TableLoadingUtils.LoadChainedSequenceContextFormat1(reader, offset, out CoverageTable coverageTable);
- return new LookupType8Format1SubTable(coverageTable, seqRuleSets, lookupFlags);
+ ChainedSequenceRuleSetTable[] seqRuleSets =
+ TableLoadingUtils.LoadChainedSequenceContextFormat1(reader, offset, out CoverageTable coverageTable);
+
+ return new LookupType8Format1SubTable(coverageTable, seqRuleSets, lookupFlags, markFilteringSet);
}
public override bool TryUpdatePosition(
@@ -83,7 +86,7 @@ public override bool TryUpdatePosition(
// Apply ruleset for the given glyph id.
ChainedSequenceRuleTable[] rules = seqRuleSet.SequenceRuleTables;
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags, this.MarkFilteringSet);
for (int lookupIndex = 0; lookupIndex < rules.Length; lookupIndex++)
{
ChainedSequenceRuleTable rule = rules[lookupIndex];
@@ -125,8 +128,9 @@ private LookupType8Format2SubTable(
ClassDefinitionTable inputClassDefinitionTable,
ClassDefinitionTable lookaheadClassDefinitionTable,
CoverageTable coverageTable,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.sequenceRuleSetTables = sequenceRuleSetTables;
this.backtrackClassDefinitionTable = backtrackClassDefinitionTable;
@@ -135,7 +139,7 @@ private LookupType8Format2SubTable(
this.coverageTable = coverageTable;
}
- public static LookupType8Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType8Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
ChainedClassSequenceRuleSetTable[] seqRuleSets = TableLoadingUtils.LoadChainedSequenceContextFormat2(
reader,
@@ -145,7 +149,14 @@ public static LookupType8Format2SubTable Load(BigEndianBinaryReader reader, long
out ClassDefinitionTable inputClassDefTable,
out ClassDefinitionTable lookaheadClassDefTable);
- return new LookupType8Format2SubTable(seqRuleSets, backtrackClassDefTable, inputClassDefTable, lookaheadClassDefTable, coverageTable, lookupFlags);
+ return new LookupType8Format2SubTable(
+ seqRuleSets,
+ backtrackClassDefTable,
+ inputClassDefTable,
+ lookaheadClassDefTable,
+ coverageTable,
+ lookupFlags,
+ markFilteringSet);
}
public override bool TryUpdatePosition(
@@ -180,10 +191,11 @@ public override bool TryUpdatePosition(
}
// Apply ruleset for the given glyph class id.
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags, this.MarkFilteringSet);
for (int lookupIndex = 0; lookupIndex < rules.Length; lookupIndex++)
{
ChainedClassSequenceRuleTable rule = rules[lookupIndex];
+
if (!AdvancedTypographicUtils.ApplyChainedClassSequenceRule(iterator, rule, this.inputClassDefinitionTable, this.backtrackClassDefinitionTable, this.lookaheadClassDefinitionTable))
{
continue;
@@ -221,8 +233,9 @@ private LookupType8Format3SubTable(
CoverageTable[] backtrackCoverageTables,
CoverageTable[] inputCoverageTables,
CoverageTable[] lookaheadCoverageTables,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.seqLookupRecords = seqLookupRecords;
this.backtrackCoverageTables = backtrackCoverageTables;
@@ -230,7 +243,7 @@ private LookupType8Format3SubTable(
this.lookaheadCoverageTables = lookaheadCoverageTables;
}
- public static LookupType8Format3SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType8Format3SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
SequenceLookupRecord[] seqLookupRecords = TableLoadingUtils.LoadChainedSequenceContextFormat3(
reader,
@@ -239,7 +252,13 @@ public static LookupType8Format3SubTable Load(BigEndianBinaryReader reader, long
out CoverageTable[] inputCoverageTables,
out CoverageTable[] lookaheadCoverageTables);
- return new LookupType8Format3SubTable(seqLookupRecords, backtrackCoverageTables, inputCoverageTables, lookaheadCoverageTables, lookupFlags);
+ return new LookupType8Format3SubTable(
+ seqLookupRecords,
+ backtrackCoverageTables,
+ inputCoverageTables,
+ lookaheadCoverageTables,
+ lookupFlags,
+ markFilteringSet);
}
public override bool TryUpdatePosition(
@@ -256,7 +275,7 @@ public override bool TryUpdatePosition(
return false;
}
- if (!AdvancedTypographicUtils.CheckAllCoverages(fontMetrics, this.LookupFlags, collection, index, count, this.inputCoverageTables, this.backtrackCoverageTables, this.lookaheadCoverageTables))
+ if (!AdvancedTypographicUtils.CheckAllCoverages(fontMetrics, this.LookupFlags, this.MarkFilteringSet, collection, index, count, this.inputCoverageTables, this.backtrackCoverageTables, this.lookaheadCoverageTables))
{
return false;
}
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType9SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType9SubTable.cs
index 0e6b407b1..237fd8092 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType9SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/LookupType9SubTable.cs
@@ -15,14 +15,15 @@ public static LookupSubTable Load(
BigEndianBinaryReader reader,
long offset,
LookupFlags lookupFlags,
- Func subTableLoader)
+ ushort markFilteringSet,
+ Func subTableLoader)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort substFormat = reader.ReadUInt16();
return substFormat switch
{
- 1 => LookupType9Format1SubTable.Load(reader, offset, lookupFlags, subTableLoader),
+ 1 => LookupType9Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet, subTableLoader),
_ => new NotImplementedSubTable(),
};
}
@@ -34,7 +35,8 @@ public static LookupSubTable Load(
BigEndianBinaryReader reader,
long offset,
LookupFlags lookupFlags,
- Func subTableLoader)
+ ushort markFilteringSet,
+ Func subTableLoader)
{
// +----------+---------------------+------------------------------------------------------------------------------------------------------------------------------------+
// | Type | Name | Description |
@@ -57,6 +59,6 @@ public static LookupSubTable Load(
}
// Read the lookup table again with the updated offset.
- return subTableLoader(extensionLookupType, lookupFlags, reader, offset + extensionOffset);
+ return subTableLoader(extensionLookupType, lookupFlags, markFilteringSet, reader, offset + extensionOffset);
}
}
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/NotImplementedSubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/NotImplementedSubTable.cs
index 98868f6a8..4f6d77c1f 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/NotImplementedSubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPos/NotImplementedSubTable.cs
@@ -6,7 +6,7 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GPos;
internal class NotImplementedSubTable : LookupSubTable
{
public NotImplementedSubTable()
- : base(default)
+ : base(default, 0)
{
}
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPosTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPosTable.cs
index 6b89fa1c2..fe147ec7c 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPosTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GPosTable.cs
@@ -165,7 +165,7 @@ current is not ScriptClass.Common and not ScriptClass.Unknown and not ScriptClas
// Plan positioning features for each glyph.
shaper.Plan(collection, index, count);
IEnumerable shapingStages = shaper.GetShapingStages();
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, default);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, default, 0);
foreach (ShapingStage stage in shapingStages)
{
stage.PreProcessFeature(collection, index, count);
@@ -177,7 +177,8 @@ current is not ScriptClass.Common and not ScriptClass.Unknown and not ScriptClas
foreach ((Tag Feature, ushort Index, LookupTable LookupTable) featureLookup in lookups)
{
Tag feature = featureLookup.Feature;
- iterator.Reset(index, featureLookup.LookupTable.LookupFlags);
+ LookupTable featureLookupTable = featureLookup.LookupTable;
+ iterator.Reset(index, featureLookupTable.LookupFlags, featureLookupTable.MarkFilteringSet);
while (iterator.Index < index + count)
{
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupListTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupListTable.cs
index f924aa2df..076ec77f6 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupListTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupListTable.cs
@@ -38,7 +38,7 @@ public static LookupListTable Load(BigEndianBinaryReader reader, long offset)
Span lookupOffsets = lookupOffsetsBuffer.GetSpan();
reader.ReadUInt16Array(lookupOffsets);
- var lookupTables = new LookupTable[lookupCount];
+ LookupTable[] lookupTables = new LookupTable[lookupCount];
for (int i = 0; i < lookupTables.Length; i++)
{
@@ -111,11 +111,11 @@ public static LookupTable Load(BigEndianBinaryReader reader, long offset)
? reader.ReadUInt16()
: (ushort)0;
- var lookupSubTables = new LookupSubTable[subTableCount];
+ LookupSubTable[] lookupSubTables = new LookupSubTable[subTableCount];
for (int i = 0; i < lookupSubTables.Length; i++)
{
- lookupSubTables[i] = LoadLookupSubTable(lookupType, lookupFlags, reader, offset + subTableOffsets[i]);
+ lookupSubTables[i] = LoadLookupSubTable(lookupType, lookupFlags, markFilteringSet, reader, offset + subTableOffsets[i]);
}
return new LookupTable(lookupType, lookupFlags, markFilteringSet, lookupSubTables);
@@ -142,27 +142,38 @@ public bool TrySubstitution(
return false;
}
- private static LookupSubTable LoadLookupSubTable(ushort lookupType, LookupFlags lookupFlags, BigEndianBinaryReader reader, long offset)
+ private static LookupSubTable LoadLookupSubTable(
+ ushort lookupType,
+ LookupFlags lookupFlags,
+ ushort markFilteringSet,
+ BigEndianBinaryReader reader,
+ long offset)
=> lookupType switch
{
- 1 => LookupType1SubTable.Load(reader, offset, lookupFlags),
- 2 => LookupType2SubTable.Load(reader, offset, lookupFlags),
- 3 => LookupType3SubTable.Load(reader, offset, lookupFlags),
- 4 => LookupType4SubTable.Load(reader, offset, lookupFlags),
- 5 => LookupType5SubTable.Load(reader, offset, lookupFlags),
- 6 => LookupType6SubTable.Load(reader, offset, lookupFlags),
- 7 => LookupType7SubTable.Load(reader, offset, lookupFlags, LoadLookupSubTable),
- 8 => LookupType8SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 2 => LookupType2SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 3 => LookupType3SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 4 => LookupType4SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 5 => LookupType5SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 6 => LookupType6SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 7 => LookupType7SubTable.Load(reader, offset, lookupFlags, markFilteringSet, LoadLookupSubTable),
+ 8 => LookupType8SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
internal abstract class LookupSubTable
{
- protected LookupSubTable(LookupFlags lookupFlags) => this.LookupFlags = lookupFlags;
+ protected LookupSubTable(LookupFlags lookupFlags, ushort markFilteringSet)
+ {
+ this.LookupFlags = lookupFlags;
+ this.MarkFilteringSet = markFilteringSet;
+ }
public LookupFlags LookupFlags { get; }
+ public ushort MarkFilteringSet { get; }
+
public abstract bool TrySubstitution(
FontMetrics fontMetrics,
GSubTable table,
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType1SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType1SubTable.cs
index 81ebdf260..4a4777344 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType1SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType1SubTable.cs
@@ -12,15 +12,15 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GSub;
///
internal static class LookupType1SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort substFormat = reader.ReadUInt16();
return substFormat switch
{
- 1 => LookupType1Format1SubTable.Load(reader, offset, lookupFlags),
- 2 => LookupType1Format2SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType1Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 2 => LookupType1Format2SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -31,14 +31,14 @@ internal sealed class LookupType1Format1SubTable : LookupSubTable
private readonly ushort deltaGlyphId;
private readonly CoverageTable coverageTable;
- private LookupType1Format1SubTable(ushort deltaGlyphId, CoverageTable coverageTable, LookupFlags lookupFlags)
- : base(lookupFlags)
+ private LookupType1Format1SubTable(ushort deltaGlyphId, CoverageTable coverageTable, LookupFlags lookupFlags, ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.deltaGlyphId = deltaGlyphId;
this.coverageTable = coverageTable;
}
- public static LookupType1Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType1Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// SingleSubstFormat1
// +----------+----------------+----------------------------------------------------------+
@@ -53,9 +53,9 @@ public static LookupType1Format1SubTable Load(BigEndianBinaryReader reader, long
// +----------+----------------+----------------------------------------------------------+
ushort coverageOffset = reader.ReadOffset16();
ushort deltaGlyphId = reader.ReadUInt16();
- var coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
+ CoverageTable coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
- return new LookupType1Format1SubTable(deltaGlyphId, coverageTable, lookupFlags);
+ return new LookupType1Format1SubTable(deltaGlyphId, coverageTable, lookupFlags, markFilteringSet);
}
public override bool TrySubstitution(
@@ -87,14 +87,14 @@ internal sealed class LookupType1Format2SubTable : LookupSubTable
private readonly CoverageTable coverageTable;
private readonly ushort[] substituteGlyphs;
- private LookupType1Format2SubTable(ushort[] substituteGlyphs, CoverageTable coverageTable, LookupFlags lookupFlags)
- : base(lookupFlags)
+ private LookupType1Format2SubTable(ushort[] substituteGlyphs, CoverageTable coverageTable, LookupFlags lookupFlags, ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.substituteGlyphs = substituteGlyphs;
this.coverageTable = coverageTable;
}
- public static LookupType1Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType1Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// SingleSubstFormat2
// +----------+--------------------------------+-----------------------------------------------------------+
@@ -112,9 +112,9 @@ public static LookupType1Format2SubTable Load(BigEndianBinaryReader reader, long
ushort coverageOffset = reader.ReadOffset16();
ushort glyphCount = reader.ReadUInt16();
ushort[] substituteGlyphIds = reader.ReadUInt16Array(glyphCount);
- var coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
+ CoverageTable coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
- return new LookupType1Format2SubTable(substituteGlyphIds, coverageTable, lookupFlags);
+ return new LookupType1Format2SubTable(substituteGlyphIds, coverageTable, lookupFlags, markFilteringSet);
}
public override bool TrySubstitution(
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType2SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType2SubTable.cs
index de86112fc..23adb317a 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType2SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType2SubTable.cs
@@ -10,14 +10,14 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GSub;
///
internal static class LookupType2SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort substFormat = reader.ReadUInt16();
return substFormat switch
{
- 1 => LookupType2Format1SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType2Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -28,14 +28,14 @@ internal sealed class LookupType2Format1SubTable : LookupSubTable
private readonly SequenceTable[] sequenceTables;
private readonly CoverageTable coverageTable;
- private LookupType2Format1SubTable(SequenceTable[] sequenceTables, CoverageTable coverageTable, LookupFlags lookupFlags)
- : base(lookupFlags)
+ private LookupType2Format1SubTable(SequenceTable[] sequenceTables, CoverageTable coverageTable, LookupFlags lookupFlags, ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.sequenceTables = sequenceTables;
this.coverageTable = coverageTable;
}
- public static LookupType2Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType2Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// Multiple Substitution Format 1
// +----------+--------------------------------+-----------------------------------------------------------------+
@@ -77,7 +77,7 @@ public static LookupType2Format1SubTable Load(BigEndianBinaryReader reader, long
CoverageTable coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
- return new LookupType2Format1SubTable(sequenceTables, coverageTable, lookupFlags);
+ return new LookupType2Format1SubTable(sequenceTables, coverageTable, lookupFlags, markFilteringSet);
}
public override bool TrySubstitution(
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType3SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType3SubTable.cs
index 60c79d998..74a36ca36 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType3SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType3SubTable.cs
@@ -10,14 +10,14 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GSub;
///
internal static class LookupType3SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort substFormat = reader.ReadUInt16();
return substFormat switch
{
- 1 => LookupType3Format1SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType3Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -28,14 +28,14 @@ internal sealed class LookupType3Format1SubTable : LookupSubTable
private readonly AlternateSetTable[] alternateSetTables;
private readonly CoverageTable coverageTable;
- private LookupType3Format1SubTable(AlternateSetTable[] alternateSetTables, CoverageTable coverageTable, LookupFlags lookupFlags)
- : base(lookupFlags)
+ private LookupType3Format1SubTable(AlternateSetTable[] alternateSetTables, CoverageTable coverageTable, LookupFlags lookupFlags, ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.alternateSetTables = alternateSetTables;
this.coverageTable = coverageTable;
}
- public static LookupType3Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType3Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// Alternate Substitution Format 1
// +----------+----------------------------------------+---------------------------------------------------------------+
@@ -58,7 +58,7 @@ public static LookupType3Format1SubTable Load(BigEndianBinaryReader reader, long
Span alternateSetOffsets = alternateSetOffsetsBuffer.GetSpan();
reader.ReadUInt16Array(alternateSetOffsets);
- var alternateTables = new AlternateSetTable[alternateSetCount];
+ AlternateSetTable[] alternateTables = new AlternateSetTable[alternateSetCount];
for (int i = 0; i < alternateTables.Length; i++)
{
// AlternateSet Table
@@ -74,9 +74,9 @@ public static LookupType3Format1SubTable Load(BigEndianBinaryReader reader, long
alternateTables[i] = new AlternateSetTable(reader.ReadUInt16Array(glyphCount));
}
- var coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
+ CoverageTable coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
- return new LookupType3Format1SubTable(alternateTables, coverageTable, lookupFlags);
+ return new LookupType3Format1SubTable(alternateTables, coverageTable, lookupFlags, markFilteringSet);
}
public override bool TrySubstitution(
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType4SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType4SubTable.cs
index 896c74eb4..74786f6dd 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType4SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType4SubTable.cs
@@ -11,14 +11,14 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GSub;
///
internal static class LookupType4SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort substFormat = reader.ReadUInt16();
return substFormat switch
{
- 1 => LookupType4Format1SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType4Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -29,14 +29,14 @@ internal sealed class LookupType4Format1SubTable : LookupSubTable
private readonly LigatureSetTable[] ligatureSetTables;
private readonly CoverageTable coverageTable;
- private LookupType4Format1SubTable(LigatureSetTable[] ligatureSetTables, CoverageTable coverageTable, LookupFlags lookupFlags)
- : base(lookupFlags)
+ private LookupType4Format1SubTable(LigatureSetTable[] ligatureSetTables, CoverageTable coverageTable, LookupFlags lookupFlags, ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.ligatureSetTables = ligatureSetTables;
this.coverageTable = coverageTable;
}
- public static LookupType4Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType4Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// Ligature Substitution Format 1
// +----------+--------------------------------------+--------------------------------------------------------------------+
@@ -59,7 +59,7 @@ public static LookupType4Format1SubTable Load(BigEndianBinaryReader reader, long
Span ligatureSetOffsets = ligatureSetOffsetsBuffer.GetSpan();
reader.ReadUInt16Array(ligatureSetOffsets);
- var ligatureSetTables = new LigatureSetTable[ligatureSetCount];
+ LigatureSetTable[] ligatureSetTables = new LigatureSetTable[ligatureSetCount];
for (int i = 0; i < ligatureSetTables.Length; i++)
{
// LigatureSet Table
@@ -79,7 +79,7 @@ public static LookupType4Format1SubTable Load(BigEndianBinaryReader reader, long
Span ligatureOffsets = ligatureOffsetsBuffer.GetSpan();
reader.ReadUInt16Array(ligatureOffsets);
- var ligatureTables = new LigatureTable[ligatureCount];
+ LigatureTable[] ligatureTables = new LigatureTable[ligatureCount];
// Ligature Table
// +--------+---------------------------------------+------------------------------------------------------+
@@ -104,9 +104,9 @@ public static LookupType4Format1SubTable Load(BigEndianBinaryReader reader, long
ligatureSetTables[i] = new LigatureSetTable(ligatureTables);
}
- var coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
+ CoverageTable coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
- return new LookupType4Format1SubTable(ligatureSetTables, coverageTable, lookupFlags);
+ return new LookupType4Format1SubTable(ligatureSetTables, coverageTable, lookupFlags, markFilteringSet);
}
public override bool TrySubstitution(
@@ -130,7 +130,7 @@ public override bool TrySubstitution(
}
LigatureSetTable ligatureSetTable = this.ligatureSetTables[offset];
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags, this.MarkFilteringSet);
Span matchBuffer = stackalloc int[AdvancedTypographicUtils.MaxContextLength];
for (int i = 0; i < ligatureSetTable.Ligatures.Length; i++)
{
@@ -176,7 +176,7 @@ public override bool TrySubstitution(
bool isBaseLigature = shapingClass.IsBase;
bool isMarkLigature = shapingClass.IsMark;
- Span matches = matchBuffer.Slice(0, Math.Min(ligatureTable.ComponentGlyphs.Length, matchBuffer.Length));
+ Span matches = matchBuffer[..Math.Min(ligatureTable.ComponentGlyphs.Length, matchBuffer.Length)];
for (int j = 0; j < matches.Length && isMarkLigature; j++)
{
GlyphShapingData match = collection[matches[j]];
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType5SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType5SubTable.cs
index 82a2ef97d..bae3b6d51 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType5SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType5SubTable.cs
@@ -10,16 +10,16 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GSub;
///
internal static class LookupType5SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort subTableFormat = reader.ReadUInt16();
return subTableFormat switch
{
- 1 => LookupType5Format1SubTable.Load(reader, offset, lookupFlags),
- 2 => LookupType5Format2SubTable.Load(reader, offset, lookupFlags),
- 3 => LookupType5Format3SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType5Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 2 => LookupType5Format2SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 3 => LookupType5Format3SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -30,18 +30,18 @@ internal sealed class LookupType5Format1SubTable : LookupSubTable
private readonly CoverageTable coverageTable;
private readonly SequenceRuleSetTable[] seqRuleSetTables;
- private LookupType5Format1SubTable(CoverageTable coverageTable, SequenceRuleSetTable[] seqRuleSetTables, LookupFlags lookupFlags)
- : base(lookupFlags)
+ private LookupType5Format1SubTable(CoverageTable coverageTable, SequenceRuleSetTable[] seqRuleSetTables, LookupFlags lookupFlags, ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.coverageTable = coverageTable;
this.seqRuleSetTables = seqRuleSetTables;
}
- public static LookupType5Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType5Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
SequenceRuleSetTable[] seqRuleSets = TableLoadingUtils.LoadSequenceContextFormat1(reader, offset, out CoverageTable coverageTable);
- return new LookupType5Format1SubTable(coverageTable, seqRuleSets, lookupFlags);
+ return new LookupType5Format1SubTable(coverageTable, seqRuleSets, lookupFlags, markFilteringSet);
}
public override bool TrySubstitution(
@@ -67,7 +67,7 @@ public override bool TrySubstitution(
// TODO: Check this.
// https://docs.microsoft.com/en-us/typography/opentype/spec/gsub#example-7-contextual-substitution-format-1
SequenceRuleSetTable ruleSetTable = this.seqRuleSetTables[offset];
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags, this.MarkFilteringSet);
foreach (SequenceRuleTable ruleTable in ruleSetTable.SequenceRuleTables)
{
int remaining = count - 1;
@@ -88,6 +88,7 @@ public override bool TrySubstitution(
table,
feature,
this.LookupFlags,
+ this.MarkFilteringSet,
ruleTable.SequenceLookupRecords,
collection,
index,
@@ -108,19 +109,20 @@ private LookupType5Format2SubTable(
ClassSequenceRuleSetTable[] sequenceRuleSetTables,
ClassDefinitionTable classDefinitionTable,
CoverageTable coverageTable,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.sequenceRuleSetTables = sequenceRuleSetTables;
this.classDefinitionTable = classDefinitionTable;
this.coverageTable = coverageTable;
}
- public static LookupType5Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType5Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
CoverageTable coverageTable = TableLoadingUtils.LoadSequenceContextFormat2(reader, offset, out ClassDefinitionTable classDefTable, out ClassSequenceRuleSetTable[] classSeqRuleSets);
- return new LookupType5Format2SubTable(classSeqRuleSets, classDefTable, coverageTable, lookupFlags);
+ return new LookupType5Format2SubTable(classSeqRuleSets, classDefTable, coverageTable, lookupFlags, markFilteringSet);
}
public override bool TrySubstitution(
@@ -156,7 +158,7 @@ public override bool TrySubstitution(
return false;
}
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags, this.MarkFilteringSet);
foreach (ClassSequenceRuleTable ruleTable in ruleSetTable.SequenceRuleTables)
{
int remaining = count - 1;
@@ -177,6 +179,7 @@ public override bool TrySubstitution(
table,
feature,
this.LookupFlags,
+ this.MarkFilteringSet,
ruleTable.SequenceLookupRecords,
collection,
index,
@@ -192,18 +195,22 @@ internal sealed class LookupType5Format3SubTable : LookupSubTable
private readonly CoverageTable[] coverageTables;
private readonly SequenceLookupRecord[] sequenceLookupRecords;
- private LookupType5Format3SubTable(CoverageTable[] coverageTables, SequenceLookupRecord[] sequenceLookupRecords, LookupFlags lookupFlags)
- : base(lookupFlags)
+ private LookupType5Format3SubTable(
+ CoverageTable[] coverageTables,
+ SequenceLookupRecord[] sequenceLookupRecords,
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.coverageTables = coverageTables;
this.sequenceLookupRecords = sequenceLookupRecords;
}
- public static LookupType5Format3SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType5Format3SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
SequenceLookupRecord[] seqLookupRecords = TableLoadingUtils.LoadSequenceContextFormat3(reader, offset, out CoverageTable[] coverageTables);
- return new LookupType5Format3SubTable(coverageTables, seqLookupRecords, lookupFlags);
+ return new LookupType5Format3SubTable(coverageTables, seqLookupRecords, lookupFlags, markFilteringSet);
}
public override bool TrySubstitution(
@@ -221,8 +228,8 @@ public override bool TrySubstitution(
}
// https://docs.microsoft.com/en-us/typography/opentype/spec/gsub#53-context-substitution-format-3-coverage-based-glyph-contexts
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);
- if (!AdvancedTypographicUtils.MatchCoverageSequence(iterator, this.coverageTables, 0))
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags, this.MarkFilteringSet);
+ if (!AdvancedTypographicUtils.MatchCoverageSequence(iterator, this.coverageTables, index, index + count))
{
return false;
}
@@ -233,6 +240,7 @@ public override bool TrySubstitution(
table,
feature,
this.LookupFlags,
+ this.MarkFilteringSet,
this.sequenceLookupRecords,
collection,
index,
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType6SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType6SubTable.cs
index 8147b6303..83b7c5e4f 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType6SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType6SubTable.cs
@@ -10,16 +10,16 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GSub;
///
internal static class LookupType6SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort substFormat = reader.ReadUInt16();
return substFormat switch
{
- 1 => LookupType6Format1SubTable.Load(reader, offset, lookupFlags),
- 2 => LookupType6Format2SubTable.Load(reader, offset, lookupFlags),
- 3 => LookupType6Format3SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType6Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 2 => LookupType6Format2SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
+ 3 => LookupType6Format3SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -30,17 +30,21 @@ internal sealed class LookupType6Format1SubTable : LookupSubTable
private readonly CoverageTable coverageTable;
private readonly ChainedSequenceRuleSetTable[] seqRuleSetTables;
- private LookupType6Format1SubTable(CoverageTable coverageTable, ChainedSequenceRuleSetTable[] seqRuleSetTables, LookupFlags lookupFlags)
- : base(lookupFlags)
+ private LookupType6Format1SubTable(
+ CoverageTable coverageTable,
+ ChainedSequenceRuleSetTable[] seqRuleSetTables,
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.coverageTable = coverageTable;
this.seqRuleSetTables = seqRuleSetTables;
}
- public static LookupType6Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType6Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
ChainedSequenceRuleSetTable[] seqRuleSets = TableLoadingUtils.LoadChainedSequenceContextFormat1(reader, offset, out CoverageTable coverageTable);
- return new LookupType6Format1SubTable(coverageTable, seqRuleSets, lookupFlags);
+ return new LookupType6Format1SubTable(coverageTable, seqRuleSets, lookupFlags, markFilteringSet);
}
public override bool TrySubstitution(
@@ -72,7 +76,7 @@ public override bool TrySubstitution(
}
// Apply ruleset for the given glyph id.
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags, this.MarkFilteringSet);
ChainedSequenceRuleSetTable seqRuleSet = this.seqRuleSetTables[offset];
ChainedSequenceRuleTable[] rules = seqRuleSet.SequenceRuleTables;
for (int i = 0; i < rules.Length; i++)
@@ -88,6 +92,7 @@ public override bool TrySubstitution(
table,
feature,
this.LookupFlags,
+ this.MarkFilteringSet,
ruleTable.SequenceLookupRecords,
collection,
index,
@@ -112,8 +117,9 @@ private LookupType6Format2SubTable(
ClassDefinitionTable inputClassDefinitionTable,
ClassDefinitionTable lookaheadClassDefinitionTable,
CoverageTable coverageTable,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.sequenceRuleSetTables = sequenceRuleSetTables;
this.backtrackClassDefinitionTable = backtrackClassDefinitionTable;
@@ -122,7 +128,7 @@ private LookupType6Format2SubTable(
this.coverageTable = coverageTable;
}
- public static LookupType6Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType6Format2SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
ChainedClassSequenceRuleSetTable[] seqRuleSets = TableLoadingUtils.LoadChainedSequenceContextFormat2(
reader,
@@ -132,7 +138,14 @@ public static LookupType6Format2SubTable Load(BigEndianBinaryReader reader, long
out ClassDefinitionTable inputClassDefTable,
out ClassDefinitionTable lookaheadClassDefTable);
- return new LookupType6Format2SubTable(seqRuleSets, backtrackClassDefTable, inputClassDefTable, lookaheadClassDefTable, coverageTable, lookupFlags);
+ return new LookupType6Format2SubTable(
+ seqRuleSets,
+ backtrackClassDefTable,
+ inputClassDefTable,
+ lookaheadClassDefTable,
+ coverageTable,
+ lookupFlags,
+ markFilteringSet);
}
public override bool TrySubstitution(
@@ -167,10 +180,11 @@ public override bool TrySubstitution(
}
// Apply ruleset for the given glyph class id.
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, this.LookupFlags, this.MarkFilteringSet);
for (int lookupIndex = 0; lookupIndex < rules.Length; lookupIndex++)
{
ChainedClassSequenceRuleTable ruleTable = rules[lookupIndex];
+
if (!AdvancedTypographicUtils.ApplyChainedClassSequenceRule(iterator, ruleTable, this.inputClassDefinitionTable, this.backtrackClassDefinitionTable, this.lookaheadClassDefinitionTable))
{
continue;
@@ -181,6 +195,7 @@ public override bool TrySubstitution(
table,
feature,
this.LookupFlags,
+ this.MarkFilteringSet,
ruleTable.SequenceLookupRecords,
collection,
index,
@@ -203,8 +218,9 @@ private LookupType6Format3SubTable(
CoverageTable[] backtrackCoverageTables,
CoverageTable[] inputCoverageTables,
CoverageTable[] lookaheadCoverageTables,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.sequenceLookupRecords = seqLookupRecords;
this.backtrackCoverageTables = backtrackCoverageTables;
@@ -212,7 +228,7 @@ private LookupType6Format3SubTable(
this.lookaheadCoverageTables = lookaheadCoverageTables;
}
- public static LookupType6Format3SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType6Format3SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
SequenceLookupRecord[] seqLookupRecords = TableLoadingUtils.LoadChainedSequenceContextFormat3(
reader,
@@ -221,7 +237,13 @@ public static LookupType6Format3SubTable Load(BigEndianBinaryReader reader, long
out CoverageTable[] inputCoverageTables,
out CoverageTable[] lookaheadCoverageTables);
- return new LookupType6Format3SubTable(seqLookupRecords, backtrackCoverageTables, inputCoverageTables, lookaheadCoverageTables, lookupFlags);
+ return new LookupType6Format3SubTable(
+ seqLookupRecords,
+ backtrackCoverageTables,
+ inputCoverageTables,
+ lookaheadCoverageTables,
+ lookupFlags,
+ markFilteringSet);
}
public override bool TrySubstitution(
@@ -241,6 +263,7 @@ public override bool TrySubstitution(
if (!AdvancedTypographicUtils.CheckAllCoverages(
fontMetrics,
this.LookupFlags,
+ this.MarkFilteringSet,
collection,
index,
count,
@@ -257,6 +280,7 @@ public override bool TrySubstitution(
table,
feature,
this.LookupFlags,
+ this.MarkFilteringSet,
this.sequenceLookupRecords,
collection,
index,
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType7SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType7SubTable.cs
index 30d91d881..6d3dec6ce 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType7SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType7SubTable.cs
@@ -16,14 +16,15 @@ public static LookupSubTable Load(
BigEndianBinaryReader reader,
long offset,
LookupFlags lookupFlags,
- Func subTableLoader)
+ ushort markFilteringSet,
+ Func subTableLoader)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort substFormat = reader.ReadUInt16();
return substFormat switch
{
- 1 => LookupType7Format1SubTable.Load(reader, offset, lookupFlags, subTableLoader),
+ 1 => LookupType7Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet, subTableLoader),
_ => new NotImplementedSubTable(),
};
}
@@ -35,7 +36,8 @@ public static LookupSubTable Load(
BigEndianBinaryReader reader,
long offset,
LookupFlags lookupFlags,
- Func subTableLoader)
+ ushort markFilteringSet,
+ Func subTableLoader)
{
// +----------+---------------------+------------------------------------------------------------------------------------------------------------------------------------+
// | Type | Name | Description |
@@ -58,6 +60,6 @@ public static LookupSubTable Load(
}
// Read the lookup table again with the updated offset.
- return subTableLoader(extensionLookupType, lookupFlags, reader, offset + extensionOffset);
+ return subTableLoader(extensionLookupType, lookupFlags, markFilteringSet, reader, offset + extensionOffset);
}
}
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType8SubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType8SubTable.cs
index ec009404b..3a4e5c03a 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType8SubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/LookupType8SubTable.cs
@@ -10,14 +10,14 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GSub;
///
internal static class LookupType8SubTable
{
- public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupSubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
reader.Seek(offset, SeekOrigin.Begin);
ushort substFormat = reader.ReadUInt16();
return substFormat switch
{
- 1 => LookupType8Format1SubTable.Load(reader, offset, lookupFlags),
+ 1 => LookupType8Format1SubTable.Load(reader, offset, lookupFlags, markFilteringSet),
_ => new NotImplementedSubTable(),
};
}
@@ -35,8 +35,9 @@ private LookupType8Format1SubTable(
CoverageTable coverageTable,
CoverageTable[] backtrackCoverageTables,
CoverageTable[] lookaheadCoverageTables,
- LookupFlags lookupFlags)
- : base(lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
+ : base(lookupFlags, markFilteringSet)
{
this.substituteGlyphIds = substituteGlyphIds;
this.coverageTable = coverageTable;
@@ -44,7 +45,7 @@ private LookupType8Format1SubTable(
this.lookaheadCoverageTables = lookaheadCoverageTables;
}
- public static LookupType8Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags)
+ public static LookupType8Format1SubTable Load(BigEndianBinaryReader reader, long offset, LookupFlags lookupFlags, ushort markFilteringSet)
{
// ReverseChainSingleSubstFormat1
// +----------+-----------------------------------------------+----------------------------------------------+
@@ -88,11 +89,17 @@ public static LookupType8Format1SubTable Load(BigEndianBinaryReader reader, long
ushort glyphCount = reader.ReadUInt16();
ushort[] substituteGlyphIds = reader.ReadUInt16Array(glyphCount);
- var coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
+ CoverageTable coverageTable = CoverageTable.Load(reader, offset + coverageOffset);
CoverageTable[] backtrackCoverageTables = CoverageTable.LoadArray(reader, offset, backtrackCoverageOffsets);
CoverageTable[] lookaheadCoverageTables = CoverageTable.LoadArray(reader, offset, lookaheadCoverageOffsets);
- return new LookupType8Format1SubTable(substituteGlyphIds, coverageTable, backtrackCoverageTables, lookaheadCoverageTables, lookupFlags);
+ return new LookupType8Format1SubTable(
+ substituteGlyphIds,
+ coverageTable,
+ backtrackCoverageTables,
+ lookaheadCoverageTables,
+ lookupFlags,
+ markFilteringSet);
}
public override bool TrySubstitution(
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/NotImplementedSubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/NotImplementedSubTable.cs
index adc711b79..40bfa226b 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/NotImplementedSubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSub/NotImplementedSubTable.cs
@@ -6,7 +6,7 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.GSub;
internal class NotImplementedSubTable : LookupSubTable
{
public NotImplementedSubTable()
- : base(default)
+ : base(default, 0)
{
}
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSubTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSubTable.cs
index 453b05e26..11181e4a8 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSubTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GSubTable.cs
@@ -150,7 +150,7 @@ current is not ScriptClass.Common and not ScriptClass.Unknown and not ScriptClas
count += delta;
IEnumerable stages = shaper.GetShapingStages();
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, default);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, default, 0);
foreach (ShapingStage stage in stages)
{
collectionCount = collection.Count;
@@ -208,7 +208,8 @@ internal void ApplyFeature(
foreach ((Tag Feature, ushort Index, LookupTable LookupTable) featureLookup in lookups)
{
Tag feature = featureLookup.Feature;
- iterator.Reset(index, featureLookup.LookupTable.LookupFlags);
+ LookupTable featureLookupTable = featureLookup.LookupTable;
+ iterator.Reset(index, featureLookupTable.LookupFlags, featureLookupTable.MarkFilteringSet);
while (iterator.Index < index + count)
{
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GlyphDefinitionTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GlyphDefinitionTable.cs
index 1cffb088a..c4cd4b78f 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/GlyphDefinitionTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/GlyphDefinitionTable.cs
@@ -65,6 +65,9 @@ public bool TryGetMarkAttachmentClass(ushort glyphId, [NotNullWhen(true)] out Gl
return true;
}
+ public bool IsInMarkGlyphSet(ushort markGlyphSetIndex, ushort glyphId)
+ => this.MarkGlyphSetsTable?.Contains(markGlyphSetIndex, glyphId) == true;
+
public static GlyphDefinitionTable Load(BigEndianBinaryReader reader)
{
// Header version 1.0
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/MarkGlyphSetsTable.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/MarkGlyphSetsTable.cs
index 19b4e241e..1be4857ae 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/MarkGlyphSetsTable.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/MarkGlyphSetsTable.cs
@@ -7,7 +7,9 @@ internal sealed class MarkGlyphSetsTable
{
public ushort Format { get; internal set; }
- public ushort[]? CoverageOffset { get; internal set; }
+ public uint[]? CoverageOffset { get; internal set; }
+
+ public CoverageTable[]? Coverages { get; private set; }
public static MarkGlyphSetsTable Load(BigEndianBinaryReader reader, long offset)
{
@@ -17,9 +19,38 @@ public static MarkGlyphSetsTable Load(BigEndianBinaryReader reader, long offset)
{
Format = reader.ReadUInt16()
};
+
ushort markSetCount = reader.ReadUInt16();
- markGlyphSetsTable.CoverageOffset = reader.ReadUInt16Array(markSetCount);
+ uint[] coverageOffsets = reader.ReadUInt32Array(markSetCount);
+ markGlyphSetsTable.CoverageOffset = coverageOffsets;
+
+ // Load the referenced Coverage tables now so we can use them during shaping.
+ // Coverage offsets are relative to the start of the MarkGlyphSets table.
+ CoverageTable[] coverages = new CoverageTable[markSetCount];
+ for (int i = 0; i < markSetCount; i++)
+ {
+ long covOffset = offset + coverageOffsets[i];
+ coverages[i] = CoverageTable.Load(reader, covOffset);
+ }
+ markGlyphSetsTable.Coverages = coverages;
return markGlyphSetsTable;
}
+
+ public bool Contains(ushort markGlyphSetIndex, ushort glyphId)
+ {
+ CoverageTable[]? coverages = this.Coverages;
+ if (coverages is null)
+ {
+ return false;
+ }
+
+ int i = markGlyphSetIndex;
+ if ((uint)i >= (uint)coverages.Length)
+ {
+ return false;
+ }
+
+ return coverages[i].CoverageIndexOf(glyphId) >= 0;
+ }
}
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/HangulShaper.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/HangulShaper.cs
index 9198fdcaa..41fe6f99f 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/HangulShaper.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/HangulShaper.cs
@@ -92,6 +92,9 @@ protected override void AssignFeatures(IGlyphShapingCollection collection, int i
// Apply the state machine to map glyphs to features.
if (collection is GlyphSubstitutionCollection substitutionCollection)
{
+ // Allocate a small buffer for composition operations.
+ Span compositionBuffer = stackalloc ushort[3];
+
// GSub
int state = 0;
for (int i = 0; i < count; i++)
@@ -107,6 +110,8 @@ protected override void AssignFeatures(IGlyphShapingCollection collection, int i
byte[] actionsWithState = StateTable[state, type];
byte action = actionsWithState[0];
state = actionsWithState[1];
+
+ // TODO: Do not stackalloc in the loop.
switch (action)
{
case Decompose:
@@ -114,7 +119,7 @@ protected override void AssignFeatures(IGlyphShapingCollection collection, int i
// Decompose the composed syllable if it is not supported by the font.
if (data.GlyphId == 0)
{
- i = this.DecomposeGlyph(substitutionCollection, data, i);
+ i = this.DecomposeGlyph(substitutionCollection, data, i, compositionBuffer);
}
break;
@@ -122,7 +127,7 @@ protected override void AssignFeatures(IGlyphShapingCollection collection, int i
case Compose:
// Found a decomposed syllable. Try to compose if supported by the font.
- i = this.ComposeGlyph(substitutionCollection, i, type);
+ i = this.ComposeGlyph(substitutionCollection, i, type, compositionBuffer);
break;
case ToneMark:
@@ -134,7 +139,7 @@ protected override void AssignFeatures(IGlyphShapingCollection collection, int i
case Invalid:
// Tone mark has no valid syllable to attach to, so insert a dotted circle.
- i = this.InsertDottedCircle(substitutionCollection, data, i);
+ i = this.InsertDottedCircle(substitutionCollection, data, i, compositionBuffer);
break;
}
}
@@ -206,7 +211,7 @@ private static int GetSyllableLength(CodePoint codePoint)
_ => 0,
};
- private int DecomposeGlyph(GlyphSubstitutionCollection collection, GlyphShapingData data, int index)
+ private int DecomposeGlyph(GlyphSubstitutionCollection collection, GlyphShapingData data, int index, Span compositinoBuffer)
{
// Decompose the syllable into a sequence of glyphs.
int s = data.CodePoint.Value - HangulBase;
@@ -229,7 +234,7 @@ private int DecomposeGlyph(GlyphSubstitutionCollection collection, GlyphShapingD
// and apply the proper OpenType features to each component.
if (t <= TBase)
{
- Span ii = stackalloc ushort[2];
+ Span ii = compositinoBuffer[..2];
ii[1] = vjmo;
ii[0] = ljmo;
@@ -239,7 +244,7 @@ private int DecomposeGlyph(GlyphSubstitutionCollection collection, GlyphShapingD
return index + 1;
}
- Span iii = stackalloc ushort[3];
+ Span iii = compositinoBuffer[..3];
iii[2] = tjmo;
iii[1] = vjmo;
iii[0] = ljmo;
@@ -251,7 +256,7 @@ private int DecomposeGlyph(GlyphSubstitutionCollection collection, GlyphShapingD
return index + 2;
}
- private int ComposeGlyph(GlyphSubstitutionCollection collection, int index, int type)
+ private int ComposeGlyph(GlyphSubstitutionCollection collection, int index, int type, Span compositionBuffer)
{
if (index == 0)
{
@@ -336,7 +341,7 @@ private int ComposeGlyph(GlyphSubstitutionCollection collection, int index, int
// Sequence was originally , which got combined earlier.
// Either the T was non-combining, or the LVT glyph wasn't supported.
// Decompose the glyph again and apply OT features.
- this.DecomposeGlyph(collection, collection[index - 1], index - 1);
+ this.DecomposeGlyph(collection, collection[index - 1], index - 1, compositionBuffer);
return index + 1;
}
@@ -368,7 +373,7 @@ private void ReOrderToneMark(GlyphSubstitutionCollection collection, GlyphShapin
collection.MoveGlyph(index, index - len);
}
- private int InsertDottedCircle(GlyphSubstitutionCollection collection, GlyphShapingData data, int index)
+ private int InsertDottedCircle(GlyphSubstitutionCollection collection, GlyphShapingData data, int index, Span compositionBuffer)
{
bool after = false;
FontMetrics fontMetrics = this.fontMetrics;
@@ -386,7 +391,7 @@ private int InsertDottedCircle(GlyphSubstitutionCollection collection, GlyphShap
}
// If the tone mark is zero width, insert the dotted circle before, otherwise after
- Span glyphs = stackalloc ushort[2];
+ Span glyphs = compositionBuffer[..2];
if (after)
{
glyphs[1] = id;
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/IndicShaper.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/IndicShaper.cs
index 193735328..59e839f74 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/IndicShaper.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/IndicShaper.cs
@@ -17,6 +17,8 @@ internal sealed class IndicShaper : DefaultShaper
private static readonly StateMachine StateMachine =
new(StateTable, AcceptingStates, Tags);
+ private static readonly int[] CategoryToSymbolId = BuildCategoryToSymbolId();
+
private static readonly Tag RphfTag = Tag.Parse("rphf");
private static readonly Tag NuktTag = Tag.Parse("nukt");
private static readonly Tag AkhnTag = Tag.Parse("akhn");
@@ -48,6 +50,8 @@ internal sealed class IndicShaper : DefaultShaper
private ShapingConfiguration indicConfiguration;
private readonly bool isOldSpec;
+ private bool hasBrokenClusters;
+
public IndicShaper(ScriptClass script, Tag unicodeScriptTag, TextOptions textOptions, FontMetrics fontMetrics)
: base(script, MarkZeroingMode.None, textOptions)
{
@@ -68,7 +72,7 @@ public IndicShaper(ScriptClass script, Tag unicodeScriptTag, TextOptions textOpt
protected override void PlanFeatures(IGlyphShapingCollection collection, int index, int count)
{
- this.AddFeature(collection, index, count, LoclTag, preAction: SetupSyllables);
+ this.AddFeature(collection, index, count, LoclTag, preAction: this.SetupSyllables);
this.AddFeature(collection, index, count, CcmpTag);
this.AddFeature(collection, index, count, NuktTag, preAction: this.InitialReorder);
@@ -108,7 +112,7 @@ protected override void AssignFeatures(IGlyphShapingCollection collection, int i
// Decompose split matras
Span buffer = stackalloc ushort[16];
int end = index + count;
- for (int i = end - 1; i >= 0; i--)
+ for (int i = end - 1; i >= index; i--)
{
GlyphShapingData data = substitutionCollection[i];
if ((Decompositions.TryGetValue(data.CodePoint.Value, out int[]? decompositions) ||
@@ -116,36 +120,56 @@ protected override void AssignFeatures(IGlyphShapingCollection collection, int i
decompositions != null)
{
Span ids = buffer[..decompositions.Length];
+ bool shouldDecompose = true;
for (int j = 0; j < decompositions.Length; j++)
{
- // Font should always contain the decomposed glyph since the shaper
- // is assigned based on features supported by the font.
- _ = fontMetrics.TryGetGlyphId(new CodePoint(decompositions[j]), out ushort id);
+ if (!fontMetrics.TryGetGlyphId(new CodePoint(decompositions[j]), out ushort id))
+ {
+ shouldDecompose = false;
+ break;
+ }
+
ids[j] = id;
}
- substitutionCollection.Replace(i, ids, FeatureTags.GlyphCompositionDecomposition);
- for (int j = 0; j < decompositions.Length; j++)
+ if (shouldDecompose)
{
- substitutionCollection[i + j].CodePoint = new(decompositions[j]);
+ substitutionCollection.Replace(i, ids, FeatureTags.GlyphCompositionDecomposition);
+ for (int j = 0; j < decompositions.Length; j++)
+ {
+ substitutionCollection[i + j].CodePoint = new(decompositions[j]);
+ }
}
}
}
}
- private static void SetupSyllables(IGlyphShapingCollection collection, int index, int count)
+ private void SetupSyllables(IGlyphShapingCollection collection, int index, int count)
{
if (collection is not GlyphSubstitutionCollection substitutionCollection)
{
return;
}
+ this.hasBrokenClusters = false;
+
Span values = count <= 64 ? stackalloc int[count] : new int[count];
for (int i = index; i < index + count; i++)
{
+ // Convert HarfBuzz-style Indic shaping categories into the compact
+ // DFA symbol indices used by the generated state machine.
+ //
+ // HarfBuzz category codes (C=1, V=2, MR=36, VBlw=21, etc.) are sparse
+ // and can be larger than the alphabet size of the DFA. Our state
+ // machine expects its input alphabet to be dense 0..N-1, matching the
+ // sequential IDs assigned in GenerateIndicShapingDataTrie.
+ //
+ // CategoryToSymbolId[IndicShapingCategory(codePoint)] performs this mapping, ensuring that
+ // every codepoint is presented to the DFA using the correct compact
+ // symbol index.
CodePoint codePoint = substitutionCollection[i].CodePoint;
- values[i - index] = IndicShapingCategory(codePoint);
+ values[i - index] = CategoryToSymbolId[IndicShapingCategory(codePoint)];
}
int syllable = 0;
@@ -170,10 +194,17 @@ private static void SetupSyllables(IGlyphShapingCollection collection, int index
GlyphShapingData data = substitutionCollection[i + index];
CodePoint codePoint = data.CodePoint;
+ string syllableType = match.Tags[0];
+
+ if (syllableType == "broken_cluster")
+ {
+ this.hasBrokenClusters = true;
+ }
+
data.IndicShapingEngineInfo = new(
- (Categories)(1 << IndicShapingCategory(codePoint)),
+ (Categories)IndicShapingCategory(codePoint),
(Positions)IndicShapingPosition(codePoint),
- match.Tags[0],
+ syllableType,
syllable);
}
@@ -237,51 +268,70 @@ private void InitialReorder(IGlyphShapingCollection collection, int index, int c
}
}
- bool hasDottedCircle = fontMetrics.TryGetGlyphId(new(DottedCircle), out ushort circleId);
- _ = fontMetrics.TryGetGSubTable(out GSubTable? gSubTable);
int max = index + count;
int start = index;
int end = NextSyllable(substitutionCollection, index, max);
- Span glyphs = stackalloc ushort[2];
- while (start < max)
- {
- GlyphShapingData data = substitutionCollection[start];
- IndicShapingEngineInfo? dataInfo = data.IndicShapingEngineInfo;
- string? type = dataInfo?.SyllableType;
-
- if (type is "symbol_cluster" or "non_indic_cluster")
- {
- goto Increment;
- }
- if (dataInfo != null && hasDottedCircle && type == "broken_cluster")
+ if (this.hasBrokenClusters)
+ {
+ if (fontMetrics.TryGetGlyphId(new(DottedCircle), out ushort circleId))
{
- // Insert after possible Repha.
- int i = start;
- GlyphShapingData current = substitutionCollection[i];
- for (i = start; i < end; i++)
+ Span glyphs = stackalloc ushort[2];
+ while (start < max)
{
- if (current.IndicShapingEngineInfo?.Category != Categories.Repha)
+ GlyphShapingData data = substitutionCollection[start];
+ IndicShapingEngineInfo? dataInfo = data.IndicShapingEngineInfo;
+ string? type = dataInfo?.SyllableType;
+
+ if (type == "broken_cluster")
{
- break;
+ // Insert after possible Repha.
+ int i = start;
+ for (i = start; i < end; i++)
+ {
+ if (substitutionCollection[i].IndicShapingEngineInfo?.Category != Categories.Repha)
+ {
+ break;
+ }
+ }
+
+ GlyphShapingData current = substitutionCollection[i];
+ IndicShapingEngineInfo currentInfo = current.IndicShapingEngineInfo!;
+ glyphs[0] = current.GlyphId;
+ glyphs[1] = circleId;
+
+ substitutionCollection.Replace(i, glyphs, FeatureTags.GlyphCompositionDecomposition);
+
+ // Update shaping info for newly inserted data.
+ GlyphShapingData dotted = substitutionCollection[i + 1];
+ dotted.IndicShapingEngineInfo!.Category = Categories.Dotted_Circle;
+ dotted.IndicShapingEngineInfo.Position = Positions.End;
+ dotted.IndicShapingEngineInfo.SyllableType = currentInfo.SyllableType;
+ dotted.IndicShapingEngineInfo.Syllable = currentInfo.Syllable;
+
+ end++;
+ max++;
}
- current = substitutionCollection[i];
+ start = end;
+ end = NextSyllable(substitutionCollection, start, max);
}
- glyphs[0] = current.GlyphId;
- glyphs[1] = circleId;
-
- substitutionCollection.Replace(i, glyphs, FeatureTags.GlyphCompositionDecomposition);
+ start = index;
+ end = NextSyllable(substitutionCollection, index, max);
+ }
+ }
- // Update shaping info for newly inserted data.
- GlyphShapingData dotted = substitutionCollection[i + 1];
- Categories dottedCategory = (Categories)(1 << IndicShapingCategory(dotted.CodePoint));
- Positions dottedPosition = (Positions)IndicShapingPosition(dotted.CodePoint);
- dotted.IndicShapingEngineInfo = new(dottedCategory, dottedPosition, dataInfo.SyllableType, dataInfo.Syllable);
+ _ = fontMetrics.TryGetGSubTable(out GSubTable? gSubTable);
+ while (start < max)
+ {
+ GlyphShapingData data = substitutionCollection[start];
+ IndicShapingEngineInfo? dataInfo = data.IndicShapingEngineInfo;
+ string? type = dataInfo?.SyllableType;
- end++;
- max++;
+ if (type is "symbol_cluster" or "non_indic_cluster")
+ {
+ goto Increment;
}
// 1. Find base consonant:
@@ -548,7 +598,7 @@ private void InitialReorder(IGlyphShapingCollection collection, int index, int c
IndicShapingEngineInfo? info = substitutionCollection[i].IndicShapingEngineInfo;
if (info != null)
{
- if ((info.Category & (JoinerFlags | Categories.N | Categories.RS | Categories.CM | (HalantOrCoengFlags & info.Category))) != 0)
+ if ((FlagUnsafe(info.Category) & (JoinerFlags | Flag(Categories.N) | Flag(Categories.RS) | Flag(Categories.CM) | (HalantOrCoengFlags & FlagUnsafe(info.Category)))) != 0)
{
info.Position = lastPosition;
if (info.Category == Categories.H && info.Position == Positions.Pre_M)
@@ -600,7 +650,7 @@ private void InitialReorder(IGlyphShapingCollection collection, int index, int c
last = i;
}
- else if (info.Category == Categories.M)
+ else if ((FlagUnsafe(info.Category) & Flag(Categories.M)) != 0)
{
last = i;
}
@@ -792,7 +842,7 @@ private bool WouldSubstitute(GlyphSubstitutionCollection collection, in Tag feat
if (fontMetrics.TryGetGSubTable(out GSubTable? gSubTable))
{
const int index = 0;
- SkippingGlyphIterator iterator = new(fontMetrics, collection, index, default);
+ SkippingGlyphIterator iterator = new(fontMetrics, collection, index, default, 0);
int initialCount = collection.Count;
int collectionCount = initialCount;
int count = initialCount - index;
@@ -824,13 +874,13 @@ private bool WouldSubstitute(GlyphSubstitutionCollection collection, in Tag feat
}
private static bool IsConsonant(GlyphShapingData data)
- => data.IndicShapingEngineInfo != null && (data.IndicShapingEngineInfo.Category & ConsonantFlags) != 0;
+ => data.IndicShapingEngineInfo != null && (FlagUnsafe(data.IndicShapingEngineInfo.Category) & ConsonantFlags) != 0;
private static bool IsJoiner(GlyphShapingData data)
- => data.IndicShapingEngineInfo != null && (data.IndicShapingEngineInfo.Category & JoinerFlags) != 0;
+ => data.IndicShapingEngineInfo != null && (FlagUnsafe(data.IndicShapingEngineInfo.Category) & JoinerFlags) != 0;
private static bool IsHalantOrCoeng(GlyphShapingData data)
- => data.IndicShapingEngineInfo != null && (data.IndicShapingEngineInfo.Category & HalantOrCoengFlags) != 0;
+ => data.IndicShapingEngineInfo != null && (FlagUnsafe(data.IndicShapingEngineInfo.Category) & HalantOrCoengFlags) != 0;
private static int NextSyllable(GlyphSubstitutionCollection collection, int index, int count)
{
@@ -962,7 +1012,7 @@ private void FinalReorder(IGlyphShapingCollection collection, int index, int cou
if (basePosition < end)
{
- while (start < basePosition && (substitutionCollection[basePosition].IndicShapingEngineInfo?.Category & (Categories.N | HalantOrCoengFlags)) != 0)
+ while (start < basePosition && (FlagUnsafe(substitutionCollection[basePosition].IndicShapingEngineInfo?.Category) & (Flag(Categories.N) | HalantOrCoengFlags)) != 0)
{
basePosition--;
}
@@ -988,7 +1038,7 @@ private void FinalReorder(IGlyphShapingCollection collection, int index, int cou
// We want to position matra after them.
if (this.ScriptClass is not ScriptClass.Malayalam and not ScriptClass.Tamil)
{
- while (newPos > start && (substitutionCollection[newPos].IndicShapingEngineInfo?.Category & (Categories.M | HalantOrCoengFlags)) == 0)
+ while (newPos > start && (FlagUnsafe(substitutionCollection[newPos].IndicShapingEngineInfo?.Category) & (Flag(Categories.M) | HalantOrCoengFlags)) == 0)
{
newPos--;
}
@@ -1165,7 +1215,7 @@ private void FinalReorder(IGlyphShapingCollection collection, int index, int cou
{
for (int i = basePosition + 1; i < newRephPos; i++)
{
- if (substitutionCollection[i].IndicShapingEngineInfo?.Category == Categories.M)
+ if ((FlagUnsafe(substitutionCollection[i].IndicShapingEngineInfo?.Category) & Flag(Categories.M)) != 0)
{
newRephPos--;
}
@@ -1217,11 +1267,12 @@ private void FinalReorder(IGlyphShapingCollection collection, int index, int cou
// We want to position matra after them.
if (this.ScriptClass is not ScriptClass.Malayalam and not ScriptClass.Tamil)
{
- while (newPos > start && (substitutionCollection[newPos - 1].IndicShapingEngineInfo?.Category & (Categories.M | HalantOrCoengFlags)) == 0)
+ while (newPos > start && (FlagUnsafe(substitutionCollection[newPos - 1].IndicShapingEngineInfo?.Category) & (Flag(Categories.M) | HalantOrCoengFlags)) == 0)
{
newPos--;
}
+ // TODO: Remove once we have Kmher shaper.
// In Khmer coeng model, a H,Ra can go *after* matras. If it goes after a
// split matra, it should be reordered to *before* the left part of such matra.
if (newPos > start && substitutionCollection[newPos - 1].IndicShapingEngineInfo?.Category == Categories.M)
@@ -1271,4 +1322,34 @@ private void FinalReorder(IGlyphShapingCollection collection, int index, int cou
end = NextSyllable(substitutionCollection, start, max);
}
}
+
+ private static int[] BuildCategoryToSymbolId()
+ {
+ // Get all enum values in declared order (important!)
+ Categories[] values = Enum.GetValues();
+
+ // Determine maximum underlying numeric category so we can index safetly
+ int maxCategoryValue = 0;
+ foreach (Categories v in values)
+ {
+ int val = (int)v;
+ if (val > maxCategoryValue)
+ {
+ maxCategoryValue = val;
+ }
+ }
+
+ // Allocate mapping table indexed by Harfbuzz category code
+ int[] map = new int[maxCategoryValue + 1];
+
+ // Assign compact DFA symbol indices 0..N-1 in enum order
+ for (int symbolId = 0; symbolId < values.Length; symbolId++)
+ {
+ Categories cat = values[symbolId];
+ int categoryCode = (int)cat; // Harfbuzz-style category code
+ map[categoryCode] = symbolId; // DFA symbol id
+ }
+
+ return map;
+ }
}
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/MyanmarShaper.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/MyanmarShaper.cs
new file mode 100644
index 000000000..03f7a3f8a
--- /dev/null
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/MyanmarShaper.cs
@@ -0,0 +1,433 @@
+// Copyright (c) Six Labors.
+// Licensed under the Six Labors Split License.
+
+using SixLabors.Fonts.Unicode;
+using UnicodeTrieGenerator.StateAutomation;
+using static SixLabors.Fonts.Unicode.Resources.IndicShapingData;
+
+namespace SixLabors.Fonts.Tables.AdvancedTypographic.Shapers;
+
+internal sealed class MyanmarShaper : DefaultShaper
+{
+ private static readonly StateMachine StateMachine =
+ new(
+ Unicode.Resources.MyanmarShapingData.StateTable,
+ Unicode.Resources.MyanmarShapingData.AcceptingStates,
+ Unicode.Resources.MyanmarShapingData.Tags);
+
+ private static readonly int[] CategoryToSymbolId = BuildCategoryToSymbolId();
+
+ // Basic features.
+ // These features are applied in order, one at a time, after reordering, constrained to the syllable.
+ private static readonly Tag RphfTag = Tag.Parse("rphf");
+ private static readonly Tag PrefTag = Tag.Parse("pref");
+ private static readonly Tag BlwfTag = Tag.Parse("blwf");
+ private static readonly Tag PstfTag = Tag.Parse("pstf");
+
+ // Other features.
+ // These features are applied all at once, after clearing syllables.
+ private static readonly Tag PresTag = Tag.Parse("pres");
+ private static readonly Tag AbvsTag = Tag.Parse("abvs");
+ private static readonly Tag BlwsTag = Tag.Parse("blws");
+ private static readonly Tag PstsTag = Tag.Parse("psts");
+
+ private const int DottedCircle = 0x25cc;
+
+ private readonly TextOptions textOptions;
+ private readonly FontMetrics fontMetrics;
+
+ private bool hasBrokenClusters;
+
+ public MyanmarShaper(ScriptClass script, TextOptions textOptions, FontMetrics fontMetrics)
+ : base(script, MarkZeroingMode.PreGPos, textOptions)
+ {
+ this.textOptions = textOptions;
+ this.fontMetrics = fontMetrics;
+ }
+
+ protected override void PlanFeatures(IGlyphShapingCollection collection, int index, int count)
+ {
+ this.AddFeature(collection, index, count, LoclTag, preAction: this.SetupSyllables);
+ this.AddFeature(collection, index, count, CcmpTag);
+
+ this.AddFeature(collection, index, count, RphfTag, preAction: this.InitialReorder);
+ this.AddFeature(collection, index, count, PrefTag);
+ this.AddFeature(collection, index, count, BlwfTag);
+ this.AddFeature(collection, index, count, PstfTag);
+
+ this.AddFeature(collection, index, count, PresTag);
+ this.AddFeature(collection, index, count, AbvsTag);
+ this.AddFeature(collection, index, count, BlwsTag);
+ this.AddFeature(collection, index, count, PstsTag);
+ }
+
+ private void SetupSyllables(IGlyphShapingCollection collection, int index, int count)
+ {
+ if (collection is not GlyphSubstitutionCollection substitutionCollection)
+ {
+ return;
+ }
+
+ this.hasBrokenClusters = false;
+
+ Span values = count <= 64 ? stackalloc int[count] : new int[count];
+
+ for (int i = index; i < index + count; i++)
+ {
+ // Convert HarfBuzz-style Myanmar shaping categories into the compact
+ // DFA symbol indices used by the generated state machine.
+ //
+ // HarfBuzz category codes (C=1, V=2, MR=36, VBlw=21, etc.) are sparse
+ // and can be larger than the alphabet size of the DFA. Our state
+ // machine expects its input alphabet to be dense 0..N-1, matching the
+ // sequential IDs assigned in GenerateMyanmarShapingData.
+ //
+ // CategoryToSymbolId[(int)my] performs this mapping, ensuring that
+ // every codepoint is presented to the DFA using the correct compact
+ // symbol index.
+ CodePoint codePoint = substitutionCollection[i].CodePoint;
+ MyanmarCategories my = (MyanmarCategories)IndicShapingCategory(codePoint);
+ values[i - index] = CategoryToSymbolId[(int)my];
+ }
+
+ int syllable = 0;
+ int last = 0;
+ foreach (StateMatch match in StateMachine.Match(values))
+ {
+ if (match.StartIndex > last)
+ {
+ ++syllable;
+ for (int i = last; i < match.StartIndex; i++)
+ {
+ GlyphShapingData data = substitutionCollection[i + index];
+ data.IndicShapingEngineInfo = new(Categories.X, Positions.End, "non_indic_cluster", syllable);
+ }
+ }
+
+ ++syllable;
+
+ // Create shaper info.
+ for (int i = match.StartIndex; i <= match.EndIndex; i++)
+ {
+ GlyphShapingData data = substitutionCollection[i + index];
+ CodePoint codePoint = data.CodePoint;
+
+ string syllableType = match.Tags[0];
+
+ if (syllableType == "broken_cluster")
+ {
+ this.hasBrokenClusters = true;
+ }
+
+ data.IndicShapingEngineInfo = new(
+ (Categories)IndicShapingCategory(codePoint),
+ (Positions)IndicShapingPosition(codePoint),
+ syllableType,
+ syllable);
+ }
+
+ last = match.EndIndex + 1;
+ }
+
+ if (last < count)
+ {
+ ++syllable;
+ for (int i = last; i < count; i++)
+ {
+ GlyphShapingData data = substitutionCollection[i + index];
+ data.IndicShapingEngineInfo = new(Categories.X, Positions.End, "non_indic_cluster", syllable);
+ }
+ }
+ }
+
+ private void InitialReorder(IGlyphShapingCollection collection, int index, int count)
+ {
+ if (collection is not GlyphSubstitutionCollection substitutionCollection)
+ {
+ return;
+ }
+
+ FontMetrics fontMetrics = this.fontMetrics;
+ int max = index + count;
+ int start = index;
+ int end = NextSyllable(substitutionCollection, index, max);
+
+ if (this.hasBrokenClusters)
+ {
+ if (fontMetrics.TryGetGlyphId(new(DottedCircle), out ushort circleId))
+ {
+ Span glyphs = stackalloc ushort[2];
+ while (start < max)
+ {
+ GlyphShapingData data = substitutionCollection[start];
+ IndicShapingEngineInfo? dataInfo = data.IndicShapingEngineInfo;
+ string? type = dataInfo?.SyllableType;
+
+ if (type == "broken_cluster")
+ {
+ // Insert after possible Repha.
+ int i = start;
+ for (i = start; i < end; i++)
+ {
+ if (substitutionCollection[i].IndicShapingEngineInfo?.Category != Categories.Repha)
+ {
+ break;
+ }
+ }
+
+ GlyphShapingData current = substitutionCollection[i];
+ glyphs[0] = current.GlyphId;
+ glyphs[1] = circleId;
+
+ substitutionCollection.Replace(i, glyphs, FeatureTags.GlyphCompositionDecomposition);
+
+ // Update shaping info for newly inserted data.
+ GlyphShapingData dotted = substitutionCollection[i + 1];
+ dotted.IndicShapingEngineInfo!.Category = Categories.Dotted_Circle;
+
+ end++;
+ max++;
+ }
+
+ start = end;
+ end = NextSyllable(substitutionCollection, start, max);
+ }
+
+ start = index;
+ end = NextSyllable(substitutionCollection, index, max);
+ }
+ }
+
+ while (start < max)
+ {
+ GlyphShapingData data = substitutionCollection[start];
+ IndicShapingEngineInfo? dataInfo = data.IndicShapingEngineInfo;
+ string? type = dataInfo?.SyllableType;
+
+ switch (type)
+ {
+ // We already inserted dotted-circles, so just call the consonant_syllable.
+ case "broken_cluster":
+ case "consonant_syllable":
+ ReorderConsonantSyllable(substitutionCollection, start, end);
+ break;
+ default:
+ break;
+ }
+
+ start = end;
+ end = NextSyllable(substitutionCollection, start, max);
+ }
+ }
+
+ private static void ReorderConsonantSyllable(GlyphSubstitutionCollection substitutionCollection, int start, int end)
+ {
+ int basePosition = end;
+ bool hasReph = false;
+ {
+ int limit = start;
+ if (start + 3 <= end &&
+ substitutionCollection[start].IndicShapingEngineInfo?.MyanmarCategory == MyanmarCategories.Ra &&
+ substitutionCollection[start + 1].IndicShapingEngineInfo?.MyanmarCategory == MyanmarCategories.As &&
+ substitutionCollection[start + 2].IndicShapingEngineInfo?.MyanmarCategory == MyanmarCategories.H)
+ {
+ limit += 3;
+ basePosition = start;
+ hasReph = true;
+ }
+
+ {
+ if (!hasReph)
+ {
+ basePosition = limit;
+ }
+
+ for (int i = limit; i < end; i++)
+ {
+ if (IsConsonant(substitutionCollection[i]))
+ {
+ basePosition = i;
+ break;
+ }
+ }
+ }
+ }
+
+ // Reorder
+ {
+ int i = start;
+ for (; i < start + (hasReph ? 3 : 0); i++)
+ {
+ substitutionCollection[i].IndicShapingEngineInfo!.Position = Positions.After_Main;
+ }
+
+ for (; i < basePosition; i++)
+ {
+ substitutionCollection[i].IndicShapingEngineInfo!.Position = Positions.Pre_C;
+ }
+
+ if (i < end)
+ {
+ substitutionCollection[i].IndicShapingEngineInfo!.Position = Positions.Base_C;
+ i++;
+ }
+
+ Positions pos = Positions.After_Main;
+
+ // The following loop may be ugly, but it implements all of Myanmar reordering!
+ for (; i < end; i++)
+ {
+ GlyphShapingData data = substitutionCollection[i];
+ IndicShapingEngineInfo info = data.IndicShapingEngineInfo!;
+
+ // Pre-base reordering
+ if (info.MyanmarCategory == MyanmarCategories.MR)
+ {
+ info.Position = Positions.Pre_C;
+ continue;
+ }
+
+ // Left matra
+ if (info.MyanmarCategory == MyanmarCategories.VPre)
+ {
+ info.Position = Positions.Pre_M;
+ continue;
+ }
+
+ if (info.MyanmarCategory == MyanmarCategories.VS)
+ {
+ info.Position = substitutionCollection[i - 1].IndicShapingEngineInfo!.Position;
+ continue;
+ }
+
+ if (pos == Positions.After_Main && info.MyanmarCategory == MyanmarCategories.VBlw)
+ {
+ pos = Positions.Below_C;
+ info.Position = pos;
+ continue;
+ }
+
+ if (pos == Positions.Below_C && info.MyanmarCategory == MyanmarCategories.A)
+ {
+ info.Position = Positions.Before_Sub;
+ continue;
+ }
+
+ if (pos == Positions.Below_C && info.MyanmarCategory == MyanmarCategories.VBlw)
+ {
+ info.Position = pos;
+ continue;
+ }
+
+ if (pos == Positions.Below_C && info.MyanmarCategory != MyanmarCategories.A)
+ {
+ pos = Positions.After_Sub;
+ info.Position = pos;
+ continue;
+ }
+
+ info.Position = pos;
+ }
+ }
+
+ substitutionCollection.Sort(start, end, (a, b) =>
+ {
+ int pa = a.IndicShapingEngineInfo?.Position != null ? (int)a.IndicShapingEngineInfo.Position : 0;
+ int pb = b.IndicShapingEngineInfo?.Position != null ? (int)b.IndicShapingEngineInfo.Position : 0;
+ return pa - pb;
+ });
+
+ // Flip left-matra sequence.
+ int firstLeftMatra = end;
+ int lastLeftMatra = end;
+
+ for (int i = start; i < end; i++)
+ {
+ if (substitutionCollection[i].IndicShapingEngineInfo?.Position == Positions.Pre_M)
+ {
+ if (firstLeftMatra == end)
+ {
+ firstLeftMatra = i;
+ }
+
+ lastLeftMatra = i;
+ }
+ }
+
+ // https://github.com/harfbuzz/harfbuzz/issues/3863
+ if (firstLeftMatra < lastLeftMatra)
+ {
+ // No need to merge clusters, done already?
+ substitutionCollection.ReverseRange(firstLeftMatra, lastLeftMatra + 1);
+
+ // Reverse back VS, etc.
+ int i = firstLeftMatra;
+ for (int j = i; j <= lastLeftMatra; j++)
+ {
+ if (substitutionCollection[j].IndicShapingEngineInfo?.MyanmarCategory == MyanmarCategories.VPre)
+ {
+ substitutionCollection.ReverseRange(i, j + 1);
+ i = j + 1;
+ }
+ }
+ }
+ }
+
+ private static bool IsConsonant(GlyphShapingData data)
+ => data.IndicShapingEngineInfo != null && (FlagUnsafe(data.IndicShapingEngineInfo.MyanmarCategory) & MyanmarConsonantFlags) != 0;
+
+ private static int NextSyllable(GlyphSubstitutionCollection collection, int index, int count)
+ {
+ if (index >= count)
+ {
+ return index;
+ }
+
+ int? syllable = collection[index].IndicShapingEngineInfo?.Syllable;
+ while (++index < count)
+ {
+ if (collection[index].IndicShapingEngineInfo?.Syllable != syllable)
+ {
+ break;
+ }
+ }
+
+ return index;
+ }
+
+ private static int IndicShapingCategory(CodePoint codePoint)
+ => UnicodeData.GetIndicShapingProperties((uint)codePoint.Value) >> 8;
+
+ private static int IndicShapingPosition(CodePoint codePoint)
+ => 1 << (UnicodeData.GetIndicShapingProperties((uint)codePoint.Value) & 0xFF);
+
+ private static int[] BuildCategoryToSymbolId()
+ {
+ // Get all enum values in declared order (important!)
+ MyanmarCategories[] values = Enum.GetValues();
+
+ // Determine maximum underlying numeric category so we can index safetly
+ int maxCategoryValue = 0;
+ foreach (MyanmarCategories v in values)
+ {
+ int val = (int)v;
+ if (val > maxCategoryValue)
+ {
+ maxCategoryValue = val;
+ }
+ }
+
+ // Allocate mapping table indexed by Harfbuzz category code
+ int[] map = new int[maxCategoryValue + 1];
+
+ // Assign compact DFA symbol indices 0..N-1 in enum order
+ for (int symbolId = 0; symbolId < values.Length; symbolId++)
+ {
+ MyanmarCategories cat = values[symbolId];
+ int categoryCode = (int)cat; // Harfbuzz-style category code
+ map[categoryCode] = symbolId; // DFA symbol id
+ }
+
+ return map;
+ }
+}
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/ShaperFactory.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/ShaperFactory.cs
index 3358c0183..d46173ebb 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/ShaperFactory.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/ShaperFactory.cs
@@ -7,6 +7,8 @@ namespace SixLabors.Fonts.Tables.AdvancedTypographic.Shapers;
internal static class ShaperFactory
{
+ private static readonly Tag Mym2Tag = Tag.Parse("mym2");
+
///
/// Creates a shaper based on the given script language.
///
@@ -47,6 +49,20 @@ or ScriptClass.Tamil
or ScriptClass.Telugu
or ScriptClass.Khmer => new IndicShaper(script, unicodeScriptTag, textOptions, fontMetrics),
+ // Myanmar
+ ScriptClass.Myanmar
+
+ // If the designer designed the font for the 'DFLT' script,
+ // (or we ended up arbitrarily pick 'latn'), use the default shaper.
+ // Otherwise, use the specific shaper.
+ //
+ // If designer designed for 'mymr' tag, also send to default
+ // shaper. That's tag used from before Myanmar shaping spec
+ // was developed. The shaping spec uses 'mym2' tag.
+ => unicodeScriptTag == Mym2Tag
+ ? new MyanmarShaper(script, textOptions, fontMetrics)
+ : new DefaultShaper(script, textOptions),
+
// Universal
ScriptClass.Balinese
or ScriptClass.Batak
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/UniversalShaper.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/UniversalShaper.cs
index aac8b85e6..f5ce8c9db 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/UniversalShaper.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/Shapers/UniversalShaper.cs
@@ -42,6 +42,8 @@ internal sealed class UniversalShaper : DefaultShaper
private readonly FontMetrics fontMetrics;
+ private bool hasBrokenClusters;
+
public UniversalShaper(ScriptClass script, TextOptions textOptions, FontMetrics fontMetrics)
: base(script, MarkZeroingMode.PreGPos, textOptions)
=> this.fontMetrics = fontMetrics;
@@ -50,7 +52,7 @@ public UniversalShaper(ScriptClass script, TextOptions textOptions, FontMetrics
protected override void PlanFeatures(IGlyphShapingCollection collection, int index, int count)
{
// Default glyph pre-processing group
- this.AddFeature(collection, index, count, LoclTag, preAction: SetupSyllables);
+ this.AddFeature(collection, index, count, LoclTag, preAction: this.SetupSyllables);
this.AddFeature(collection, index, count, CcmpTag);
this.AddFeature(collection, index, count, NuktTag);
this.AddFeature(collection, index, count, AkhnTag);
@@ -92,36 +94,45 @@ private void DecomposeSplitVowels(IGlyphShapingCollection collection, int index,
FontMetrics fontMetrics = this.fontMetrics;
Span buffer = stackalloc ushort[16];
int end = index + count;
- for (int i = end - 1; i >= 0; i--)
+ for (int i = end - 1; i >= index; i--)
{
GlyphShapingData data = substitutionCollection[i];
if (UniversalShapingData.Decompositions.TryGetValue(data.CodePoint.Value, out int[]? decompositions) && decompositions != null)
{
Span ids = buffer[..decompositions.Length];
+ bool shouldDecompose = true;
for (int j = 0; j < decompositions.Length; j++)
{
- // Font should always contain the decomposed glyph since the shaper
- // is assigned based on features supported by the font.
- _ = fontMetrics.TryGetGlyphId(new CodePoint(decompositions[j]), out ushort id);
+ if (!fontMetrics.TryGetGlyphId(new CodePoint(decompositions[j]), out ushort id))
+ {
+ shouldDecompose = false;
+ break;
+ }
+
ids[j] = id;
}
- substitutionCollection.Replace(i, ids, FeatureTags.GlyphCompositionDecomposition);
- for (int j = 0; j < decompositions.Length; j++)
+ if (shouldDecompose)
{
- substitutionCollection[i + j].CodePoint = new(decompositions[j]);
+ substitutionCollection.Replace(i, ids, FeatureTags.GlyphCompositionDecomposition);
+ for (int j = 0; j < decompositions.Length; j++)
+ {
+ substitutionCollection[i + j].CodePoint = new(decompositions[j]);
+ }
}
}
}
}
- private static void SetupSyllables(IGlyphShapingCollection collection, int index, int count)
+ private void SetupSyllables(IGlyphShapingCollection collection, int index, int count)
{
if (collection is not GlyphSubstitutionCollection substitutionCollection)
{
return;
}
+ this.hasBrokenClusters = false;
+
Span values = count <= 64 ? stackalloc int[count] : new int[count];
for (int i = index; i < index + count; i++)
{
@@ -141,7 +152,14 @@ private static void SetupSyllables(IGlyphShapingCollection collection, int index
CodePoint codePoint = data.CodePoint;
string category = UniversalShapingData.Categories[UnicodeData.GetUniversalShapingSymbolCount((uint)codePoint.Value)];
- data.UniversalShapingEngineInfo = new(category, match.Tags[0], syllable);
+ string syllableType = match.Tags[0];
+
+ if (syllableType == "broken_cluster")
+ {
+ this.hasBrokenClusters = true;
+ }
+
+ data.UniversalShapingEngineInfo = new(category, syllableType, syllable);
}
// Assign rphf feature
@@ -223,12 +241,59 @@ private void Reorder(IGlyphShapingCollection collection, int index, int count)
}
FontMetrics fontMetrics = this.fontMetrics;
- bool hasDottedCircle = fontMetrics.TryGetGlyphId(new(DottedCircle), out ushort circleId);
int max = index + count;
int start = index;
int end = NextSyllable(substitutionCollection, index, max);
- Span glyphs = stackalloc ushort[2];
+ if (this.hasBrokenClusters)
+ {
+ if (fontMetrics.TryGetGlyphId(new(DottedCircle), out ushort circleId))
+ {
+ Span glyphs = stackalloc ushort[2];
+ while (start < max)
+ {
+ GlyphShapingData data = substitutionCollection[start];
+ UniversalShapingEngineInfo? info = data.UniversalShapingEngineInfo;
+ string? type = info?.SyllableType;
+
+ if (type == "broken_cluster")
+ {
+ // Insert after possible Repha.
+ int i = start;
+ for (i = start; i < end; i++)
+ {
+ if (substitutionCollection[i].UniversalShapingEngineInfo?.Category != "R")
+ {
+ break;
+ }
+ }
+
+ GlyphShapingData current = substitutionCollection[i];
+ UniversalShapingEngineInfo currentInfo = current.UniversalShapingEngineInfo!;
+ glyphs[0] = current.GlyphId;
+ glyphs[1] = circleId;
+
+ substitutionCollection.Replace(i, glyphs, FeatureTags.GlyphCompositionDecomposition);
+
+ // Update shaping info for newly inserted data.
+ GlyphShapingData dotted = substitutionCollection[i + 1];
+ dotted.UniversalShapingEngineInfo!.Category = "B";
+ dotted.UniversalShapingEngineInfo.SyllableType = currentInfo.SyllableType;
+ dotted.UniversalShapingEngineInfo.Syllable = currentInfo.Syllable;
+
+ end++;
+ max++;
+ }
+
+ start = end;
+ end = NextSyllable(substitutionCollection, start, max);
+ }
+
+ start = index;
+ end = NextSyllable(substitutionCollection, index, max);
+ }
+ }
+
while (start < max)
{
GlyphShapingData data = substitutionCollection[start];
@@ -238,32 +303,10 @@ private void Reorder(IGlyphShapingCollection collection, int index, int count)
// Only a few syllable types need reordering.
if (type is not "virama_terminated_cluster" and not "standard_cluster" and not "broken_cluster")
{
+ // TODO: Check this. Harfbuzz seems to test more categories and returns.
goto Increment;
}
- if (hasDottedCircle && type == "broken_cluster")
- {
- // Insert after possible Repha.
- int i = start;
- GlyphShapingData current = substitutionCollection[i];
- for (i = start; i < end; i++)
- {
- if (current.UniversalShapingEngineInfo?.Category != "R")
- {
- break;
- }
-
- current = substitutionCollection[i];
- }
-
- glyphs[0] = current.GlyphId;
- glyphs[1] = circleId;
-
- substitutionCollection.Replace(i, glyphs, FeatureTags.GlyphCompositionDecomposition);
- end++;
- max++;
- }
-
// Move things forward
if (info?.Category == "R" && end - start > 1)
{
@@ -288,7 +331,7 @@ private void Reorder(IGlyphShapingCollection collection, int index, int count)
}
// Move things back
- for (int i = start, j = end; i < end; i++)
+ for (int i = start, j = start; i < end; i++)
{
GlyphShapingData current = substitutionCollection[i];
info = current.UniversalShapingEngineInfo;
diff --git a/src/SixLabors.Fonts/Tables/AdvancedTypographic/SkippingGlyphIterator.cs b/src/SixLabors.Fonts/Tables/AdvancedTypographic/SkippingGlyphIterator.cs
index 286119346..abd432a9f 100644
--- a/src/SixLabors.Fonts/Tables/AdvancedTypographic/SkippingGlyphIterator.cs
+++ b/src/SixLabors.Fonts/Tables/AdvancedTypographic/SkippingGlyphIterator.cs
@@ -10,12 +10,15 @@ internal struct SkippingGlyphIterator
private bool ignoreBaseGlyphs;
private bool ignoreLigatures;
private ushort markAttachmentType;
+ private bool useMarkFilteringSet;
+ private ushort markFilteringSet;
public SkippingGlyphIterator(
FontMetrics fontMetrics,
IGlyphShapingCollection collection,
int index,
- LookupFlags lookupFlags)
+ LookupFlags lookupFlags,
+ ushort markFilteringSet)
{
this.fontMetrics = fontMetrics;
this.Collection = collection;
@@ -24,6 +27,8 @@ public SkippingGlyphIterator(
this.ignoreBaseGlyphs = (lookupFlags & LookupFlags.IgnoreBaseGlyphs) != 0;
this.ignoreLigatures = (lookupFlags & LookupFlags.IgnoreLigatures) != 0;
this.markAttachmentType = (ushort)((int)(lookupFlags & LookupFlags.MarkAttachmentTypeMask) >> 8);
+ this.useMarkFilteringSet = (lookupFlags & LookupFlags.UseMarkFilteringSet) != 0;
+ this.markFilteringSet = markFilteringSet;
}
public IGlyphShapingCollection Collection { get; }
@@ -36,6 +41,12 @@ public int Next()
return this.Index;
}
+ public int Prev()
+ {
+ this.Move(-1);
+ return this.Index;
+ }
+
public int Increment(int count = 1)
{
int direction = count < 0 ? -1 : 1;
@@ -48,13 +59,15 @@ public int Increment(int count = 1)
return this.Index;
}
- public void Reset(int index, LookupFlags lookupFlags)
+ public void Reset(int index, LookupFlags lookupFlags, ushort markFilteringSet)
{
this.Index = index;
this.ignoreMarks = (lookupFlags & LookupFlags.IgnoreMarks) != 0;
this.ignoreBaseGlyphs = (lookupFlags & LookupFlags.IgnoreBaseGlyphs) != 0;
this.ignoreLigatures = (lookupFlags & LookupFlags.IgnoreLigatures) != 0;
this.markAttachmentType = (ushort)((int)(lookupFlags & LookupFlags.MarkAttachmentTypeMask) >> 8);
+ this.useMarkFilteringSet = (lookupFlags & LookupFlags.UseMarkFilteringSet) != 0;
+ this.markFilteringSet = markFilteringSet;
}
private void Move(int direction)
@@ -75,6 +88,17 @@ private readonly bool ShouldIgnore(int index)
{
GlyphShapingData data = this.Collection[index];
GlyphShapingClass shapingClass = AdvancedTypographicUtils.GetGlyphShapingClass(this.fontMetrics, data.GlyphId, data);
+
+ if (this.useMarkFilteringSet && shapingClass.IsMark)
+ {
+ // Skip marks not in the lookup's MarkFilteringSet.
+ // This requires GDEF MarkGlyphSetsDef support.
+ if (!AdvancedTypographicUtils.IsInMarkFilteringSet(this.fontMetrics, this.markFilteringSet, data.GlyphId))
+ {
+ return true;
+ }
+ }
+
return (this.ignoreMarks && shapingClass.IsMark) ||
(this.ignoreBaseGlyphs && shapingClass.IsBase) ||
(this.ignoreLigatures && shapingClass.IsLigature) ||
diff --git a/src/SixLabors.Fonts/TextLayout.cs b/src/SixLabors.Fonts/TextLayout.cs
index a33d0efdb..76ed850ec 100644
--- a/src/SixLabors.Fonts/TextLayout.cs
+++ b/src/SixLabors.Fonts/TextLayout.cs
@@ -332,9 +332,24 @@ private static List LayoutLineHorizontal(
float originX = penLocation.X;
float offsetX = 0;
- // Set the Y-Origin for the line.
+ // Set the Y origin for the first horizontal line and account for tall stacks.
if (isFirstLine)
{
+ // ScaledMinY is the minimum ink Y for this line in Y down (baseline at 0).
+ // -ScaledMinY is the actual ascent required to contain the ink.
+ // ScaledMaxAscender is the typographic ascent we already used to build the line box.
+ float requiredAscent = -textLine.ScaledMinY;
+ float extraAscent = requiredAscent - textLine.ScaledMaxAscender;
+
+ if (extraAscent > 0)
+ {
+ // Shift the baseline down only by the extra ascent needed so that
+ // stacked glyphs (Tibetan, etc) fit inside the bitmap. For Latin,
+ // requiredAscent ~= ScaledMaxAscender and extraAscent is zero.
+ offsetY += extraAscent;
+ advanceY += extraAscent;
+ }
+
switch (options.VerticalAlignment)
{
case VerticalAlignment.Center:
@@ -512,11 +527,25 @@ private static List LayoutLineVertical(
}
}
- penLocation.Y += offsetY;
-
bool isFirstLine = index == 0;
+ float yExtraAdvance = 0;
if (isFirstLine)
{
+ // First vertical line: add extra ascent if the actual ink extends above
+ // the typographic ascender. This mirrors the horizontal logic but along
+ // the vertical flow direction of the column.
+ float requiredAscent = -textLine.ScaledMinY;
+ float extraAscent = requiredAscent - textLine.ScaledMaxAscender;
+
+ if (extraAscent > 0)
+ {
+ // Move the column baseline down so that the tallest ink above the
+ // baseline fits inside the image, and increase the advance so the
+ // column height matches the new extent.
+ offsetY += extraAscent;
+ yExtraAdvance += extraAscent;
+ }
+
// Set the X-Origin for horizontal alignment.
switch (options.HorizontalAlignment)
{
@@ -537,6 +566,7 @@ private static List LayoutLineVertical(
}
}
+ penLocation.Y += offsetY;
penLocation.X += offsetX;
List glyphs = [];
@@ -581,14 +611,13 @@ private static List LayoutLineVertical(
}
Vector2 offset = new(alignX, (metric.Bounds.Max.Y + metric.TopSideBearing) * scale.Y);
-
glyphs.Add(new GlyphLayout(
new Glyph(metric, data.PointSize),
boxLocation,
penLocation + new Vector2((scaledMaxLineHeight - data.ScaledLineHeight) * .5F, 0),
offset,
advanceX,
- data.ScaledAdvance,
+ data.ScaledAdvance + yExtraAdvance,
GlyphLayoutMode.Vertical,
i == 0 && j == 0,
data.GraphemeIndex,
@@ -597,7 +626,7 @@ private static List LayoutLineVertical(
j++;
}
- penLocation.Y += data.ScaledAdvance;
+ penLocation.Y += data.ScaledAdvance + yExtraAdvance;
}
boxLocation.Y = originY;
@@ -670,11 +699,25 @@ private static List LayoutLineVerticalMixed(
}
}
- penLocation.Y += offsetY;
-
bool isFirstLine = index == 0;
+ float extraAdvance = 0;
if (isFirstLine)
{
+ // First mixed vertical line: compute any extra ascent required for this line.
+ // As with horizontal layout, ScaledMinY captures the true ink top in Y down,
+ // and ScaledMaxAscender is the typographic ascent used for line metrics.
+ float requiredAscent = -textLine.ScaledMinY;
+ float extraAscent = requiredAscent - textLine.ScaledMaxAscender;
+
+ if (extraAscent > 0)
+ {
+ // Push the baseline for the first column down so that tall stacks are
+ // fully visible, and store the extra amount so we can also expand the
+ // advance along the flow direction for all glyphs in this column.
+ offsetY += extraAscent;
+ extraAdvance += extraAscent;
+ }
+
// Set the X-Origin for horizontal alignment.
switch (options.HorizontalAlignment)
{
@@ -695,6 +738,7 @@ private static List LayoutLineVerticalMixed(
}
}
+ penLocation.Y += offsetY;
penLocation.X += offsetX;
List glyphs = [];
@@ -727,7 +771,10 @@ private static List LayoutLineVerticalMixed(
int j = 0;
foreach (GlyphMetrics metric in data.Metrics)
{
- // Align the glyphs horizontally so the baseline is centered.
+ // The glyph will be rotated 90 degrees for vertical mixed layout.
+ // We still advance along Y, but the glyphs are laid out sideways in X.
+
+ // Compute the scale that converts design units to pixels for this size.
Vector2 scale = new Vector2(data.PointSize) / metric.ScaleFactor;
// Calculate the initial horizontal offset to center the glyph baseline:
@@ -741,8 +788,12 @@ private static List LayoutLineVerticalMixed(
float descenderAbs = Math.Abs(data.ScaledDescender);
float descenderDelta = (Math.Abs(textLine.ScaledMaxDescender) - descenderAbs) * .5F;
- // Final horizontal center offset combines the baseline and descender adjustments.
+ // For rotated glyphs, extraAdvance represents additional "height"
+ // that we allocated to the column to fit tall stacks above the baseline.
+ // Adding half of that to the horizontal center offset keeps sideways
+ // glyphs visually centered within the now taller column.
float centerOffsetX = baselineDelta + descenderAbs + descenderDelta;
+ centerOffsetX += extraAdvance * .5F;
glyphs.Add(new GlyphLayout(
new Glyph(metric, data.PointSize),
@@ -750,7 +801,7 @@ private static List LayoutLineVerticalMixed(
penLocation + new Vector2(centerOffsetX, 0),
Vector2.Zero,
advanceX,
- data.ScaledAdvance,
+ data.ScaledAdvance + extraAdvance,
GlyphLayoutMode.VerticalRotated,
i == 0 && j == 0,
data.GraphemeIndex,
@@ -774,7 +825,7 @@ private static List LayoutLineVerticalMixed(
penLocation + new Vector2((scaledMaxLineHeight - data.ScaledLineHeight) * .5F, 0),
offset,
advanceX,
- data.ScaledAdvance,
+ data.ScaledAdvance + extraAdvance,
GlyphLayoutMode.Vertical,
i == 0 && j == 0,
data.GraphemeIndex,
@@ -784,7 +835,7 @@ private static List LayoutLineVerticalMixed(
}
}
- penLocation.Y += data.ScaledAdvance;
+ penLocation.Y += data.ScaledAdvance + extraAdvance;
}
boxLocation.Y = originY;
@@ -1173,6 +1224,16 @@ VerticalOrientationType.Rotate or
ascender -= delta;
descender -= delta;
+ GlyphLayoutMode mode = GlyphLayoutMode.Horizontal;
+ if (isVerticalLayout)
+ {
+ mode = GlyphLayoutMode.Vertical;
+ }
+ else if (isVerticalMixedLayout)
+ {
+ mode = shouldRotate ? GlyphLayoutMode.VerticalRotated : GlyphLayoutMode.Vertical;
+ }
+
// Add our metrics to the line.
textLine.Add(
isDecomposed ? new GlyphMetrics[] { metric } : metrics,
@@ -1187,7 +1248,8 @@ VerticalOrientationType.Rotate or
graphemeCodePointIndex,
shouldRotate || shouldOffset,
isDecomposed,
- stringIndex);
+ stringIndex,
+ mode);
}
codePointIndex++;
@@ -1350,6 +1412,8 @@ internal sealed class TextBox
{
private float? scaledMaxAdvance;
+ private float? minY;
+
public TextBox(IReadOnlyList textLines)
=> this.TextLines = textLines;
@@ -1358,6 +1422,9 @@ public TextBox(IReadOnlyList textLines)
public float ScaledMaxAdvance()
=> this.scaledMaxAdvance ??= this.TextLines.Max(x => x.ScaledLineAdvance);
+ public float ScaledMinY()
+ => this.minY ??= this.TextLines.Min(x => x.ScaledMinY);
+
public TextDirection TextDirection() => this.TextLines[0][0].TextDirection;
}
@@ -1380,6 +1447,8 @@ internal sealed class TextLine
public float ScaledMaxDescender { get; private set; } = -1;
+ public float ScaledMinY { get; private set; }
+
public GlyphLayoutData this[int index] => this.data[index];
public void Add(
@@ -1395,7 +1464,8 @@ public void Add(
int graphemeCodePointIndex,
bool isTransformed,
bool isDecomposed,
- int stringIndex)
+ int stringIndex,
+ GlyphLayoutMode layoutMode)
{
// Reset metrics.
// We track the maximum metrics for each line to ensure glyphs can be aligned.
@@ -1408,6 +1478,33 @@ public void Add(
this.ScaledMaxAscender = MathF.Max(this.ScaledMaxAscender, scaledAscender);
this.ScaledMaxDescender = MathF.Max(this.ScaledMaxDescender, scaledDescender);
+ // Track the true top of the ink in device space (Y down, baseline at 0).
+ // For scripts with stacked marks (Tibetan, etc) this can be significantly
+ // above the typographic ascender, so we cannot trust ascender alone.
+ float scaledMinY = 0;
+ for (int i = 0; i < metrics.Count; i++)
+ {
+ GlyphMetrics metric = metrics[i];
+ if (GlyphMetrics.ShouldSkipGlyphRendering(metric.CodePoint))
+ {
+ continue;
+ }
+
+ FontRectangle bbox = metric.GetBoundingBox(layoutMode, Vector2.Zero, pointSize);
+ scaledMinY = MathF.Min(scaledMinY, bbox.Y);
+ }
+
+ // ScaledMinY is the minimum ink Y over all glyphs in this line, in Y down.
+ // It is usually <= 0; more negative means more ink above the baseline.
+ if (this.data.Count == 0)
+ {
+ this.ScaledMinY = scaledMinY;
+ }
+ else
+ {
+ this.ScaledMinY = MathF.Min(this.ScaledMinY, scaledMinY);
+ }
+
this.data.Add(new(
metrics,
pointSize,
@@ -1415,6 +1512,7 @@ public void Add(
scaledLineHeight,
scaledAscender,
scaledDescender,
+ scaledMinY,
bidiRun,
graphemeIndex,
codePointIndex,
@@ -1736,6 +1834,7 @@ private static void RecalculateLineMetrics(TextLine textLine)
float ascender = 0;
float descender = 0;
float lineHeight = 0;
+ float minY = 0;
for (int i = 0; i < textLine.Count; i++)
{
GlyphLayoutData glyph = textLine[i];
@@ -1743,12 +1842,15 @@ private static void RecalculateLineMetrics(TextLine textLine)
ascender = MathF.Max(ascender, glyph.ScaledAscender);
descender = MathF.Max(descender, glyph.ScaledDescender);
lineHeight = MathF.Max(lineHeight, glyph.ScaledLineHeight);
+ minY = MathF.Min(minY, glyph.ScaledMinY);
}
textLine.ScaledLineAdvance = advance;
textLine.ScaledMaxAscender = ascender;
textLine.ScaledMaxDescender = descender;
textLine.ScaledMaxLineHeight = lineHeight;
+ textLine.ScaledMinY = minY;
+
textLine.advances.Clear();
}
@@ -1823,6 +1925,7 @@ public GlyphLayoutData(
float scaledLineHeight,
float scaledAscender,
float scaledDescender,
+ float scaledMinY,
BidiRun bidiRun,
int graphemeIndex,
int codePointIndex,
@@ -1837,6 +1940,7 @@ public GlyphLayoutData(
this.ScaledLineHeight = scaledLineHeight;
this.ScaledAscender = scaledAscender;
this.ScaledDescender = scaledDescender;
+ this.ScaledMinY = scaledMinY;
this.BidiRun = bidiRun;
this.GraphemeIndex = graphemeIndex;
this.CodePointIndex = codePointIndex;
@@ -1860,6 +1964,8 @@ public GlyphLayoutData(
public float ScaledDescender { get; }
+ public float ScaledMinY { get; }
+
public BidiRun BidiRun { get; }
public readonly TextDirection TextDirection => (TextDirection)this.BidiRun.Direction;
diff --git a/src/SixLabors.Fonts/TextMeasurer.cs b/src/SixLabors.Fonts/TextMeasurer.cs
index 5a0b18be6..fdbfd0131 100644
--- a/src/SixLabors.Fonts/TextMeasurer.cs
+++ b/src/SixLabors.Fonts/TextMeasurer.cs
@@ -149,10 +149,17 @@ internal static FontRectangle GetAdvance(IReadOnlyList glyphLayouts
return FontRectangle.Empty;
}
- float left = float.MaxValue;
- float top = float.MaxValue;
- float bottom = float.MinValue;
- float right = float.MinValue;
+ // Logical advance extents in layout units (before DPI scaling).
+ float logicalLeft = float.MaxValue;
+ float logicalTop = float.MaxValue;
+ float logicalRight = float.MinValue;
+ float logicalBottom = float.MinValue;
+
+ // Ink bounds in pixel units (BoundingBox already scales by DPI).
+ float inkLeft = float.MaxValue;
+ float inkTop = float.MaxValue;
+ float inkRight = float.MinValue;
+ float inkBottom = float.MinValue;
for (int i = 0; i < glyphLayouts.Count; i++)
{
@@ -168,42 +175,73 @@ internal static FontRectangle GetAdvance(IReadOnlyList glyphLayouts
// Glyphs are always laid out from top-left to bottom-right so we can simply use the max.
if (glyph.LayoutMode == GlyphLayoutMode.Horizontal)
{
- y = MathF.Max(y, bottom);
+ y = MathF.Max(y, logicalBottom);
}
else
{
- x = MathF.Max(x, right);
+ x = MathF.Max(x, logicalRight);
}
}
float advanceX = x + glyph.AdvanceX;
float advanceY = y + glyph.AdvanceY;
- if (left > x)
+ if (logicalLeft > x)
+ {
+ logicalLeft = x;
+ }
+
+ if (logicalTop > y)
{
- left = x;
+ logicalTop = y;
}
- if (top > y)
+ if (logicalRight < advanceX)
{
- top = y;
+ logicalRight = advanceX;
}
- if (right < advanceX)
+ if (logicalBottom < advanceY)
{
- right = advanceX;
+ logicalBottom = advanceY;
}
- if (bottom < advanceY)
+ // Ink bounds are in the same coordinate space as pen locations,
+ // but already scaled to pixels by BoundingBox(dpi).
+ FontRectangle box = glyph.BoundingBox(dpi);
+
+ if (inkLeft > box.Left)
{
- bottom = advanceY;
+ inkLeft = box.Left;
+ }
+
+ if (inkTop > box.Top)
+ {
+ inkTop = box.Top;
+ }
+
+ if (inkRight < box.Right)
+ {
+ inkRight = box.Right;
+ }
+
+ if (inkBottom < box.Bottom)
+ {
+ inkBottom = box.Bottom;
}
}
- Vector2 topLeft = new(left, top);
- Vector2 bottomRight = new(right, bottom);
- Vector2 size = (bottomRight - topLeft) * dpi;
- return new FontRectangle(0, 0, size.X, size.Y);
+ // Logical advance rectangle, anchored at the origin in pixel space.
+ Vector2 logicalTopLeft = new(logicalLeft, logicalTop);
+ Vector2 logicalBottomRight = new(logicalRight, logicalBottom);
+ Vector2 logicalSize = (logicalBottomRight - logicalTopLeft) * dpi;
+ FontRectangle logicalRect = new(0, 0, logicalSize.X, logicalSize.Y);
+
+ // Ink bounds rectangle in pixel space.
+ FontRectangle inkRect = FontRectangle.FromLTRB(inkLeft, inkTop, inkRight, inkBottom);
+
+ // Final measurement is the union of logical advance and ink extents.
+ return FontRectangle.Union(inkRect, logicalRect);
}
internal static FontRectangle GetSize(IReadOnlyList glyphLayouts, float dpi)
diff --git a/src/SixLabors.Fonts/Unicode/Resources/IndicShapingData.Generated.cs b/src/SixLabors.Fonts/Unicode/Resources/IndicShapingData.Generated.cs
index 0c223e2c9..ee6e1e76e 100644
--- a/src/SixLabors.Fonts/Unicode/Resources/IndicShapingData.Generated.cs
+++ b/src/SixLabors.Fonts/Unicode/Resources/IndicShapingData.Generated.cs
@@ -11,623 +11,623 @@ internal static partial class IndicShapingData
{
public static int[][] StateTable => new int[617][]
{
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,2,3,4,5,6,7,8,9,0,10,11,11,12,13,14,15,16,17 },
- new int[] { 0,0,0,18,19,20,21,22,23,0,24,0,0,25,26,0,0,27,0 },
- new int[] { 0,0,0,28,29,30,31,32,33,0,34,0,0,35,36,0,0,37,0 },
- new int[] { 0,0,0,38,5,7,7,8,9,0,10,0,0,0,13,0,0,16,0 },
- new int[] { 0,39,0,0,0,40,41,0,9,0,10,0,0,0,42,0,39,0,0 },
- new int[] { 0,0,0,0,43,44,44,8,9,0,0,0,0,12,43,0,0,0,0 },
- new int[] { 0,0,0,0,43,44,44,8,9,0,0,0,0,0,43,0,0,0,0 },
- new int[] { 0,0,0,45,46,47,48,49,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,50,0,0,51,0,10,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,52,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,53,54,55,56,57,58,0,59,0,0,60,61,0,0,62,0 },
- new int[] { 0,0,0,4,5,7,7,8,9,0,10,0,0,0,13,0,0,16,0 },
- new int[] { 0,63,64,0,0,40,41,0,9,0,10,0,0,0,42,0,63,0,0 },
- new int[] { 0,2,3,4,5,6,7,8,9,0,10,11,11,12,13,0,2,16,0 },
- new int[] { 0,0,0,18,65,20,21,22,23,0,24,0,0,25,26,0,0,27,0 },
- new int[] { 0,0,0,0,66,67,67,8,9,0,10,0,0,0,68,0,0,0,0 },
- new int[] { 0,0,0,69,0,70,70,0,71,0,72,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,73,19,74,74,22,23,0,24,0,0,0,26,0,0,27,0 },
- new int[] { 0,75,0,0,0,76,77,0,23,0,24,0,0,0,78,0,75,0,0 },
- new int[] { 0,0,0,0,79,80,80,22,23,0,0,0,0,25,79,0,0,0,0 },
- new int[] { 0,0,0,18,19,20,74,22,23,0,24,0,0,25,26,0,0,27,0 },
- new int[] { 0,0,0,81,82,83,84,85,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,0,86,0,0,87,0,24,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,88,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,18,19,74,74,22,23,0,24,0,0,0,26,0,0,27,0 },
- new int[] { 0,89,90,0,0,76,77,0,23,0,24,0,0,0,78,0,89,0,0 },
- new int[] { 0,0,0,0,91,92,92,22,23,0,24,0,0,0,93,0,0,0,0 },
- new int[] { 0,0,0,94,29,95,31,32,33,0,34,0,0,0,36,0,0,37,0 },
- new int[] { 0,96,0,0,0,97,98,0,33,0,34,0,0,0,99,0,96,0,0 },
- new int[] { 0,0,0,0,100,101,101,32,33,0,0,0,0,35,100,0,0,0,0 },
- new int[] { 0,0,0,0,100,101,101,32,33,0,0,0,0,0,100,0,0,0,0 },
- new int[] { 0,0,0,102,103,104,105,106,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,0,107,0,0,108,0,34,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,28,29,95,31,32,33,0,34,0,0,0,36,0,0,37,0 },
- new int[] { 0,110,111,0,0,97,98,0,33,0,34,0,0,0,99,0,110,0,0 },
- new int[] { 0,0,0,0,112,113,113,32,33,0,34,0,0,0,114,0,0,0,0 },
- new int[] { 0,0,0,0,5,7,7,8,9,0,10,0,0,0,13,0,0,16,0 },
- new int[] { 0,0,0,115,116,117,118,8,9,0,10,0,0,119,120,0,0,16,0 },
- new int[] { 0,0,0,0,0,121,121,0,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,39,0,122,0,123,123,8,9,0,10,0,0,0,42,0,39,0,0 },
- new int[] { 0,124,64,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0 },
- new int[] { 0,39,0,0,0,121,125,0,9,0,10,0,0,0,42,0,39,0,0 },
- new int[] { 0,0,0,0,0,126,126,8,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,46,47,48,49,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,47,47,49,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,127,127,49,9,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,128,127,127,49,9,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,129,130,131,132,133,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,50,0,0,0,0,10,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,134,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,135,54,56,56,57,58,0,59,0,0,0,61,0,0,62,0 },
- new int[] { 0,136,0,0,0,137,138,0,58,0,59,0,0,0,139,0,136,0,0 },
- new int[] { 0,0,0,0,140,141,141,57,58,0,0,0,0,60,140,0,0,0,0 },
- new int[] { 0,0,0,0,140,141,141,57,58,0,0,0,0,0,140,0,0,0,0 },
- new int[] { 0,0,0,142,143,144,145,146,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,0,147,0,0,148,0,59,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,149,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,53,54,56,56,57,58,0,59,0,0,0,61,0,0,62,0 },
- new int[] { 0,150,151,0,0,137,138,0,58,0,59,0,0,0,139,0,150,0,0 },
- new int[] { 0,0,0,0,152,153,153,57,58,0,59,0,0,0,154,0,0,0,0 },
- new int[] { 0,0,0,155,116,156,157,8,9,0,10,0,0,158,120,0,0,16,0 },
- new int[] { 0,0,0,0,0,121,121,0,9,0,10,0,0,0,0,0,0,0,0 },
- new int[] { 0,75,3,4,5,159,160,8,161,0,162,0,11,12,163,0,75,16,0 },
- new int[] { 0,0,0,0,0,40,164,0,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,165,44,44,8,9,0,0,0,0,0,165,0,0,0,0 },
- new int[] { 0,124,64,0,0,40,164,0,9,0,10,0,0,0,42,0,124,0,0 },
- new int[] { 0,0,0,0,0,70,70,0,71,0,72,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,71,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,166,0,0,167,0,72,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,168,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,19,74,74,22,23,0,24,0,0,0,26,0,0,27,0 },
- new int[] { 0,0,0,0,79,80,80,22,23,0,0,0,0,0,79,0,0,0,0 },
- new int[] { 0,0,0,169,170,171,172,22,23,0,24,0,0,173,174,0,0,27,0 },
- new int[] { 0,0,0,0,0,175,175,0,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,75,0,176,0,177,177,22,23,0,24,0,0,0,78,0,75,0,0 },
- new int[] { 0,178,90,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,0 },
- new int[] { 0,75,0,0,0,175,179,0,23,0,24,0,0,0,78,0,75,0,0 },
- new int[] { 0,0,0,0,0,180,180,22,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,82,83,84,85,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,0,83,83,85,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,0,181,181,85,23,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,182,181,181,85,23,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,183,184,185,186,187,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,86,0,0,0,0,24,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,188,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,189,170,190,191,22,23,0,24,0,0,192,174,0,0,27,0 },
- new int[] { 0,0,0,0,0,175,175,0,23,0,24,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,76,193,0,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,194,80,80,22,23,0,0,0,0,0,194,0,0,0,0 },
- new int[] { 0,178,90,0,0,76,193,0,23,0,24,0,0,0,78,0,178,0,0 },
- new int[] { 0,0,0,0,29,95,31,32,33,0,34,0,0,0,36,0,0,37,0 },
- new int[] { 0,0,0,0,100,101,101,32,33,0,0,0,0,0,100,0,0,0,0 },
- new int[] { 0,0,0,195,196,197,198,32,33,0,34,0,0,199,200,0,0,37,0 },
- new int[] { 0,0,0,0,0,201,201,0,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,96,0,202,0,203,203,32,33,0,34,0,0,0,99,0,96,0,0 },
- new int[] { 0,204,111,0,0,0,0,0,0,0,0,0,0,0,0,0,204,0,0 },
- new int[] { 0,96,0,0,0,201,205,0,33,0,34,0,0,0,99,0,96,0,0 },
- new int[] { 0,0,0,0,0,206,206,32,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,103,104,105,106,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,0,104,104,106,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,0,207,207,106,33,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,208,207,207,106,33,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,209,210,211,212,213,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,34,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,107,0,0,0,0,34,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,214,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,215,196,216,217,32,33,0,34,0,0,218,200,0,0,37,0 },
- new int[] { 0,0,0,0,0,201,201,0,33,0,34,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,97,219,0,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,220,101,101,32,33,0,0,0,0,0,220,0,0,0,0 },
- new int[] { 0,204,111,0,0,97,219,0,33,0,34,0,0,0,99,0,204,0,0 },
- new int[] { 0,0,0,221,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0 },
- new int[] { 0,223,0,0,0,40,224,0,9,0,10,0,0,0,42,0,223,0,0 },
- new int[] { 0,0,0,0,225,44,44,8,9,0,0,0,0,119,225,0,0,0,0 },
- new int[] { 0,0,0,115,116,117,222,8,9,0,10,0,0,119,120,0,0,16,0 },
- new int[] { 0,0,0,115,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0 },
- new int[] { 0,226,64,0,0,40,224,0,9,0,10,0,0,0,42,0,226,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,39,0,0,0,121,121,0,9,0,10,0,0,0,42,0,39,0,0 },
- new int[] { 0,0,0,0,0,44,44,8,9,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,227,0,228,229,0,9,0,10,0,0,230,0,0,0,0,0 },
- new int[] { 0,39,0,122,0,121,121,0,9,0,10,0,0,0,42,0,39,0,0 },
- new int[] { 0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,231,231,49,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,232,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,130,131,132,133,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,131,131,133,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,233,233,133,9,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,234,233,233,133,9,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,235,236,237,238,239,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,54,56,56,57,58,0,59,0,0,0,61,0,0,62,0 },
- new int[] { 0,0,0,240,241,242,243,57,58,0,59,0,0,244,245,0,0,62,0 },
- new int[] { 0,0,0,0,0,246,246,0,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,136,0,247,0,248,248,57,58,0,59,0,0,0,139,0,136,0,0 },
- new int[] { 0,249,151,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0 },
- new int[] { 0,136,0,0,0,246,250,0,58,0,59,0,0,0,139,0,136,0,0 },
- new int[] { 0,0,0,0,0,251,251,57,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,143,144,145,146,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,0,144,144,146,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,0,252,252,146,58,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,253,252,252,146,58,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,254,255,256,257,258,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,59,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,147,0,0,0,0,59,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,259,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,260,241,261,262,57,58,0,59,0,0,263,245,0,0,62,0 },
- new int[] { 0,0,0,0,0,246,246,0,58,0,59,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,137,264,0,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,265,141,141,57,58,0,0,0,0,0,265,0,0,0,0 },
- new int[] { 0,249,151,0,0,137,264,0,58,0,59,0,0,0,139,0,249,0,0 },
- new int[] { 0,0,0,221,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0 },
- new int[] { 0,0,0,0,225,44,44,8,9,0,0,0,0,158,225,0,0,0,0 },
- new int[] { 0,0,0,155,116,156,222,8,9,0,10,0,0,158,120,0,0,16,0 },
- new int[] { 0,0,0,155,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0 },
- new int[] { 0,0,0,0,43,266,266,8,161,0,24,0,0,12,267,0,0,0,0 },
- new int[] { 0,75,0,176,43,268,268,269,161,0,24,0,0,0,267,0,75,0,0 },
- new int[] { 0,0,0,0,0,270,0,0,271,0,162,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,272,0,0,0,0,0,0,0,0 },
- new int[] { 0,273,274,0,0,40,41,0,9,0,10,0,0,0,42,0,273,0,0 },
- new int[] { 0,0,0,40,0,123,123,8,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,121,275,0,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,72,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,166,0,0,0,0,72,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,276,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,277,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0 },
- new int[] { 0,279,0,0,0,76,280,0,23,0,24,0,0,0,78,0,279,0,0 },
- new int[] { 0,0,0,0,281,80,80,22,23,0,0,0,0,173,281,0,0,0,0 },
- new int[] { 0,0,0,169,170,171,278,22,23,0,24,0,0,173,174,0,0,27,0 },
- new int[] { 0,0,0,169,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0 },
- new int[] { 0,282,90,0,0,76,280,0,23,0,24,0,0,0,78,0,282,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,75,0,0,0,175,175,0,23,0,24,0,0,0,78,0,75,0,0 },
- new int[] { 0,0,0,0,0,80,80,22,23,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,283,0,284,285,0,23,0,24,0,0,286,0,0,0,0,0 },
- new int[] { 0,75,0,176,0,175,175,0,23,0,24,0,0,0,78,0,75,0,0 },
- new int[] { 0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,287,287,85,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,288,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,184,185,186,187,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,0,185,185,187,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,0,289,289,187,23,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,290,289,289,187,23,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,291,292,293,294,295,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,277,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0 },
- new int[] { 0,0,0,0,281,80,80,22,23,0,0,0,0,192,281,0,0,0,0 },
- new int[] { 0,0,0,189,170,190,278,22,23,0,24,0,0,192,174,0,0,27,0 },
- new int[] { 0,0,0,189,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0 },
- new int[] { 0,0,0,76,0,177,177,22,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,0,175,296,0,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,297,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0 },
- new int[] { 0,299,0,0,0,97,300,0,33,0,34,0,0,0,99,0,299,0,0 },
- new int[] { 0,0,0,0,301,101,101,32,33,0,0,0,0,199,301,0,0,0,0 },
- new int[] { 0,0,0,195,196,197,298,32,33,0,34,0,0,199,200,0,0,37,0 },
- new int[] { 0,0,0,195,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0 },
- new int[] { 0,302,111,0,0,97,300,0,33,0,34,0,0,0,99,0,302,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,96,0,0,0,201,201,0,33,0,34,0,0,0,99,0,96,0,0 },
- new int[] { 0,0,0,0,0,101,101,32,33,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,303,0,304,305,0,33,0,34,0,0,306,0,0,0,0,0 },
- new int[] { 0,96,0,202,0,201,201,0,33,0,34,0,0,0,99,0,96,0,0 },
- new int[] { 0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,307,307,106,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,308,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,210,211,212,213,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,0,211,211,213,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,0,309,309,213,33,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,310,309,309,213,33,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,311,312,313,314,315,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,297,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0 },
- new int[] { 0,0,0,0,301,101,101,32,33,0,0,0,0,218,301,0,0,0,0 },
- new int[] { 0,0,0,215,196,216,298,32,33,0,34,0,0,218,200,0,0,37,0 },
- new int[] { 0,0,0,215,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0 },
- new int[] { 0,0,0,97,0,203,203,32,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,0,201,316,0,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0 },
- new int[] { 0,0,0,0,225,44,44,8,9,0,0,0,0,0,225,0,0,0,0 },
- new int[] { 0,0,0,317,318,319,320,8,9,0,10,0,0,321,322,0,0,16,0 },
- new int[] { 0,223,0,323,0,123,123,8,9,0,10,0,0,0,42,0,223,0,0 },
- new int[] { 0,223,0,0,0,121,324,0,9,0,10,0,0,0,42,0,223,0,0 },
- new int[] { 0,0,0,325,318,326,327,8,9,0,10,0,0,328,322,0,0,16,0 },
- new int[] { 0,0,0,64,0,121,121,0,9,0,10,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,9,0,0,0,0,230,0,0,0,0,0 },
- new int[] { 0,0,0,227,0,228,121,0,9,0,10,0,0,230,0,0,0,0,0 },
- new int[] { 0,0,0,227,0,121,121,0,9,0,10,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,49,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0 },
- new int[] { 0,0,0,0,0,329,329,133,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,330,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,236,237,238,239,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,237,237,239,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,331,331,239,9,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,332,331,331,239,9,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,333,40,121,334,0,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,335,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0 },
- new int[] { 0,337,0,0,0,137,338,0,58,0,59,0,0,0,139,0,337,0,0 },
- new int[] { 0,0,0,0,339,141,141,57,58,0,0,0,0,244,339,0,0,0,0 },
- new int[] { 0,0,0,240,241,242,336,57,58,0,59,0,0,244,245,0,0,62,0 },
- new int[] { 0,0,0,240,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0 },
- new int[] { 0,340,151,0,0,137,338,0,58,0,59,0,0,0,139,0,340,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,58,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,136,0,0,0,246,246,0,58,0,59,0,0,0,139,0,136,0,0 },
- new int[] { 0,0,0,0,0,141,141,57,58,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,341,0,342,343,0,58,0,59,0,0,344,0,0,0,0,0 },
- new int[] { 0,136,0,247,0,246,246,0,58,0,59,0,0,0,139,0,136,0,0 },
- new int[] { 0,0,0,0,0,0,0,57,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,345,345,146,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,346,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,255,256,257,258,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,0,256,256,258,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,0,347,347,258,58,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,348,347,347,258,58,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,349,350,351,352,353,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,335,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0 },
- new int[] { 0,0,0,0,339,141,141,57,58,0,0,0,0,263,339,0,0,0,0 },
- new int[] { 0,0,0,260,241,261,336,57,58,0,59,0,0,263,245,0,0,62,0 },
- new int[] { 0,0,0,260,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0 },
- new int[] { 0,0,0,137,0,248,248,57,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,0,246,354,0,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,0,126,126,8,23,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,355,90,0,0,121,125,0,9,0,10,0,0,0,42,0,355,0,0 },
- new int[] { 0,0,0,0,0,356,356,269,23,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,357,358,359,360,361,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,270,0,0,0,0,162,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,363,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,364,116,365,366,8,161,0,162,0,0,367,120,0,0,16,0 },
- new int[] { 0,0,0,0,0,368,368,0,161,0,162,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,40,0,121,121,0,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0 },
- new int[] { 0,0,0,0,281,80,80,22,23,0,0,0,0,0,281,0,0,0,0 },
- new int[] { 0,0,0,369,370,371,372,22,23,0,24,0,0,373,374,0,0,27,0 },
- new int[] { 0,279,0,375,0,177,177,22,23,0,24,0,0,0,78,0,279,0,0 },
- new int[] { 0,279,0,0,0,175,376,0,23,0,24,0,0,0,78,0,279,0,0 },
- new int[] { 0,0,0,377,370,378,379,22,23,0,24,0,0,380,374,0,0,27,0 },
- new int[] { 0,0,0,90,0,175,175,0,23,0,24,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,23,0,0,0,0,286,0,0,0,0,0 },
- new int[] { 0,0,0,283,0,284,175,0,23,0,24,0,0,286,0,0,0,0,0 },
- new int[] { 0,0,0,283,0,175,175,0,23,0,24,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,0,0 },
- new int[] { 0,0,0,0,0,381,381,187,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,382,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,292,293,294,295,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,0,293,293,295,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,0,383,383,295,23,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,384,383,383,295,23,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,385,76,175,386,0,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,76,0,175,175,0,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0 },
- new int[] { 0,0,0,0,301,101,101,32,33,0,0,0,0,0,301,0,0,0,0 },
- new int[] { 0,0,0,387,388,389,390,32,33,0,34,0,0,391,392,0,0,37,0 },
- new int[] { 0,299,0,393,0,203,203,32,33,0,34,0,0,0,99,0,299,0,0 },
- new int[] { 0,299,0,0,0,201,394,0,33,0,34,0,0,0,99,0,299,0,0 },
- new int[] { 0,0,0,395,388,396,397,32,33,0,34,0,0,398,392,0,0,37,0 },
- new int[] { 0,0,0,111,0,201,201,0,33,0,34,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,33,0,0,0,0,306,0,0,0,0,0 },
- new int[] { 0,0,0,303,0,304,201,0,33,0,34,0,0,306,0,0,0,0,0 },
- new int[] { 0,0,0,303,0,201,201,0,33,0,34,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,106,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,0,0 },
- new int[] { 0,0,0,0,0,399,399,213,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,400,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,312,313,314,315,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,0,313,313,315,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,0,401,401,315,33,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,402,401,401,315,33,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,403,97,201,404,0,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,97,0,201,201,0,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,405,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0 },
- new int[] { 0,407,0,0,0,40,408,0,9,0,10,0,0,0,42,0,407,0,0 },
- new int[] { 0,0,0,0,409,44,44,8,9,0,0,0,0,321,409,0,0,0,0 },
- new int[] { 0,0,0,317,318,319,406,8,9,0,10,0,0,321,322,0,0,16,0 },
- new int[] { 0,0,0,317,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0 },
- new int[] { 0,410,64,0,0,40,408,0,9,0,10,0,0,0,42,0,410,0,0 },
- new int[] { 0,223,0,0,0,121,121,0,9,0,10,0,0,0,42,0,223,0,0 },
- new int[] { 0,223,0,323,0,121,121,0,9,0,10,0,0,0,42,0,223,0,0 },
- new int[] { 0,0,0,405,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0 },
- new int[] { 0,0,0,0,409,44,44,8,9,0,0,0,0,328,409,0,0,0,0 },
- new int[] { 0,0,0,325,318,326,406,8,9,0,10,0,0,328,322,0,0,16,0 },
- new int[] { 0,0,0,325,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0 },
- new int[] { 0,0,0,0,0,0,0,133,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130,0,0 },
- new int[] { 0,0,0,0,0,411,411,239,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,412,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,40,121,334,0,9,0,10,0,0,0,42,0,0,0,0 },
- new int[] { 0,0,0,0,413,0,0,0,9,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0 },
- new int[] { 0,0,0,0,339,141,141,57,58,0,0,0,0,0,339,0,0,0,0 },
- new int[] { 0,0,0,414,415,416,417,57,58,0,59,0,0,418,419,0,0,62,0 },
- new int[] { 0,337,0,420,0,248,248,57,58,0,59,0,0,0,139,0,337,0,0 },
- new int[] { 0,337,0,0,0,246,421,0,58,0,59,0,0,0,139,0,337,0,0 },
- new int[] { 0,0,0,422,415,423,424,57,58,0,59,0,0,425,419,0,0,62,0 },
- new int[] { 0,0,0,151,0,246,246,0,58,0,59,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,58,0,0,0,0,344,0,0,0,0,0 },
- new int[] { 0,0,0,341,0,342,246,0,58,0,59,0,0,344,0,0,0,0,0 },
- new int[] { 0,0,0,341,0,246,246,0,58,0,59,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,146,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,0,0 },
- new int[] { 0,0,0,0,0,426,426,258,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,427,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,350,351,352,353,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,0,351,351,353,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,0,428,428,353,58,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,429,428,428,353,58,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,430,137,246,431,0,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,137,0,246,246,0,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,432,116,433,434,8,161,0,162,0,0,435,120,0,0,16,0 },
- new int[] { 0,0,0,0,0,180,180,269,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,358,359,360,361,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,0,0,0,0,359,359,361,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,0,0,0,0,436,436,361,161,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,437,436,436,361,161,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,438,439,440,441,442,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,443,274,0,0,0,0,0,0,0,0,0,0,0,0,0,443,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,444,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0 },
- new int[] { 0,0,0,0,225,44,44,8,161,0,0,0,0,367,225,0,0,0,0 },
- new int[] { 0,0,0,364,116,365,445,8,161,0,162,0,0,367,120,0,0,16,0 },
- new int[] { 0,0,0,364,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0 },
- new int[] { 0,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,446,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0 },
- new int[] { 0,448,0,0,0,76,449,0,23,0,24,0,0,0,78,0,448,0,0 },
- new int[] { 0,0,0,0,450,80,80,22,23,0,0,0,0,373,450,0,0,0,0 },
- new int[] { 0,0,0,369,370,371,447,22,23,0,24,0,0,373,374,0,0,27,0 },
- new int[] { 0,0,0,369,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0 },
- new int[] { 0,451,90,0,0,76,449,0,23,0,24,0,0,0,78,0,451,0,0 },
- new int[] { 0,279,0,0,0,175,175,0,23,0,24,0,0,0,78,0,279,0,0 },
- new int[] { 0,279,0,375,0,175,175,0,23,0,24,0,0,0,78,0,279,0,0 },
- new int[] { 0,0,0,446,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0 },
- new int[] { 0,0,0,0,450,80,80,22,23,0,0,0,0,380,450,0,0,0,0 },
- new int[] { 0,0,0,377,370,378,447,22,23,0,24,0,0,380,374,0,0,27,0 },
- new int[] { 0,0,0,377,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0 },
- new int[] { 0,0,0,0,0,0,0,187,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,0,0 },
- new int[] { 0,0,0,0,0,452,452,295,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,453,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,76,175,386,0,23,0,24,0,0,0,78,0,0,0,0 },
- new int[] { 0,0,0,0,454,0,0,0,23,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,455,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0 },
- new int[] { 0,457,0,0,0,97,458,0,33,0,34,0,0,0,99,0,457,0,0 },
- new int[] { 0,0,0,0,459,101,101,32,33,0,0,0,0,391,459,0,0,0,0 },
- new int[] { 0,0,0,387,388,389,456,32,33,0,34,0,0,391,392,0,0,37,0 },
- new int[] { 0,0,0,387,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0 },
- new int[] { 0,460,111,0,0,97,458,0,33,0,34,0,0,0,99,0,460,0,0 },
- new int[] { 0,299,0,0,0,201,201,0,33,0,34,0,0,0,99,0,299,0,0 },
- new int[] { 0,299,0,393,0,201,201,0,33,0,34,0,0,0,99,0,299,0,0 },
- new int[] { 0,0,0,455,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0 },
- new int[] { 0,0,0,0,459,101,101,32,33,0,0,0,0,398,459,0,0,0,0 },
- new int[] { 0,0,0,395,388,396,456,32,33,0,34,0,0,398,392,0,0,37,0 },
- new int[] { 0,0,0,395,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0 },
- new int[] { 0,0,0,0,0,0,0,213,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,0,0 },
- new int[] { 0,0,0,0,0,461,461,315,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,462,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,97,201,404,0,33,0,34,0,0,0,99,0,0,0,0 },
- new int[] { 0,0,0,0,463,0,0,0,33,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0 },
- new int[] { 0,0,0,0,409,44,44,8,9,0,0,0,0,0,409,0,0,0,0 },
- new int[] { 0,0,0,464,465,466,467,8,9,0,10,0,0,468,469,0,0,16,0 },
- new int[] { 0,407,0,470,0,123,123,8,9,0,10,0,0,0,42,0,407,0,0 },
- new int[] { 0,407,0,0,0,121,471,0,9,0,10,0,0,0,42,0,407,0,0 },
- new int[] { 0,0,0,472,465,473,474,8,9,0,10,0,0,475,469,0,0,16,0 },
- new int[] { 0,0,0,0,0,0,0,239,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,0,0 },
- new int[] { 0,0,0,0,0,0,476,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,477,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0 },
- new int[] { 0,479,0,0,0,137,480,0,58,0,59,0,0,0,139,0,479,0,0 },
- new int[] { 0,0,0,0,481,141,141,57,58,0,0,0,0,418,481,0,0,0,0 },
- new int[] { 0,0,0,414,415,416,478,57,58,0,59,0,0,418,419,0,0,62,0 },
- new int[] { 0,0,0,414,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0 },
- new int[] { 0,482,151,0,0,137,480,0,58,0,59,0,0,0,139,0,482,0,0 },
- new int[] { 0,337,0,0,0,246,246,0,58,0,59,0,0,0,139,0,337,0,0 },
- new int[] { 0,337,0,420,0,246,246,0,58,0,59,0,0,0,139,0,337,0,0 },
- new int[] { 0,0,0,477,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0 },
- new int[] { 0,0,0,0,481,141,141,57,58,0,0,0,0,425,481,0,0,0,0 },
- new int[] { 0,0,0,422,415,423,478,57,58,0,59,0,0,425,419,0,0,62,0 },
- new int[] { 0,0,0,422,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0 },
- new int[] { 0,0,0,0,0,0,0,258,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0 },
- new int[] { 0,0,0,0,0,483,483,353,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,484,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,137,246,431,0,58,0,59,0,0,0,139,0,0,0,0 },
- new int[] { 0,0,0,0,485,0,0,0,58,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,444,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0 },
- new int[] { 0,0,0,0,225,44,44,8,161,0,0,0,0,435,225,0,0,0,0 },
- new int[] { 0,0,0,432,116,433,445,8,161,0,162,0,0,435,120,0,0,16,0 },
- new int[] { 0,0,0,432,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0 },
- new int[] { 0,0,0,0,0,486,486,361,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,487,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,439,440,441,442,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,0,0,0,0,440,440,442,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,0,0,0,0,488,488,442,161,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,489,488,488,442,161,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,490,491,492,493,494,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,0,0,495,0,496,497,0,161,0,162,0,0,498,0,0,0,0,0 },
- new int[] { 0,0,0,0,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0 },
- new int[] { 0,0,0,0,225,44,44,8,161,0,0,0,0,0,225,0,0,0,0 },
- new int[] { 0,0,0,0,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0 },
- new int[] { 0,0,0,0,450,80,80,22,23,0,0,0,0,0,450,0,0,0,0 },
- new int[] { 0,0,0,499,500,501,502,22,23,0,24,0,0,503,504,0,0,27,0 },
- new int[] { 0,448,0,505,0,177,177,22,23,0,24,0,0,0,78,0,448,0,0 },
- new int[] { 0,448,0,0,0,175,506,0,23,0,24,0,0,0,78,0,448,0,0 },
- new int[] { 0,0,0,507,500,508,509,22,23,0,24,0,0,510,504,0,0,27,0 },
- new int[] { 0,0,0,0,0,0,0,295,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,292,0,0 },
- new int[] { 0,0,0,0,0,0,511,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0 },
- new int[] { 0,0,0,0,459,101,101,32,33,0,0,0,0,0,459,0,0,0,0 },
- new int[] { 0,0,0,512,513,514,515,32,33,0,34,0,0,516,517,0,0,37,0 },
- new int[] { 0,457,0,518,0,203,203,32,33,0,34,0,0,0,99,0,457,0,0 },
- new int[] { 0,457,0,0,0,201,519,0,33,0,34,0,0,0,99,0,457,0,0 },
- new int[] { 0,0,0,520,513,521,522,32,33,0,34,0,0,523,517,0,0,37,0 },
- new int[] { 0,0,0,0,0,0,0,315,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,312,0,0 },
- new int[] { 0,0,0,0,0,0,524,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,525,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0 },
- new int[] { 0,527,0,0,0,40,528,0,9,0,10,0,0,0,42,0,527,0,0 },
- new int[] { 0,0,0,0,529,44,44,8,9,0,0,0,0,468,529,0,0,0,0 },
- new int[] { 0,0,0,464,465,466,526,8,9,0,10,0,0,468,469,0,0,16,0 },
- new int[] { 0,0,0,464,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0 },
- new int[] { 0,530,64,0,0,40,528,0,9,0,10,0,0,0,42,0,530,0,0 },
- new int[] { 0,407,0,0,0,121,121,0,9,0,10,0,0,0,42,0,407,0,0 },
- new int[] { 0,407,0,470,0,121,121,0,9,0,10,0,0,0,42,0,407,0,0 },
- new int[] { 0,0,0,525,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0 },
- new int[] { 0,0,0,0,529,44,44,8,9,0,0,0,0,475,529,0,0,0,0 },
- new int[] { 0,0,0,472,465,473,526,8,9,0,10,0,0,475,469,0,0,16,0 },
- new int[] { 0,0,0,472,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0 },
- new int[] { 0,0,0,0,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0 },
- new int[] { 0,0,0,0,481,141,141,57,58,0,0,0,0,0,481,0,0,0,0 },
- new int[] { 0,0,0,531,532,533,534,57,58,0,59,0,0,535,536,0,0,62,0 },
- new int[] { 0,479,0,537,0,248,248,57,58,0,59,0,0,0,139,0,479,0,0 },
- new int[] { 0,479,0,0,0,246,538,0,58,0,59,0,0,0,139,0,479,0,0 },
- new int[] { 0,0,0,539,532,540,541,57,58,0,59,0,0,542,536,0,0,62,0 },
- new int[] { 0,0,0,0,0,0,0,353,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,350,0,0 },
- new int[] { 0,0,0,0,0,0,543,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,361,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,358,0,0 },
- new int[] { 0,0,0,0,0,544,544,442,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,545,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,491,492,493,494,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,0,0,0,0,492,492,494,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,0,0,0,0,546,546,494,161,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,547,546,546,494,161,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,548,549,368,550,0,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,0,0,274,0,368,368,0,161,0,162,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,161,0,0,0,0,498,0,0,0,0,0 },
- new int[] { 0,0,0,495,0,496,368,0,161,0,162,0,0,498,0,0,0,0,0 },
- new int[] { 0,0,0,495,0,368,368,0,161,0,162,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,551,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0 },
- new int[] { 0,553,0,0,0,76,554,0,23,0,24,0,0,0,78,0,553,0,0 },
- new int[] { 0,0,0,0,555,80,80,22,23,0,0,0,0,503,555,0,0,0,0 },
- new int[] { 0,0,0,499,500,501,552,22,23,0,24,0,0,503,504,0,0,27,0 },
- new int[] { 0,0,0,499,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0 },
- new int[] { 0,556,90,0,0,76,554,0,23,0,24,0,0,0,78,0,556,0,0 },
- new int[] { 0,448,0,0,0,175,175,0,23,0,24,0,0,0,78,0,448,0,0 },
- new int[] { 0,448,0,505,0,175,175,0,23,0,24,0,0,0,78,0,448,0,0 },
- new int[] { 0,0,0,551,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0 },
- new int[] { 0,0,0,0,555,80,80,22,23,0,0,0,0,510,555,0,0,0,0 },
- new int[] { 0,0,0,507,500,508,552,22,23,0,24,0,0,510,504,0,0,27,0 },
- new int[] { 0,0,0,507,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,0,0 },
- new int[] { 0,0,0,557,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0 },
- new int[] { 0,559,0,0,0,97,560,0,33,0,34,0,0,0,99,0,559,0,0 },
- new int[] { 0,0,0,0,561,101,101,32,33,0,0,0,0,516,561,0,0,0,0 },
- new int[] { 0,0,0,512,513,514,558,32,33,0,34,0,0,516,517,0,0,37,0 },
- new int[] { 0,0,0,512,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0 },
- new int[] { 0,562,111,0,0,97,560,0,33,0,34,0,0,0,99,0,562,0,0 },
- new int[] { 0,457,0,0,0,201,201,0,33,0,34,0,0,0,99,0,457,0,0 },
- new int[] { 0,457,0,518,0,201,201,0,33,0,34,0,0,0,99,0,457,0,0 },
- new int[] { 0,0,0,557,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0 },
- new int[] { 0,0,0,0,561,101,101,32,33,0,0,0,0,523,561,0,0,0,0 },
- new int[] { 0,0,0,520,513,521,558,32,33,0,34,0,0,523,517,0,0,37,0 },
- new int[] { 0,0,0,520,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,0,0 },
- new int[] { 0,0,0,0,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0 },
- new int[] { 0,0,0,0,529,44,44,8,9,0,0,0,0,0,529,0,0,0,0 },
- new int[] { 0,0,0,563,66,564,565,8,9,0,10,0,0,566,68,0,0,16,0 },
- new int[] { 0,527,0,567,0,123,123,8,9,0,10,0,0,0,42,0,527,0,0 },
- new int[] { 0,527,0,0,0,121,568,0,9,0,10,0,0,0,42,0,527,0,0 },
- new int[] { 0,0,0,569,66,570,571,8,9,0,10,0,0,572,68,0,0,16,0 },
- new int[] { 0,0,0,573,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0 },
- new int[] { 0,575,0,0,0,137,576,0,58,0,59,0,0,0,139,0,575,0,0 },
- new int[] { 0,0,0,0,577,141,141,57,58,0,0,0,0,535,577,0,0,0,0 },
- new int[] { 0,0,0,531,532,533,574,57,58,0,59,0,0,535,536,0,0,62,0 },
- new int[] { 0,0,0,531,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0 },
- new int[] { 0,578,151,0,0,137,576,0,58,0,59,0,0,0,139,0,578,0,0 },
- new int[] { 0,479,0,0,0,246,246,0,58,0,59,0,0,0,139,0,479,0,0 },
- new int[] { 0,479,0,537,0,246,246,0,58,0,59,0,0,0,139,0,479,0,0 },
- new int[] { 0,0,0,573,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0 },
- new int[] { 0,0,0,0,577,141,141,57,58,0,0,0,0,542,577,0,0,0,0 },
- new int[] { 0,0,0,539,532,540,574,57,58,0,59,0,0,542,536,0,0,62,0 },
- new int[] { 0,0,0,539,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,0,0 },
- new int[] { 0,0,0,0,0,0,0,442,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,439,0,0 },
- new int[] { 0,0,0,0,0,579,579,494,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,580,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,549,368,550,0,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,0,0,0,0,368,368,0,161,0,162,0,0,0,362,0,0,0,0 },
- new int[] { 0,0,0,0,581,0,0,0,161,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0 },
- new int[] { 0,0,0,0,555,80,80,22,23,0,0,0,0,0,555,0,0,0,0 },
- new int[] { 0,0,0,582,91,583,584,22,23,0,24,0,0,585,93,0,0,27,0 },
- new int[] { 0,553,0,586,0,177,177,22,23,0,24,0,0,0,78,0,553,0,0 },
- new int[] { 0,553,0,0,0,175,587,0,23,0,24,0,0,0,78,0,553,0,0 },
- new int[] { 0,0,0,588,91,589,590,22,23,0,24,0,0,591,93,0,0,27,0 },
- new int[] { 0,0,0,0,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0 },
- new int[] { 0,0,0,0,561,101,101,32,33,0,0,0,0,0,561,0,0,0,0 },
- new int[] { 0,0,0,592,112,593,594,32,33,0,34,0,0,595,114,0,0,37,0 },
- new int[] { 0,559,0,596,0,203,203,32,33,0,34,0,0,0,99,0,559,0,0 },
- new int[] { 0,559,0,0,0,201,597,0,33,0,34,0,0,0,99,0,559,0,0 },
- new int[] { 0,0,0,598,112,599,600,32,33,0,34,0,0,601,114,0,0,37,0 },
- new int[] { 0,0,0,602,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0 },
- new int[] { 0,0,0,0,165,44,44,8,9,0,0,0,0,566,165,0,0,0,0 },
- new int[] { 0,0,0,563,66,564,67,8,9,0,10,0,0,566,68,0,0,16,0 },
- new int[] { 0,0,0,563,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0 },
- new int[] { 0,527,0,0,0,121,121,0,9,0,10,0,0,0,42,0,527,0,0 },
- new int[] { 0,527,0,567,0,121,121,0,9,0,10,0,0,0,42,0,527,0,0 },
- new int[] { 0,0,0,602,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0 },
- new int[] { 0,0,0,0,165,44,44,8,9,0,0,0,0,572,165,0,0,0,0 },
- new int[] { 0,0,0,569,66,570,67,8,9,0,10,0,0,572,68,0,0,16,0 },
- new int[] { 0,0,0,569,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0 },
- new int[] { 0,0,0,0,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0 },
- new int[] { 0,0,0,0,577,141,141,57,58,0,0,0,0,0,577,0,0,0,0 },
- new int[] { 0,0,0,603,152,604,605,57,58,0,59,0,0,606,154,0,0,62,0 },
- new int[] { 0,575,0,607,0,248,248,57,58,0,59,0,0,0,139,0,575,0,0 },
- new int[] { 0,575,0,0,0,246,608,0,58,0,59,0,0,0,139,0,575,0,0 },
- new int[] { 0,0,0,609,152,610,611,57,58,0,59,0,0,612,154,0,0,62,0 },
- new int[] { 0,0,0,0,0,0,0,494,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,491,0,0 },
- new int[] { 0,0,0,0,0,0,613,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,614,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0 },
- new int[] { 0,0,0,0,194,80,80,22,23,0,0,0,0,585,194,0,0,0,0 },
- new int[] { 0,0,0,582,91,583,92,22,23,0,24,0,0,585,93,0,0,27,0 },
- new int[] { 0,0,0,582,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0 },
- new int[] { 0,553,0,0,0,175,175,0,23,0,24,0,0,0,78,0,553,0,0 },
- new int[] { 0,553,0,586,0,175,175,0,23,0,24,0,0,0,78,0,553,0,0 },
- new int[] { 0,0,0,614,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0 },
- new int[] { 0,0,0,0,194,80,80,22,23,0,0,0,0,591,194,0,0,0,0 },
- new int[] { 0,0,0,588,91,589,92,22,23,0,24,0,0,591,93,0,0,27,0 },
- new int[] { 0,0,0,588,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0 },
- new int[] { 0,0,0,615,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0 },
- new int[] { 0,0,0,0,220,101,101,32,33,0,0,0,0,595,220,0,0,0,0 },
- new int[] { 0,0,0,592,112,593,113,32,33,0,34,0,0,595,114,0,0,37,0 },
- new int[] { 0,0,0,592,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0 },
- new int[] { 0,559,0,0,0,201,201,0,33,0,34,0,0,0,99,0,559,0,0 },
- new int[] { 0,559,0,596,0,201,201,0,33,0,34,0,0,0,99,0,559,0,0 },
- new int[] { 0,0,0,615,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0 },
- new int[] { 0,0,0,0,220,101,101,32,33,0,0,0,0,601,220,0,0,0,0 },
- new int[] { 0,0,0,598,112,599,113,32,33,0,34,0,0,601,114,0,0,37,0 },
- new int[] { 0,0,0,598,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0 },
- new int[] { 0,0,0,0,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0 },
- new int[] { 0,0,0,616,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0 },
- new int[] { 0,0,0,0,265,141,141,57,58,0,0,0,0,606,265,0,0,0,0 },
- new int[] { 0,0,0,603,152,604,153,57,58,0,59,0,0,606,154,0,0,62,0 },
- new int[] { 0,0,0,603,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0 },
- new int[] { 0,575,0,0,0,246,246,0,58,0,59,0,0,0,139,0,575,0,0 },
- new int[] { 0,575,0,607,0,246,246,0,58,0,59,0,0,0,139,0,575,0,0 },
- new int[] { 0,0,0,616,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0 },
- new int[] { 0,0,0,0,265,141,141,57,58,0,0,0,0,612,265,0,0,0,0 },
- new int[] { 0,0,0,609,152,610,153,57,58,0,59,0,0,612,154,0,0,62,0 },
- new int[] { 0,0,0,609,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,549,0,0 },
- new int[] { 0,0,0,0,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0 },
- new int[] { 0,0,0,0,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0 },
- new int[] { 0,0,0,0,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0 }
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,2,3,4,5,6,7,8,9,10,11,11,12,0,13,14,15,16,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,18,19,20,21,22,23,24,0,0,25,0,0,0,26,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,28,29,30,31,32,33,34,0,0,35,0,0,0,36,0,0,0,0,0,0,0,0,0,37,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,38,5,7,7,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,39,0,0,0,40,41,0,9,10,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,43,44,44,8,9,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,43,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,43,44,44,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,45,46,47,48,49,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,50,0,0,51,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,53,54,55,56,57,58,59,0,0,60,0,0,0,61,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,4,5,7,7,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,2,3,4,5,6,7,8,9,10,11,11,12,0,0,2,15,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,18,63,20,21,22,23,24,0,0,25,0,0,0,26,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,64,65,65,8,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,67,0,68,68,0,69,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,71,72,0,0,40,41,0,9,10,0,0,0,0,0,71,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,73,19,74,74,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,75,0,0,0,76,77,0,23,24,0,0,0,0,0,75,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,79,80,80,22,23,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,79,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,18,19,20,74,22,23,24,0,0,25,0,0,0,26,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,81,82,83,84,85,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,86,0,0,87,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,18,19,74,74,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,89,90,90,22,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,92,93,0,0,76,77,0,23,24,0,0,0,0,0,92,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,94,29,95,31,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,37,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,96,0,0,0,97,98,0,33,34,0,0,0,0,0,96,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,100,101,101,32,33,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,100,101,101,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,102,103,104,105,106,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,107,0,0,108,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,28,29,95,31,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,37,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,110,111,111,32,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,113,114,0,0,97,98,0,33,34,0,0,0,0,0,113,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,5,7,7,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,115,116,117,118,8,9,10,0,0,119,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,121,121,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,39,0,122,0,123,123,8,9,10,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,124,72,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,39,0,0,0,121,125,0,9,10,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,126,126,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,46,47,48,49,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,47,47,49,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,127,127,49,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,128,127,127,49,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,129,130,131,132,133,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,50,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,135,54,56,56,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,136,0,0,0,137,138,0,58,59,0,0,0,0,0,136,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,140,141,141,57,58,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,140,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,140,141,141,57,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,142,143,144,145,146,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,147,0,0,148,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,53,54,56,56,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,150,151,151,57,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,153,154,0,0,137,138,0,58,59,0,0,0,0,0,153,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,75,3,4,5,155,156,8,157,158,0,11,12,0,0,75,15,0,0,0,0,0,0,0,0,0,159,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,40,160,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,161,44,44,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,124,72,0,0,40,160,0,9,10,0,0,0,0,0,124,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,68,68,0,69,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,162,0,0,163,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,165,116,166,167,8,9,10,0,0,168,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,121,121,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,19,74,74,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,79,80,80,22,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,169,170,171,172,22,23,24,0,0,173,0,0,0,26,0,0,0,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,175,175,0,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,75,0,176,0,177,177,22,23,24,0,0,0,0,0,75,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,178,93,0,0,0,0,0,0,0,0,0,0,0,0,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,75,0,0,0,175,179,0,23,24,0,0,0,0,0,75,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,180,180,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,82,83,84,85,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,83,83,85,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,181,181,85,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,182,181,181,85,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,183,184,185,186,187,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,86,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,76,189,0,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,190,80,80,22,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,190,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,178,93,0,0,76,189,0,23,24,0,0,0,0,0,178,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,191,170,192,193,22,23,24,0,0,194,0,0,0,26,0,0,0,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,175,175,0,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,29,95,31,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,37,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,100,101,101,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,195,196,197,198,32,33,34,0,0,199,0,0,0,36,0,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,201,201,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,96,0,202,0,203,203,32,33,34,0,0,0,0,0,96,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,204,114,0,0,0,0,0,0,0,0,0,0,0,0,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,96,0,0,0,201,205,0,33,34,0,0,0,0,0,96,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,206,206,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,103,104,105,106,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,104,104,106,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,207,207,106,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,208,207,207,106,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,209,210,211,212,213,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,107,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,97,215,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,216,101,101,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,204,114,0,0,97,215,0,33,34,0,0,0,0,0,204,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,217,196,218,219,32,33,34,0,0,220,0,0,0,36,0,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,201,201,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,221,116,222,222,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,223,0,0,0,40,224,0,9,10,0,0,0,0,0,223,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,225,44,44,8,9,0,0,0,119,0,0,0,0,0,0,0,0,0,0,0,0,0,225,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,115,116,117,222,8,9,10,0,0,119,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,115,116,222,222,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,226,72,0,0,40,224,0,9,10,0,0,0,0,0,226,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,39,0,0,0,121,121,0,9,10,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,44,44,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,227,0,228,229,0,9,10,0,0,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,39,0,122,0,121,121,0,9,10,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,231,231,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,130,131,132,133,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,131,131,133,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,233,233,133,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,234,233,233,133,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,235,236,237,238,239,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,54,56,56,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,240,241,242,243,57,58,59,0,0,244,0,0,0,61,0,0,0,0,0,0,0,0,0,245,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,246,246,0,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,136,0,247,0,248,248,57,58,59,0,0,0,0,0,136,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,249,154,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,136,0,0,0,246,250,0,58,59,0,0,0,0,0,136,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,251,251,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,143,144,145,146,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,144,144,146,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,252,252,146,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,253,252,252,146,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,254,255,256,257,258,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,147,0,0,0,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,137,260,0,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,261,141,141,57,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,249,154,0,0,137,260,0,58,59,0,0,0,0,0,249,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,262,241,263,264,57,58,59,0,0,265,0,0,0,61,0,0,0,0,0,0,0,0,0,245,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,246,246,0,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,43,266,266,8,157,24,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,267,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,75,0,176,43,268,268,269,157,24,0,0,0,0,0,75,0,0,0,0,0,0,0,0,0,0,267,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,270,0,0,271,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,273,274,0,0,40,41,0,9,10,0,0,0,0,0,273,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,40,0,123,123,8,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,121,275,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,162,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,221,116,222,222,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,225,44,44,8,9,0,0,0,168,0,0,0,0,0,0,0,0,0,0,0,0,0,225,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,165,116,166,222,8,9,10,0,0,168,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,165,116,222,222,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,277,170,278,278,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,279,0,0,0,76,280,0,23,24,0,0,0,0,0,279,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,281,80,80,22,23,0,0,0,173,0,0,0,0,0,0,0,0,0,0,0,0,0,281,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,169,170,171,278,22,23,24,0,0,173,0,0,0,26,0,0,0,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,169,170,278,278,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,282,93,0,0,76,280,0,23,24,0,0,0,0,0,282,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,75,0,0,0,175,175,0,23,24,0,0,0,0,0,75,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,80,80,22,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,283,0,284,285,0,23,24,0,0,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,75,0,176,0,175,175,0,23,24,0,0,0,0,0,75,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,287,287,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,184,185,186,187,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,185,185,187,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,289,289,187,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,290,289,289,187,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,291,292,293,294,295,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,76,0,177,177,22,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,175,296,0,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,277,170,278,278,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,281,80,80,22,23,0,0,0,194,0,0,0,0,0,0,0,0,0,0,0,0,0,281,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,191,170,192,278,22,23,24,0,0,194,0,0,0,26,0,0,0,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,191,170,278,278,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,297,196,298,298,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,299,0,0,0,97,300,0,33,34,0,0,0,0,0,299,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,301,101,101,32,33,0,0,0,199,0,0,0,0,0,0,0,0,0,0,0,0,0,301,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,195,196,197,298,32,33,34,0,0,199,0,0,0,36,0,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,195,196,298,298,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,302,114,0,0,97,300,0,33,34,0,0,0,0,0,302,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,96,0,0,0,201,201,0,33,34,0,0,0,0,0,96,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,101,101,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,303,0,304,305,0,33,34,0,0,306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,96,0,202,0,201,201,0,33,34,0,0,0,0,0,96,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,307,307,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,210,211,212,213,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,211,211,213,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,309,309,213,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,310,309,309,213,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,311,312,313,314,315,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,97,0,203,203,32,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,201,316,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,297,196,298,298,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,301,101,101,32,33,0,0,0,220,0,0,0,0,0,0,0,0,0,0,0,0,0,301,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,217,196,218,298,32,33,34,0,0,220,0,0,0,36,0,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,217,196,298,298,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,116,222,222,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,225,44,44,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,225,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,317,318,319,320,8,9,10,0,0,321,0,0,0,15,0,0,0,0,0,0,0,0,0,322,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,223,0,323,0,123,123,8,9,10,0,0,0,0,0,223,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,223,0,0,0,121,324,0,9,10,0,0,0,0,0,223,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,325,318,326,327,8,9,10,0,0,328,0,0,0,15,0,0,0,0,0,0,0,0,0,322,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,72,0,121,121,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,9,0,0,0,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,227,0,228,121,0,9,10,0,0,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,227,0,121,121,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,329,329,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,236,237,238,239,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,237,237,239,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,331,331,239,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,332,331,331,239,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,333,40,121,334,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,335,241,336,336,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,245,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,337,0,0,0,137,338,0,58,59,0,0,0,0,0,337,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,339,141,141,57,58,0,0,0,244,0,0,0,0,0,0,0,0,0,0,0,0,0,339,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,240,241,242,336,57,58,59,0,0,244,0,0,0,61,0,0,0,0,0,0,0,0,0,245,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,240,241,336,336,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,245,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,340,154,0,0,137,338,0,58,59,0,0,0,0,0,340,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,136,0,0,0,246,246,0,58,59,0,0,0,0,0,136,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,141,141,57,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,341,0,342,343,0,58,59,0,0,344,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,136,0,247,0,246,246,0,58,59,0,0,0,0,0,136,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,345,345,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,255,256,257,258,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,256,256,258,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,347,347,258,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,348,347,347,258,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,349,350,351,352,353,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,137,0,248,248,57,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,246,354,0,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,335,241,336,336,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,245,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,339,141,141,57,58,0,0,0,265,0,0,0,0,0,0,0,0,0,0,0,0,0,339,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,262,241,263,336,57,58,59,0,0,265,0,0,0,61,0,0,0,0,0,0,0,0,0,245,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,262,241,336,336,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,245,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,126,126,8,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,355,93,0,0,121,125,0,9,10,0,0,0,0,0,355,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,356,356,269,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,357,358,359,360,361,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,270,0,0,0,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,363,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,364,116,365,366,8,157,158,0,0,367,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,368,368,0,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,40,0,121,121,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,170,278,278,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,281,80,80,22,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,281,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,369,370,371,372,22,23,24,0,0,373,0,0,0,26,0,0,0,0,0,0,0,0,0,374,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,279,0,375,0,177,177,22,23,24,0,0,0,0,0,279,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,279,0,0,0,175,376,0,23,24,0,0,0,0,0,279,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,377,370,378,379,22,23,24,0,0,380,0,0,0,26,0,0,0,0,0,0,0,0,0,374,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,93,0,175,175,0,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,23,0,0,0,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,283,0,284,175,0,23,24,0,0,286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,283,0,175,175,0,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,381,381,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,382,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,292,293,294,295,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,293,293,295,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,383,383,295,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,384,383,383,295,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,385,76,175,386,0,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,76,0,175,175,0,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,196,298,298,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,301,101,101,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,301,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,387,388,389,390,32,33,34,0,0,391,0,0,0,36,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,299,0,393,0,203,203,32,33,34,0,0,0,0,0,299,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,299,0,0,0,201,394,0,33,34,0,0,0,0,0,299,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,395,388,396,397,32,33,34,0,0,398,0,0,0,36,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,114,0,201,201,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,33,0,0,0,306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,303,0,304,201,0,33,34,0,0,306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,303,0,201,201,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,399,399,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,312,313,314,315,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,313,313,315,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,401,401,315,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,402,401,401,315,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,403,97,201,404,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,97,0,201,201,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,405,318,406,406,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,322,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,407,0,0,0,40,408,0,9,10,0,0,0,0,0,407,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,409,44,44,8,9,0,0,0,321,0,0,0,0,0,0,0,0,0,0,0,0,0,409,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,317,318,319,406,8,9,10,0,0,321,0,0,0,15,0,0,0,0,0,0,0,0,0,322,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,317,318,406,406,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,322,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,410,72,0,0,40,408,0,9,10,0,0,0,0,0,410,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,223,0,0,0,121,121,0,9,10,0,0,0,0,0,223,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,223,0,323,0,121,121,0,9,10,0,0,0,0,0,223,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,405,318,406,406,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,322,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,409,44,44,8,9,0,0,0,328,0,0,0,0,0,0,0,0,0,0,0,0,0,409,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,325,318,326,406,8,9,10,0,0,328,0,0,0,15,0,0,0,0,0,0,0,0,0,322,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,325,318,406,406,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,322,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,411,411,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,412,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,40,121,334,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,413,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,241,336,336,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,245,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,339,141,141,57,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,339,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,414,415,416,417,57,58,59,0,0,418,0,0,0,61,0,0,0,0,0,0,0,0,0,419,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,337,0,420,0,248,248,57,58,59,0,0,0,0,0,337,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,337,0,0,0,246,421,0,58,59,0,0,0,0,0,337,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,422,415,423,424,57,58,59,0,0,425,0,0,0,61,0,0,0,0,0,0,0,0,0,419,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,154,0,246,246,0,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,58,0,0,0,344,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,341,0,342,246,0,58,59,0,0,344,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,341,0,246,246,0,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,426,426,258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,427,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,350,351,352,353,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,351,351,353,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,428,428,353,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,429,428,428,353,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,430,137,246,431,0,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,137,0,246,246,0,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,432,116,433,434,8,157,158,0,0,435,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,180,180,269,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,358,359,360,361,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,359,359,361,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,436,436,361,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,437,436,436,361,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,438,439,440,441,442,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,443,274,0,0,0,0,0,0,0,0,0,0,0,0,443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,444,116,445,445,8,157,158,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,225,44,44,8,157,0,0,0,367,0,0,0,0,0,0,0,0,0,0,0,0,0,225,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,364,116,365,445,8,157,158,0,0,367,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,364,116,445,445,8,157,158,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,446,370,447,447,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,374,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,448,0,0,0,76,449,0,23,24,0,0,0,0,0,448,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,450,80,80,22,23,0,0,0,373,0,0,0,0,0,0,0,0,0,0,0,0,0,450,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,369,370,371,447,22,23,24,0,0,373,0,0,0,26,0,0,0,0,0,0,0,0,0,374,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,369,370,447,447,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,374,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,451,93,0,0,76,449,0,23,24,0,0,0,0,0,451,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,279,0,0,0,175,175,0,23,24,0,0,0,0,0,279,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,279,0,375,0,175,175,0,23,24,0,0,0,0,0,279,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,446,370,447,447,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,374,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,450,80,80,22,23,0,0,0,380,0,0,0,0,0,0,0,0,0,0,0,0,0,450,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,377,370,378,447,22,23,24,0,0,380,0,0,0,26,0,0,0,0,0,0,0,0,0,374,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,377,370,447,447,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,374,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,452,452,295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,76,175,386,0,23,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,454,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,455,388,456,456,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,457,0,0,0,97,458,0,33,34,0,0,0,0,0,457,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,459,101,101,32,33,0,0,0,391,0,0,0,0,0,0,0,0,0,0,0,0,0,459,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,387,388,389,456,32,33,34,0,0,391,0,0,0,36,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,387,388,456,456,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,460,114,0,0,97,458,0,33,34,0,0,0,0,0,460,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,299,0,0,0,201,201,0,33,34,0,0,0,0,0,299,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,299,0,393,0,201,201,0,33,34,0,0,0,0,0,299,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,455,388,456,456,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,459,101,101,32,33,0,0,0,398,0,0,0,0,0,0,0,0,0,0,0,0,0,459,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,395,388,396,456,32,33,34,0,0,398,0,0,0,36,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,395,388,456,456,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,461,461,315,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,462,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,97,201,404,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,463,0,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,318,406,406,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,322,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,409,44,44,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,409,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,464,465,466,467,8,9,10,0,0,468,0,0,0,15,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,407,0,470,0,123,123,8,9,10,0,0,0,0,0,407,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,407,0,0,0,121,471,0,9,10,0,0,0,0,0,407,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,472,465,473,474,8,9,10,0,0,475,0,0,0,15,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,477,415,478,478,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,419,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,479,0,0,0,137,480,0,58,59,0,0,0,0,0,479,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,481,141,141,57,58,0,0,0,418,0,0,0,0,0,0,0,0,0,0,0,0,0,481,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,414,415,416,478,57,58,59,0,0,418,0,0,0,61,0,0,0,0,0,0,0,0,0,419,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,414,415,478,478,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,419,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,482,154,0,0,137,480,0,58,59,0,0,0,0,0,482,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,337,0,0,0,246,246,0,58,59,0,0,0,0,0,337,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,337,0,420,0,246,246,0,58,59,0,0,0,0,0,337,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,477,415,478,478,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,419,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,481,141,141,57,58,0,0,0,425,0,0,0,0,0,0,0,0,0,0,0,0,0,481,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,422,415,423,478,57,58,59,0,0,425,0,0,0,61,0,0,0,0,0,0,0,0,0,419,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,422,415,478,478,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,419,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,483,483,353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,484,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,137,246,431,0,58,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,485,0,0,0,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,444,116,445,445,8,157,158,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,225,44,44,8,157,0,0,0,435,0,0,0,0,0,0,0,0,0,0,0,0,0,225,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,432,116,433,445,8,157,158,0,0,435,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,432,116,445,445,8,157,158,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,486,486,361,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,487,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,439,440,441,442,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,440,440,442,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,488,488,442,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,489,488,488,442,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,490,491,492,493,494,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,495,0,496,497,0,157,158,0,0,498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,116,445,445,8,157,158,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,225,44,44,8,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,225,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,370,447,447,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,374,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,450,80,80,22,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,450,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,499,500,501,502,22,23,24,0,0,503,0,0,0,26,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,448,0,505,0,177,177,22,23,24,0,0,0,0,0,448,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,448,0,0,0,175,506,0,23,24,0,0,0,0,0,448,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,507,500,508,509,22,23,24,0,0,510,0,0,0,26,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,511,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,388,456,456,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,459,101,101,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,459,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,512,513,514,515,32,33,34,0,0,516,0,0,0,36,0,0,0,0,0,0,0,0,0,517,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,457,0,518,0,203,203,32,33,34,0,0,0,0,0,457,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,457,0,0,0,201,519,0,33,34,0,0,0,0,0,457,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,520,513,521,522,32,33,34,0,0,523,0,0,0,36,0,0,0,0,0,0,0,0,0,517,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,315,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,525,465,526,526,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,527,0,0,0,40,528,0,9,10,0,0,0,0,0,527,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,529,44,44,8,9,0,0,0,468,0,0,0,0,0,0,0,0,0,0,0,0,0,529,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,464,465,466,526,8,9,10,0,0,468,0,0,0,15,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,464,465,526,526,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,530,72,0,0,40,528,0,9,10,0,0,0,0,0,530,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,407,0,0,0,121,121,0,9,10,0,0,0,0,0,407,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,407,0,470,0,121,121,0,9,10,0,0,0,0,0,407,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,525,465,526,526,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,529,44,44,8,9,0,0,0,475,0,0,0,0,0,0,0,0,0,0,0,0,0,529,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,472,465,473,526,8,9,10,0,0,475,0,0,0,15,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,472,465,526,526,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,415,478,478,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,419,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,481,141,141,57,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,481,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,531,532,533,534,57,58,59,0,0,535,0,0,0,61,0,0,0,0,0,0,0,0,0,536,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,479,0,537,0,248,248,57,58,59,0,0,0,0,0,479,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,479,0,0,0,246,538,0,58,59,0,0,0,0,0,479,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,539,532,540,541,57,58,59,0,0,542,0,0,0,61,0,0,0,0,0,0,0,0,0,536,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,543,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,361,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,358,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,544,544,442,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,545,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,491,492,493,494,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,492,492,494,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,546,546,494,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,547,546,546,494,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,548,549,368,550,0,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,274,0,368,368,0,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,157,0,0,0,498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,495,0,496,368,0,157,158,0,0,498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,495,0,368,368,0,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,551,500,552,552,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,553,0,0,0,76,554,0,23,24,0,0,0,0,0,553,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,555,80,80,22,23,0,0,0,503,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,499,500,501,552,22,23,24,0,0,503,0,0,0,26,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,499,500,552,552,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,556,93,0,0,76,554,0,23,24,0,0,0,0,0,556,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,448,0,0,0,175,175,0,23,24,0,0,0,0,0,448,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,448,0,505,0,175,175,0,23,24,0,0,0,0,0,448,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,551,500,552,552,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,555,80,80,22,23,0,0,0,510,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,507,500,508,552,22,23,24,0,0,510,0,0,0,26,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,507,500,552,552,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,557,513,558,558,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,517,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,559,0,0,0,97,560,0,33,34,0,0,0,0,0,559,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,561,101,101,32,33,0,0,0,516,0,0,0,0,0,0,0,0,0,0,0,0,0,561,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,512,513,514,558,32,33,34,0,0,516,0,0,0,36,0,0,0,0,0,0,0,0,0,517,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,512,513,558,558,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,517,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,562,114,0,0,97,560,0,33,34,0,0,0,0,0,562,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,457,0,0,0,201,201,0,33,34,0,0,0,0,0,457,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,457,0,518,0,201,201,0,33,34,0,0,0,0,0,457,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,557,513,558,558,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,517,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,561,101,101,32,33,0,0,0,523,0,0,0,0,0,0,0,0,0,0,0,0,0,561,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,520,513,521,558,32,33,34,0,0,523,0,0,0,36,0,0,0,0,0,0,0,0,0,517,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,520,513,558,558,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,517,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,465,526,526,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,469,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,529,44,44,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,529,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,563,64,564,565,8,9,10,0,0,566,0,0,0,15,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,527,0,567,0,123,123,8,9,10,0,0,0,0,0,527,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,527,0,0,0,121,568,0,9,10,0,0,0,0,0,527,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,569,64,570,571,8,9,10,0,0,572,0,0,0,15,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,573,532,574,574,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,536,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,575,0,0,0,137,576,0,58,59,0,0,0,0,0,575,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,577,141,141,57,58,0,0,0,535,0,0,0,0,0,0,0,0,0,0,0,0,0,577,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,531,532,533,574,57,58,59,0,0,535,0,0,0,61,0,0,0,0,0,0,0,0,0,536,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,531,532,574,574,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,536,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,578,154,0,0,137,576,0,58,59,0,0,0,0,0,578,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,479,0,0,0,246,246,0,58,59,0,0,0,0,0,479,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,479,0,537,0,246,246,0,58,59,0,0,0,0,0,479,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,573,532,574,574,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,536,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,577,141,141,57,58,0,0,0,542,0,0,0,0,0,0,0,0,0,0,0,0,0,577,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,539,532,540,574,57,58,59,0,0,542,0,0,0,61,0,0,0,0,0,0,0,0,0,536,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,539,532,574,574,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,536,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,442,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,439,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,579,579,494,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,580,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,549,368,550,0,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,368,368,0,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,362,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,581,0,0,0,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,500,552,552,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,555,80,80,22,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,555,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,582,89,583,584,22,23,24,0,0,585,0,0,0,26,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,553,0,586,0,177,177,22,23,24,0,0,0,0,0,553,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,553,0,0,0,175,587,0,23,24,0,0,0,0,0,553,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,588,89,589,590,22,23,24,0,0,591,0,0,0,26,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,513,558,558,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,517,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,561,101,101,32,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,561,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,592,110,593,594,32,33,34,0,0,595,0,0,0,36,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,559,0,596,0,203,203,32,33,34,0,0,0,0,0,559,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,559,0,0,0,201,597,0,33,34,0,0,0,0,0,559,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,598,110,599,600,32,33,34,0,0,601,0,0,0,36,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,602,64,65,65,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,161,44,44,8,9,0,0,0,566,0,0,0,0,0,0,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,563,64,564,65,8,9,10,0,0,566,0,0,0,15,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,563,64,65,65,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,527,0,0,0,121,121,0,9,10,0,0,0,0,0,527,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,527,0,567,0,121,121,0,9,10,0,0,0,0,0,527,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,602,64,65,65,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,161,44,44,8,9,0,0,0,572,0,0,0,0,0,0,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,569,64,570,65,8,9,10,0,0,572,0,0,0,15,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,569,64,65,65,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,532,574,574,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,536,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,577,141,141,57,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,577,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,603,150,604,605,57,58,59,0,0,606,0,0,0,61,0,0,0,0,0,0,0,0,0,152,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,575,0,607,0,248,248,57,58,59,0,0,0,0,0,575,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,575,0,0,0,246,608,0,58,59,0,0,0,0,0,575,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,609,150,610,611,57,58,59,0,0,612,0,0,0,61,0,0,0,0,0,0,0,0,0,152,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,494,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,491,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,613,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,614,89,90,90,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,190,80,80,22,23,0,0,0,585,0,0,0,0,0,0,0,0,0,0,0,0,0,190,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,582,89,583,90,22,23,24,0,0,585,0,0,0,26,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,582,89,90,90,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,553,0,0,0,175,175,0,23,24,0,0,0,0,0,553,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,553,0,586,0,175,175,0,23,24,0,0,0,0,0,553,0,0,0,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,614,89,90,90,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,190,80,80,22,23,0,0,0,591,0,0,0,0,0,0,0,0,0,0,0,0,0,190,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,588,89,589,90,22,23,24,0,0,591,0,0,0,26,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,588,89,90,90,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,615,110,111,111,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,216,101,101,32,33,0,0,0,595,0,0,0,0,0,0,0,0,0,0,0,0,0,216,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,592,110,593,111,32,33,34,0,0,595,0,0,0,36,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,592,110,111,111,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,559,0,0,0,201,201,0,33,34,0,0,0,0,0,559,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,559,0,596,0,201,201,0,33,34,0,0,0,0,0,559,0,0,0,0,0,0,0,0,0,0,99,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,615,110,111,111,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,216,101,101,32,33,0,0,0,601,0,0,0,0,0,0,0,0,0,0,0,0,0,216,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,598,110,599,111,32,33,34,0,0,601,0,0,0,36,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,598,110,111,111,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,64,65,65,8,9,10,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,616,150,151,151,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,152,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,261,141,141,57,58,0,0,0,606,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,603,150,604,151,57,58,59,0,0,606,0,0,0,61,0,0,0,0,0,0,0,0,0,152,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,603,150,151,151,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,152,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,575,0,0,0,246,246,0,58,59,0,0,0,0,0,575,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,575,0,607,0,246,246,0,58,59,0,0,0,0,0,575,0,0,0,0,0,0,0,0,0,0,139,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,616,150,151,151,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,152,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,261,141,141,57,58,0,0,0,612,0,0,0,0,0,0,0,0,0,0,0,0,0,261,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,609,150,610,151,57,58,59,0,0,612,0,0,0,61,0,0,0,0,0,0,0,0,0,152,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,609,150,151,151,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,152,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,549,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,89,90,90,22,23,24,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,91,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,110,111,111,32,33,34,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,150,151,151,57,58,59,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,152,0,0,0,0,0,0,0,0,0 }
};
public static bool[] AcceptingStates => new bool[]
@@ -697,12 +697,12 @@ internal static partial class IndicShapingData
true,
true,
true,
+ false,
true,
true,
false,
true,
true,
- false,
true,
true,
true,
@@ -722,9 +722,9 @@ internal static partial class IndicShapingData
true,
true,
true,
+ false,
true,
true,
- false,
true,
true,
false,
@@ -743,9 +743,9 @@ internal static partial class IndicShapingData
true,
true,
true,
+ false,
true,
true,
- false,
true,
true,
true,
@@ -783,12 +783,11 @@ internal static partial class IndicShapingData
true,
true,
true,
+ false,
true,
true,
- false,
true,
true,
- false,
true,
true,
true,
@@ -799,6 +798,7 @@ internal static partial class IndicShapingData
true,
true,
true,
+ false,
true,
true,
true,
@@ -822,9 +822,9 @@ internal static partial class IndicShapingData
true,
true,
true,
- false,
true,
true,
+ false,
true,
true,
true,
@@ -848,9 +848,9 @@ internal static partial class IndicShapingData
true,
true,
true,
- false,
true,
true,
+ false,
true,
true,
true,
@@ -893,9 +893,9 @@ internal static partial class IndicShapingData
true,
true,
true,
- false,
true,
true,
+ false,
true,
true,
false,
@@ -1267,10 +1267,10 @@ internal static partial class IndicShapingData
new string[] { "standalone_cluster" },
new string[] { "broken_cluster" },
new string[] { "broken_cluster" },
- new string[] { "broken_cluster" },
new string[] { "consonant_syllable" },
new string[] { "broken_cluster" },
new string[] { "symbol_cluster" },
+ new string[] { "broken_cluster" },
new string[] { "consonant_syllable" },
new string[] { "consonant_syllable" },
Array.Empty(),
@@ -1316,8 +1316,6 @@ internal static partial class IndicShapingData
new string[] { "standalone_cluster" },
new string[] { "standalone_cluster" },
new string[] { "standalone_cluster" },
- new string[] { "broken_cluster" },
- new string[] { "broken_cluster" },
new string[] { "consonant_syllable","broken_cluster" },
new string[] { "broken_cluster" },
Array.Empty(),
@@ -1326,6 +1324,8 @@ internal static partial class IndicShapingData
Array.Empty(),
new string[] { "symbol_cluster" },
new string[] { "symbol_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
new string[] { "consonant_syllable" },
Array.Empty(),
new string[] { "consonant_syllable" },
@@ -1343,9 +1343,9 @@ internal static partial class IndicShapingData
new string[] { "consonant_syllable" },
new string[] { "consonant_syllable" },
new string[] { "consonant_syllable" },
+ Array.Empty(),
new string[] { "consonant_syllable" },
new string[] { "consonant_syllable" },
- Array.Empty(),
new string[] { "consonant_syllable" },
new string[] { "vowel_syllable" },
Array.Empty(),
@@ -1364,9 +1364,9 @@ internal static partial class IndicShapingData
new string[] { "vowel_syllable" },
new string[] { "vowel_syllable" },
new string[] { "vowel_syllable" },
+ Array.Empty(),
new string[] { "vowel_syllable" },
new string[] { "vowel_syllable" },
- Array.Empty(),
new string[] { "vowel_syllable" },
new string[] { "broken_cluster" },
new string[] { "broken_cluster" },
@@ -1404,14 +1404,10 @@ internal static partial class IndicShapingData
new string[] { "standalone_cluster" },
new string[] { "standalone_cluster" },
new string[] { "standalone_cluster" },
+ Array.Empty(),
new string[] { "standalone_cluster" },
new string[] { "standalone_cluster" },
- Array.Empty(),
new string[] { "standalone_cluster" },
- new string[] { "broken_cluster" },
- Array.Empty(),
- new string[] { "broken_cluster" },
- new string[] { "broken_cluster" },
new string[] { "consonant_syllable" },
new string[] { "consonant_syllable" },
new string[] { "consonant_syllable","broken_cluster" },
@@ -1422,6 +1418,10 @@ internal static partial class IndicShapingData
new string[] { "symbol_cluster" },
new string[] { "symbol_cluster" },
new string[] { "symbol_cluster" },
+ new string[] { "broken_cluster" },
+ Array.Empty(),
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
new string[] { "consonant_syllable" },
new string[] { "consonant_syllable" },
Array.Empty(),
@@ -1443,9 +1443,9 @@ internal static partial class IndicShapingData
new string[] { "consonant_syllable" },
new string[] { "consonant_syllable" },
new string[] { "consonant_syllable" },
- Array.Empty(),
new string[] { "consonant_syllable" },
new string[] { "consonant_syllable" },
+ Array.Empty(),
new string[] { "consonant_syllable" },
new string[] { "consonant_syllable" },
new string[] { "vowel_syllable" },
@@ -1469,9 +1469,9 @@ internal static partial class IndicShapingData
new string[] { "vowel_syllable" },
new string[] { "vowel_syllable" },
new string[] { "vowel_syllable" },
- Array.Empty(),
new string[] { "vowel_syllable" },
new string[] { "vowel_syllable" },
+ Array.Empty(),
new string[] { "vowel_syllable" },
new string[] { "vowel_syllable" },
new string[] { "broken_cluster" },
@@ -1514,9 +1514,9 @@ internal static partial class IndicShapingData
new string[] { "standalone_cluster" },
new string[] { "standalone_cluster" },
new string[] { "standalone_cluster" },
- Array.Empty(),
new string[] { "standalone_cluster" },
new string[] { "standalone_cluster" },
+ Array.Empty(),
new string[] { "standalone_cluster" },
new string[] { "standalone_cluster" },
Array.Empty(),
diff --git a/src/SixLabors.Fonts/Unicode/Resources/IndicShapingData.cs b/src/SixLabors.Fonts/Unicode/Resources/IndicShapingData.cs
index 1fb945390..5287b8b47 100644
--- a/src/SixLabors.Fonts/Unicode/Resources/IndicShapingData.cs
+++ b/src/SixLabors.Fonts/Unicode/Resources/IndicShapingData.cs
@@ -1,39 +1,154 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
+using System.Runtime.CompilerServices;
+
namespace SixLabors.Fonts.Unicode.Resources;
internal static partial class IndicShapingData
{
- public const Categories ConsonantFlags = Categories.C | Categories.Ra | Categories.CM | Categories.V | Categories.Placeholder | Categories.Dotted_Circle;
- public const Categories JoinerFlags = Categories.ZWJ | Categories.ZWNJ;
- public const Categories HalantOrCoengFlags = Categories.H | Categories.Coeng;
+ ///
+ /// Script shaping category values used for Indic, Khmer, and Myanmar text
+ /// classification. These values correspond to the category codes used by
+ /// HarfBuzz in its Indic-style shaping engines, including the extended
+ /// categories required for Myanmar.
+ ///
+ /// The values serve as the input alphabet for the script syllable machines
+ /// and determine script-specific parsing, reordering, and dotted circle insertion.
+ ///
+ /// Categories are sourced from the OpenType Script Development Specifications
+ /// and HarfBuzz's generated Indic tables:
+ ///
+ /// Indic specification:
+ /// https://learn.microsoft.com/en-us/typography/script-development/devanagari
+ ///
+ /// General Indic shaper category model and data:
+ /// https://github.com/harfbuzz/harfbuzz/blob/main/src/hb-ot-shaper-indic.cc
+ /// https://github.com/harfbuzz/harfbuzz/blob/main/src/hb-ot-shaper-indic-table.hh
+ ///
+ /// Khmer specification:
+ /// https://learn.microsoft.com/en-us/typography/script-development/khmer
+ ///
+ /// Myanmar specification:
+ /// https://learn.microsoft.com/en-us/typography/script-development/myanmar
+ ///
+ /// Myanmar machine exports:
+ /// https://github.com/harfbuzz/harfbuzz/blob/main/src/hb-ot-shaper-myanmar-machine.rl
+ ///
+ /// Notes:
+ /// * X is the default category and always has value 0.
+ /// * Coeng intentionally shares the same category value as H, matching
+ /// HarfBuzz behavior for Khmer.
+ /// * Some values are shared across scripts (for example VAbv, VBlw, VPre,
+ /// VPst) because the OpenType model for dependent vowels is the same.
+ /// * Myanmar-specific medial and tone categories begin at 32 and above,
+ /// matching HarfBuzz's numeric category assignments.
+ ///
+ public enum Categories : int
+ {
+ // Core Indic-style categories (shared across scripts where applicable)
+ X = 0, // Uncategorized / default
+
+ C = 1, // Consonant
+ V = 2, // Dependent vowel
+ N = 3, // Nukta
+ H = 4, // Halant (virama)
+
+ // Coeng = H, // Khmer Coeng, mapped to H in HarfBuzz
+ ZWNJ = 5, // Zero width non-joiner
+ ZWJ = 6, // Zero width joiner
+ M = 7, // Generic matra / dependent vowel
+ SM = 8, // Syllable modifier / visarga / tone marks
+ A = 9, // Vowel sign A (and related)
+
+ // VD = 9, // Vowel-dependent sign (shares code with A)
+ Placeholder = 10, // Placeholder (NBSP, etc.)
+ Dotted_Circle = 11, // Explicit dotted circle
+
+ RS = 12, // Register shifter (Khmer)
+ MPst = 13, // Post-base matra
+ Repha = 14, // Repha form
+ Ra = 15, // Consonant Ra
+ CM = 16, // Consonant medial
+ Symbol = 17, // Symbol / Avagraha-like mark
+ CS = 18, // Consonant-with-stacker / special consonant
+
+ SMPst = 57, // Post-base spacing mark (shared Indic / Myanmar)
+
+ // Shared positional vowel / matra categories (Indic / Khmer / Myanmar)
+ VAbv = 20, // Above-base vowel or matra
+ VBlw = 21, // Below-base vowel or matra
+ VPre = 22, // Pre-base vowel or matra
+ VPst = 23, // Post-base vowel or matra
+
+ // Khmer-specific categories
+ Robatic = 25, // Khmer Robatic sign
+ Xgroup = 26, // Khmer X-group matra sequence
+ Ygroup = 27, // Khmer Y-group matra sequence
+ Coeng = 28, // Remove once we no longer need it for Khmer
+
+ // Myanmar-specific categories
+ // IV = V, // Independent vowel (shares code 2 with V in HarfBuzz)
+ // DB = N, // Dot-below (shares code 3 with N)
+ // GB = Placeholder, // Generic base / placeholder (shares code 10)
+ As = 32, // Asat
+ MH = 35, // Medial Ha
+ MR = 36, // Medial Ra
+ MW = 37, // Medial Wa / Shan Wa
+ MY = 38, // Medial Ya / Mon Na / Mon Ma
+ PT = 39, // Pwo and related tone marks
+ VS = 40, // Variation selector
+ ML = 41 // Medial Mon La
+ }
+
+ // Categories used in the Myanmar shaping engine.
+ // Note:
+ // The OpenType Myanmar spec defines categories D, D0, and P.
+ // HarfBuzz collapses:
+ // D => GB
+ // D0 => D => GB
+ // P => GB
+ // We follow the same normalization, so D, D0 and P do not appear
+ // as distinct category flags.
+ // Only the symbols that appear in the Myanmar grammar.
+ // Values must match the Categories enum and the Ragel `export` codes.
+ public enum MyanmarCategories : int
+ {
+ C = Categories.C,
+ IV = Categories.V,
+ DB = Categories.N,
+ H = Categories.H,
+ ZWNJ = Categories.ZWNJ,
+ ZWJ = Categories.ZWJ,
+ SM = Categories.SM,
+ A = Categories.A,
+ GB = Categories.Placeholder,
+ Dotted_Circle = Categories.Dotted_Circle,
+ Ra = Categories.Ra,
+ CS = Categories.CS,
+ SMPst = Categories.SMPst,
+
+ VAbv = Categories.VAbv,
+ VBlw = Categories.VBlw,
+ VPre = Categories.VPre,
+ VPst = Categories.VPst,
+
+ As = Categories.As,
+ MH = Categories.MH,
+ MR = Categories.MR,
+ MW = Categories.MW,
+ MY = Categories.MY,
+ PT = Categories.PT,
+ VS = Categories.VS,
+ ML = Categories.ML,
+ }
- // Categories used in the OpenType spec:
- // https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx
- // https://learn.microsoft.com/en-us/typography/script-development/devanagari
[Flags]
- public enum Categories
+ public enum MyanmarSyllableType
{
- X = 1 << 0,
- C = 1 << 1,
- V = 1 << 2,
- N = 1 << 3,
- H = 1 << 4,
- ZWNJ = 1 << 5,
- ZWJ = 1 << 6,
- M = 1 << 7,
- SM = 1 << 8,
- VD = 1 << 9,
- A = 1 << 10,
- Placeholder = 1 << 11,
- Dotted_Circle = 1 << 12,
- RS = 1 << 13, // Register Shifter, used in Khmer OT spec.
- Coeng = 1 << 14, // Khmer-style Virama.
- Repha = 1 << 15, // Atomically-encoded logical or visual repha.
- Ra = 1 << 16,
- CM = 1 << 17, // Consonant-Medial.
- Symbol = 1 << 18 // Avagraha, etc that take marks (SM,A,VD).
+ Consonant_Syllable = 1 << 0,
+ Broken_Cluster = 1 << 1,
+ NonMyanmar_Cluster = 1 << 2
}
// Visual positions in a syllable from left to right.
@@ -235,6 +350,94 @@ public enum BlwfMode
{ 0x17C5, new int[] { 0x17C1, 0x17C5 } }
};
+ public static uint ConsonantFlags { get; } =
+ Flag(Categories.C) |
+ Flag(Categories.Ra) |
+ Flag(Categories.CM) |
+ Flag(Categories.V) |
+ Flag(Categories.Placeholder) |
+ Flag(Categories.Dotted_Circle);
+
+ // Note:
+ // We treat Vowels and placeholders as if they were consonants.This is safe because Vowels
+ // cannot happen in a consonant syllable.The plus side however is, we can call the
+ // consonant syllable logic from the vowel syllable function and get it all right!
+ // Keep in sync with the categories used in the Myanmar state machine generator.
+ public static uint MyanmarConsonantFlags { get; } =
+ Flag(MyanmarCategories.C) |
+ Flag(MyanmarCategories.CS) |
+ Flag(MyanmarCategories.Ra) |
+ Flag(MyanmarCategories.IV) |
+ Flag(MyanmarCategories.GB) |
+ Flag(MyanmarCategories.Dotted_Circle);
+
+ public static uint JoinerFlags { get; } =
+ Flag(Categories.ZWJ) |
+ Flag(Categories.ZWNJ);
+
+ public static uint HalantOrCoengFlags { get; } =
+ Flag(Categories.H) |
+ Flag(Categories.Coeng);
+
+ ///
+ /// Provides a flag value for the given category. Only valid for categories < 32.
+ ///
+ /// The category for which to generate a bit flag. If null, the default category is used.
+ /// A 32-bit unsigned integer with a single bit set corresponding to the specified category value.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static uint Flag(Categories? categories)
+ => FlagCoreChecked((int)(categories ?? default));
+
+ ///
+ /// Provides a flag value for the given category. Only valid for categories < 32.
+ ///
+ /// The category for which to generate a bit flag. If null, the default category is used.
+ /// A 32-bit unsigned integer with a single bit set corresponding to the specified category value.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static uint Flag(MyanmarCategories? categories)
+ => FlagCoreChecked((int)(categories ?? default));
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ private static uint FlagCoreChecked(int value)
+ {
+#if DEBUG
+ if ((uint)value >= 32u)
+ {
+ throw new ArgumentOutOfRangeException(
+ nameof(value),
+ "Flag() is only defined for enum values < 32.");
+ }
+#endif
+ return 1u << value;
+ }
+
+ ///
+ /// Returns a bit flag corresponding to the specified category, or zero if the category value is out of range.
+ ///
+ /// The category for which to generate a bit flag. If null, the default category is used.
+ ///
+ /// A 32-bit unsigned integer with a single bit set corresponding to the specified category value; returns 0 if the
+ /// category value is not between 0 and 31, inclusive.
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static uint FlagUnsafe(Categories? categories)
+ => FlagUnsafeCore((int)(categories ?? default));
+
+ ///
+ /// Returns a bit flag corresponding to the specified category, or zero if the category value is out of range.
+ ///
+ /// The category for which to generate a bit flag. If null, the default category is used.
+ ///
+ /// A 32-bit unsigned integer with a single bit set corresponding to the specified category value; returns 0 if the
+ /// category value is not between 0 and 31, inclusive.
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static uint FlagUnsafe(MyanmarCategories? categories)
+ => FlagUnsafeCore((int)(categories ?? default));
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ private static uint FlagUnsafeCore(int value) => value < 32 ? 1u << value : 0u;
+
internal struct ShapingConfiguration
{
public static ShapingConfiguration Default = new()
diff --git a/src/SixLabors.Fonts/Unicode/Resources/IndicShapingTrie.Generated.cs b/src/SixLabors.Fonts/Unicode/Resources/IndicShapingTrie.Generated.cs
index 4a60819e0..9ddf8ac41 100644
--- a/src/SixLabors.Fonts/Unicode/Resources/IndicShapingTrie.Generated.cs
+++ b/src/SixLabors.Fonts/Unicode/Resources/IndicShapingTrie.Generated.cs
@@ -10,23 +10,23 @@ internal static class IndicShapingTrie
{
public static ReadOnlySpan Data => new byte[]
{
- 0, 0, 17, 0, 0, 0, 0, 0, 64, 223, 0, 0, 35, 4, 0, 0, 43, 4, 0, 0, 51, 4, 0, 0, 59, 4, 0, 0, 83, 4, 0, 0, 91, 4, 0, 0, 96, 4, 0, 0, 104, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0,
+ 0, 0, 17, 0, 0, 0, 0, 0, 48, 225, 0, 0, 35, 4, 0, 0, 43, 4, 0, 0, 51, 4, 0, 0, 59, 4, 0, 0, 83, 4, 0, 0, 91, 4, 0, 0, 96, 4, 0, 0, 104, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0,
50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 102, 4, 0, 0, 110, 4, 0, 0, 118, 4, 0, 0, 126, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 127, 4, 0, 0, 135, 4, 0, 0, 140, 4, 0, 0, 148, 4, 0, 0, 154, 4, 0, 0, 162, 4, 0, 0, 168, 4, 0, 0,
176, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 50, 4, 0, 0, 58, 4, 0, 0, 123, 4, 0, 0, 131, 4, 0, 0, 184, 4, 0, 0, 192, 4, 0, 0, 188, 4, 0, 0, 196, 4, 0, 0, 204, 4, 0, 0, 212, 4, 0, 0, 35, 4, 0, 0, 220, 4, 0, 0, 228, 4, 0, 0, 236, 4, 0, 0, 241, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
249, 4, 0, 0, 255, 4, 0, 0, 7, 5, 0, 0, 15, 5, 0, 0, 23, 5, 0, 0, 29, 5, 0, 0, 37, 5, 0, 0, 45, 5, 0, 0, 53, 5, 0, 0, 59, 5, 0, 0, 67, 5, 0, 0, 75, 5, 0, 0, 83, 5, 0, 0, 89, 5, 0, 0, 97, 5, 0, 0, 105, 5, 0, 0, 113, 5, 0, 0, 119, 5, 0, 0, 127, 5, 0, 0, 135, 5, 0, 0, 143, 5, 0, 0, 151, 5, 0, 0, 159, 5, 0, 0, 166, 5, 0, 0, 174, 5, 0, 0,
- 180, 5, 0, 0, 188, 5, 0, 0, 196, 5, 0, 0, 204, 5, 0, 0, 210, 5, 0, 0, 218, 5, 0, 0, 226, 5, 0, 0, 174, 5, 0, 0, 234, 5, 0, 0, 242, 5, 0, 0, 250, 5, 0, 0, 2, 6, 0, 0, 9, 6, 0, 0, 17, 6, 0, 0, 25, 6, 0, 0, 33, 6, 0, 0, 38, 6, 0, 0, 46, 6, 0, 0, 67, 4, 0, 0, 54, 6, 0, 0, 61, 6, 0, 0, 69, 6, 0, 0, 67, 4, 0, 0, 77, 6, 0, 0, 85, 6, 0, 0,
- 93, 6, 0, 0, 98, 6, 0, 0, 105, 6, 0, 0, 112, 6, 0, 0, 120, 6, 0, 0, 67, 4, 0, 0, 128, 6, 0, 0, 136, 6, 0, 0, 144, 6, 0, 0, 152, 6, 0, 0, 160, 6, 0, 0, 35, 4, 0, 0, 168, 6, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 174, 6, 0, 0,
- 35, 4, 0, 0, 182, 6, 0, 0, 172, 6, 0, 0, 190, 6, 0, 0, 35, 4, 0, 0, 186, 6, 0, 0, 35, 4, 0, 0, 150, 4, 0, 0, 196, 6, 0, 0, 194, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 204, 6, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 196, 6, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 212, 6, 0, 0, 220, 6, 0, 0, 228, 6, 0, 0, 236, 6, 0, 0, 244, 6, 0, 0, 252, 6, 0, 0, 4, 7, 0, 0, 12, 7, 0, 0, 20, 7, 0, 0, 194, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 212, 6, 0, 0, 35, 4, 0, 0,
- 236, 4, 0, 0, 35, 4, 0, 0, 195, 4, 0, 0, 28, 7, 0, 0, 36, 7, 0, 0, 44, 7, 0, 0, 52, 7, 0, 0, 128, 6, 0, 0, 60, 7, 0, 0, 68, 7, 0, 0, 35, 4, 0, 0, 76, 7, 0, 0, 128, 6, 0, 0, 84, 7, 0, 0, 92, 7, 0, 0, 100, 7, 0, 0, 108, 7, 0, 0, 113, 7, 0, 0, 67, 4, 0, 0, 121, 7, 0, 0, 126, 7, 0, 0, 134, 7, 0, 0, 141, 7, 0, 0, 149, 7, 0, 0, 157, 7, 0, 0,
- 128, 6, 0, 0, 165, 7, 0, 0, 128, 6, 0, 0, 173, 7, 0, 0, 181, 7, 0, 0, 35, 4, 0, 0, 187, 7, 0, 0, 150, 4, 0, 0, 193, 7, 0, 0, 199, 7, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 207, 7, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 204, 6, 0, 0, 35, 4, 0, 0, 214, 7, 0, 0, 193, 4, 0, 0, 35, 4, 0, 0, 222, 7, 0, 0, 226, 7, 0, 0, 234, 7, 0, 0, 242, 7, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 249, 7, 0, 0, 1, 8, 0, 0, 35, 4, 0, 0, 8, 8, 0, 0, 12, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 20, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 27, 8, 0, 0, 26, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 180, 5, 0, 0, 188, 5, 0, 0, 196, 5, 0, 0, 204, 5, 0, 0, 210, 5, 0, 0, 218, 5, 0, 0, 226, 5, 0, 0, 234, 5, 0, 0, 240, 5, 0, 0, 248, 5, 0, 0, 0, 6, 0, 0, 8, 6, 0, 0, 15, 6, 0, 0, 23, 6, 0, 0, 31, 6, 0, 0, 39, 6, 0, 0, 44, 6, 0, 0, 52, 6, 0, 0, 67, 4, 0, 0, 60, 6, 0, 0, 67, 6, 0, 0, 75, 6, 0, 0, 67, 4, 0, 0, 83, 6, 0, 0, 91, 6, 0, 0,
+ 99, 6, 0, 0, 104, 6, 0, 0, 111, 6, 0, 0, 118, 6, 0, 0, 126, 6, 0, 0, 67, 4, 0, 0, 134, 6, 0, 0, 142, 6, 0, 0, 150, 6, 0, 0, 158, 6, 0, 0, 166, 6, 0, 0, 35, 4, 0, 0, 174, 6, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 180, 6, 0, 0,
+ 35, 4, 0, 0, 188, 6, 0, 0, 178, 6, 0, 0, 196, 6, 0, 0, 35, 4, 0, 0, 192, 6, 0, 0, 35, 4, 0, 0, 150, 4, 0, 0, 202, 6, 0, 0, 194, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 210, 6, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 202, 6, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 218, 6, 0, 0, 226, 6, 0, 0, 234, 6, 0, 0, 242, 6, 0, 0, 250, 6, 0, 0, 2, 7, 0, 0, 10, 7, 0, 0, 18, 7, 0, 0, 26, 7, 0, 0, 194, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 218, 6, 0, 0, 35, 4, 0, 0,
+ 236, 4, 0, 0, 35, 4, 0, 0, 195, 4, 0, 0, 34, 7, 0, 0, 42, 7, 0, 0, 50, 7, 0, 0, 58, 7, 0, 0, 66, 7, 0, 0, 71, 7, 0, 0, 79, 7, 0, 0, 35, 4, 0, 0, 87, 7, 0, 0, 66, 7, 0, 0, 95, 7, 0, 0, 103, 7, 0, 0, 111, 7, 0, 0, 119, 7, 0, 0, 124, 7, 0, 0, 67, 4, 0, 0, 132, 7, 0, 0, 137, 7, 0, 0, 145, 7, 0, 0, 152, 7, 0, 0, 160, 7, 0, 0, 168, 7, 0, 0,
+ 66, 7, 0, 0, 176, 7, 0, 0, 66, 7, 0, 0, 184, 7, 0, 0, 192, 7, 0, 0, 35, 4, 0, 0, 198, 7, 0, 0, 150, 4, 0, 0, 204, 7, 0, 0, 210, 7, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 218, 7, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 210, 6, 0, 0, 35, 4, 0, 0, 225, 7, 0, 0, 193, 4, 0, 0, 35, 4, 0, 0, 233, 7, 0, 0, 237, 7, 0, 0, 245, 7, 0, 0, 253, 7, 0, 0, 5, 8, 0, 0, 35, 4, 0, 0, 12, 8, 0, 0, 20, 8, 0, 0, 35, 4, 0, 0, 27, 8, 0, 0, 31, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 39, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 46, 8, 0, 0, 45, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 54, 8, 0, 0, 58, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 39, 8, 0, 0, 45, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 51, 8, 0, 0, 35, 4, 0, 0, 168, 6, 0, 0, 35, 4, 0, 0, 58, 8, 0, 0, 66, 8, 0, 0, 74, 8, 0, 0, 74, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 193, 4, 0, 0, 67, 4, 0, 0,
- 82, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 62, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 195, 4, 0, 0, 90, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 146, 4, 0, 0, 35, 4, 0, 0, 140, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 97, 8, 0, 0, 135, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 224, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 104, 8, 0, 0, 149, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 112, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 66, 8, 0, 0, 72, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 78, 8, 0, 0, 35, 4, 0, 0, 174, 6, 0, 0, 35, 4, 0, 0, 85, 8, 0, 0, 93, 8, 0, 0, 101, 8, 0, 0, 101, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 193, 4, 0, 0, 67, 4, 0, 0,
+ 109, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 62, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 195, 4, 0, 0, 117, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 146, 4, 0, 0, 35, 4, 0, 0, 140, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 124, 8, 0, 0, 135, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 224, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 131, 8, 0, 0, 149, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 139, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
@@ -34,8 +34,8 @@ internal static class IndicShapingTrie
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 113, 8, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 112, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 140, 8, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 139, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
@@ -61,11 +61,11 @@ internal static class IndicShapingTrie
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 113, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 200, 6, 0, 0, 35, 4, 0, 0, 121, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 64, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 61, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 127, 8, 0, 0, 134, 8, 0, 0, 142, 8, 0, 0, 150, 8, 0, 0, 158, 8, 0, 0,
- 166, 8, 0, 0, 174, 8, 0, 0, 179, 8, 0, 0, 186, 8, 0, 0, 194, 8, 0, 0, 202, 8, 0, 0, 210, 8, 0, 0, 217, 8, 0, 0, 196, 6, 0, 0, 225, 8, 0, 0, 229, 8, 0, 0, 237, 8, 0, 0, 245, 8, 0, 0, 253, 8, 0, 0, 3, 9, 0, 0, 11, 9, 0, 0, 19, 9, 0, 0, 128, 6, 0, 0, 27, 9, 0, 0, 35, 9, 0, 0, 43, 9, 0, 0, 51, 9, 0, 0, 78, 8, 0, 0, 35, 4, 0, 0, 20, 8, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 59, 9, 0, 0, 67, 9, 0, 0, 112, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 140, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 206, 6, 0, 0, 35, 4, 0, 0, 148, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 64, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 61, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 154, 8, 0, 0, 161, 8, 0, 0, 169, 8, 0, 0, 177, 8, 0, 0, 185, 8, 0, 0,
+ 193, 8, 0, 0, 201, 8, 0, 0, 206, 8, 0, 0, 213, 8, 0, 0, 221, 8, 0, 0, 229, 8, 0, 0, 237, 8, 0, 0, 244, 8, 0, 0, 202, 6, 0, 0, 252, 8, 0, 0, 0, 9, 0, 0, 8, 9, 0, 0, 16, 9, 0, 0, 24, 9, 0, 0, 30, 9, 0, 0, 38, 9, 0, 0, 46, 9, 0, 0, 66, 7, 0, 0, 54, 9, 0, 0, 62, 9, 0, 0, 70, 9, 0, 0, 78, 9, 0, 0, 105, 8, 0, 0, 35, 4, 0, 0, 39, 8, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 86, 9, 0, 0, 94, 9, 0, 0, 139, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
@@ -79,9 +79,9 @@ internal static class IndicShapingTrie
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 75, 9, 0, 0, 82, 9, 0, 0, 60, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 112, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 113, 8, 0, 0, 112, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 102, 9, 0, 0, 109, 9, 0, 0, 60, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 139, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 140, 8, 0, 0, 139, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
@@ -89,11 +89,11 @@ internal static class IndicShapingTrie
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 113, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 108, 7, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 194, 4, 0, 0, 67, 4, 0, 0, 89, 9, 0, 0, 97, 9, 0, 0, 105, 9, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 113, 9, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 40, 8, 0, 0, 35, 4, 0, 0, 119, 9, 0, 0, 79, 4, 0, 0, 194, 4, 0, 0, 35, 4, 0, 0, 127, 9, 0, 0, 134, 9, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 140, 9, 0, 0, 146, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 149, 4, 0, 0, 148, 9, 0, 0,
- 156, 9, 0, 0, 112, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 113, 8, 0, 0, 112, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 113, 8, 0, 0, 12, 17, 0, 0, 12, 17, 0, 0, 76, 17, 0, 0, 128, 17, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 152, 17, 0, 0, 216, 17, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 140, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 119, 7, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 194, 4, 0, 0, 67, 4, 0, 0, 116, 9, 0, 0, 124, 9, 0, 0, 132, 9, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 140, 9, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 67, 8, 0, 0, 35, 4, 0, 0, 146, 9, 0, 0, 79, 4, 0, 0, 154, 9, 0, 0, 35, 4, 0, 0, 162, 9, 0, 0, 169, 9, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 175, 9, 0, 0, 146, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 149, 4, 0, 0, 183, 9, 0, 0,
+ 191, 9, 0, 0, 139, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 140, 8, 0, 0, 139, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 140, 8, 0, 0, 12, 17, 0, 0, 12, 17, 0, 0, 76, 17, 0, 0, 128, 17, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 152, 17, 0, 0, 216, 17, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0,
200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 252, 17, 0, 0, 48, 18, 0, 0, 104, 18, 0, 0, 160, 18, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 200, 16, 0, 0, 236, 17, 0, 0, 224, 18, 0, 0, 240, 18, 0, 0, 48, 19, 0, 0, 64, 10, 0, 0, 128, 10, 0, 0, 192, 10, 0, 0, 0, 11, 0, 0, 64, 11, 0, 0, 107, 11, 0, 0, 171, 11, 0, 0, 161, 1, 0, 0, 205, 11, 0, 0, 161, 1, 0, 0,
161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 13, 12, 0, 0, 160, 1, 0, 0, 161, 1, 0, 0, 77, 12, 0, 0, 141, 12, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 182, 12, 0, 0, 246, 12, 0, 0, 22, 13, 0, 0, 161, 1, 0, 0, 60, 13, 0, 0, 124, 13, 0, 0, 187, 13, 0, 0, 251, 13, 0, 0, 59, 14, 0, 0, 123, 14, 0, 0, 187, 14, 0, 0, 160, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0,
161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 219, 14, 0, 0, 161, 1, 0, 0, 20, 15, 0, 0, 84, 15, 0, 0, 161, 1, 0, 0, 95, 15, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0,
@@ -115,82 +115,82 @@ internal static class IndicShapingTrie
161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 160, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0,
161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 75, 16, 0, 0, 160, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0,
161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0, 161, 1, 0, 0,
- 161, 1, 0, 0, 75, 16, 0, 0, 136, 4, 0, 0, 164, 9, 0, 0, 172, 9, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 107, 9, 0, 0, 180, 9, 0, 0, 183, 9, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 189, 9, 0, 0, 112, 8, 0, 0, 79, 4, 0, 0, 193, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 196, 6, 0, 0, 35, 4, 0, 0, 108, 8, 0, 0,
- 60, 4, 0, 0, 35, 4, 0, 0, 197, 9, 0, 0, 236, 4, 0, 0, 107, 9, 0, 0, 201, 9, 0, 0, 35, 4, 0, 0, 209, 9, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 193, 4, 0, 0, 217, 9, 0, 0, 221, 9, 0, 0, 60, 4, 0, 0, 35, 4, 0, 0, 168, 4, 0, 0, 35, 4, 0, 0, 228, 9, 0, 0, 232, 9, 0, 0, 237, 9, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 66, 8, 0, 0, 195, 4, 0, 0, 65, 4, 0, 0, 125, 4, 0, 0, 245, 9, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 253, 9, 0, 0, 0, 10, 0, 0, 45, 8, 0, 0, 35, 4, 0, 0, 149, 4, 0, 0, 8, 10, 0, 0, 67, 4, 0, 0, 16, 10, 0, 0, 23, 10, 0, 0,
- 31, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 39, 10, 0, 0, 40, 8, 0, 0, 35, 4, 0, 0, 47, 10, 0, 0, 54, 10, 0, 0, 62, 10, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 70, 10, 0, 0, 35, 4, 0, 0, 78, 10, 0, 0, 85, 10, 0, 0, 91, 10, 0, 0, 97, 10, 0, 0, 105, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 110, 8, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 112, 7, 0, 0, 35, 4, 0, 0, 113, 10, 0, 0, 35, 4, 0, 0, 120, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 149, 4, 0, 0, 35, 4, 0, 0, 128, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 168, 4, 0, 0, 194, 4, 0, 0,
- 79, 4, 0, 0, 136, 10, 0, 0, 79, 4, 0, 0, 64, 4, 0, 0, 66, 8, 0, 0, 144, 10, 0, 0, 149, 10, 0, 0, 156, 10, 0, 0, 161, 10, 0, 0, 169, 10, 0, 0, 173, 10, 0, 0, 181, 10, 0, 0, 187, 10, 0, 0, 195, 10, 0, 0, 202, 10, 0, 0, 210, 10, 0, 0, 216, 10, 0, 0, 224, 10, 0, 0, 229, 10, 0, 0, 237, 10, 0, 0, 245, 10, 0, 0, 253, 10, 0, 0, 2, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 10, 11, 0, 0, 18, 11, 0, 0, 25, 11, 0, 0, 33, 11, 0, 0, 41, 11, 0, 0, 47, 11, 0, 0, 55, 11, 0, 0, 63, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 175, 8, 0, 0, 71, 11, 0, 0, 79, 11, 0, 0, 87, 11, 0, 0, 95, 11, 0, 0, 99, 11, 0, 0, 107, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 175, 8, 0, 0,
- 115, 11, 0, 0, 123, 11, 0, 0, 67, 4, 0, 0, 175, 8, 0, 0, 131, 11, 0, 0, 139, 11, 0, 0, 109, 8, 0, 0, 176, 8, 0, 0, 147, 11, 0, 0, 155, 11, 0, 0, 67, 4, 0, 0, 163, 11, 0, 0, 171, 11, 0, 0, 179, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 176, 8, 0, 0, 187, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 86, 9, 0, 0, 195, 11, 0, 0, 201, 11, 0, 0, 209, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 217, 11, 0, 0, 221, 11, 0, 0, 229, 11, 0, 0, 237, 11, 0, 0, 241, 11, 0, 0, 249, 11, 0, 0, 128, 6, 0, 0, 0, 12, 0, 0, 8, 12, 0, 0, 35, 4, 0, 0, 212, 6, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 16, 12, 0, 0, 21, 12, 0, 0, 29, 12, 0, 0, 34, 12, 0, 0, 39, 12, 0, 0, 45, 12, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 53, 12, 0, 0, 57, 12, 0, 0, 65, 12, 0, 0, 73, 12, 0, 0, 79, 12, 0, 0, 155, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 87, 12, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 94, 12, 0, 0, 35, 4, 0, 0, 102, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 194, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 110, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 161, 1, 0, 0, 75, 16, 0, 0, 136, 4, 0, 0, 199, 9, 0, 0, 207, 9, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 134, 9, 0, 0, 215, 9, 0, 0, 218, 9, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 224, 9, 0, 0, 139, 8, 0, 0, 79, 4, 0, 0, 193, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 202, 6, 0, 0, 35, 4, 0, 0, 135, 8, 0, 0,
+ 60, 4, 0, 0, 35, 4, 0, 0, 232, 9, 0, 0, 236, 4, 0, 0, 134, 9, 0, 0, 236, 9, 0, 0, 35, 4, 0, 0, 244, 9, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 193, 4, 0, 0, 158, 9, 0, 0, 252, 9, 0, 0, 60, 4, 0, 0, 35, 4, 0, 0, 168, 4, 0, 0, 35, 4, 0, 0, 3, 10, 0, 0, 7, 10, 0, 0, 12, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 93, 8, 0, 0, 195, 4, 0, 0, 65, 4, 0, 0, 125, 4, 0, 0, 20, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 28, 10, 0, 0, 31, 10, 0, 0, 72, 8, 0, 0, 35, 4, 0, 0, 149, 4, 0, 0, 39, 10, 0, 0, 67, 4, 0, 0, 47, 10, 0, 0, 54, 10, 0, 0,
+ 62, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 70, 10, 0, 0, 67, 8, 0, 0, 35, 4, 0, 0, 78, 10, 0, 0, 85, 10, 0, 0, 93, 10, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 101, 10, 0, 0, 35, 4, 0, 0, 109, 10, 0, 0, 116, 10, 0, 0, 122, 10, 0, 0, 128, 10, 0, 0, 136, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 137, 8, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 123, 7, 0, 0, 35, 4, 0, 0, 144, 10, 0, 0, 35, 4, 0, 0, 151, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 149, 4, 0, 0, 35, 4, 0, 0, 159, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 168, 4, 0, 0, 194, 4, 0, 0,
+ 79, 4, 0, 0, 167, 10, 0, 0, 79, 4, 0, 0, 64, 4, 0, 0, 93, 8, 0, 0, 175, 10, 0, 0, 180, 10, 0, 0, 187, 10, 0, 0, 192, 10, 0, 0, 200, 10, 0, 0, 204, 10, 0, 0, 212, 10, 0, 0, 218, 10, 0, 0, 226, 10, 0, 0, 233, 10, 0, 0, 241, 10, 0, 0, 247, 10, 0, 0, 255, 10, 0, 0, 4, 11, 0, 0, 12, 11, 0, 0, 20, 11, 0, 0, 28, 11, 0, 0, 33, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 41, 11, 0, 0, 49, 11, 0, 0, 56, 11, 0, 0, 64, 11, 0, 0, 72, 11, 0, 0, 78, 11, 0, 0, 86, 11, 0, 0, 94, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 202, 8, 0, 0, 102, 11, 0, 0, 110, 11, 0, 0, 118, 11, 0, 0, 126, 11, 0, 0, 130, 11, 0, 0, 138, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 202, 8, 0, 0,
+ 146, 11, 0, 0, 154, 11, 0, 0, 67, 4, 0, 0, 202, 8, 0, 0, 162, 11, 0, 0, 170, 11, 0, 0, 136, 8, 0, 0, 203, 8, 0, 0, 178, 11, 0, 0, 186, 11, 0, 0, 67, 4, 0, 0, 194, 11, 0, 0, 202, 11, 0, 0, 210, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 203, 8, 0, 0, 218, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 113, 9, 0, 0, 226, 11, 0, 0, 232, 11, 0, 0, 240, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 248, 11, 0, 0, 252, 11, 0, 0, 4, 12, 0, 0, 12, 12, 0, 0, 16, 12, 0, 0, 24, 12, 0, 0, 66, 7, 0, 0, 31, 12, 0, 0, 39, 12, 0, 0, 35, 4, 0, 0, 218, 6, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 47, 12, 0, 0, 52, 12, 0, 0, 60, 12, 0, 0, 65, 12, 0, 0, 70, 12, 0, 0, 76, 12, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 84, 12, 0, 0, 88, 12, 0, 0, 96, 12, 0, 0, 104, 12, 0, 0, 110, 12, 0, 0, 186, 11, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 118, 12, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 125, 12, 0, 0, 35, 4, 0, 0, 133, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 194, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 141, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
66, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 79, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 112, 7, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 118, 12, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 79, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 123, 7, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 149, 12, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 27, 8, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 46, 8, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 212, 6, 0, 0, 149, 4, 0, 0, 126, 12, 0, 0, 35, 4, 0, 0, 149, 4, 0, 0, 217, 9, 0, 0, 131, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 135, 12, 0, 0, 50, 8, 0, 0, 63, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 107, 9, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 81, 9, 0, 0, 35, 4, 0, 0, 142, 12, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 149, 12, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 218, 6, 0, 0, 149, 4, 0, 0, 157, 12, 0, 0, 35, 4, 0, 0, 149, 4, 0, 0, 158, 9, 0, 0, 162, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 166, 12, 0, 0, 77, 8, 0, 0, 63, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 134, 9, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 108, 9, 0, 0, 35, 4, 0, 0, 173, 12, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 180, 12, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 154, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 185, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 195, 4, 0, 0, 67, 4, 0, 0, 162, 12, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 195, 4, 0, 0, 67, 4, 0, 0, 193, 12, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 166, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 174, 12, 0, 0, 178, 12, 0, 0, 185, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 60, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 197, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 205, 12, 0, 0, 209, 12, 0, 0, 216, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 60, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 191, 12, 0, 0, 196, 12, 0, 0, 66, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 222, 12, 0, 0, 227, 12, 0, 0, 66, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 108, 7, 0, 0, 121, 8, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 66, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 195, 4, 0, 0, 35, 4, 0, 0, 144, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 26, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 203, 12, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 62, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 66, 8, 0, 0, 212, 6, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 222, 7, 0, 0, 35, 4, 0, 0, 211, 12, 0, 0, 219, 12, 0, 0, 227, 12, 0, 0, 35, 4, 0, 0, 234, 12, 0, 0, 229, 12, 0, 0, 242, 12, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 210, 6, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 41, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 247, 12, 0, 0, 255, 12, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 119, 7, 0, 0, 148, 8, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 66, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 195, 4, 0, 0, 35, 4, 0, 0, 144, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 45, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 234, 12, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 62, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 93, 8, 0, 0, 218, 6, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 233, 7, 0, 0, 35, 4, 0, 0, 6, 8, 0, 0, 242, 12, 0, 0, 250, 12, 0, 0, 35, 4, 0, 0, 1, 13, 0, 0, 252, 12, 0, 0, 9, 13, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 216, 6, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 68, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 14, 13, 0, 0, 22, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 149, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 7, 13, 0, 0, 15, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 23, 13, 0, 0, 28, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 79, 4, 0, 0, 113, 7, 0, 0, 35, 4, 0, 0, 31, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 36, 13, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 44, 13, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 52, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 60, 13, 0, 0, 35, 4, 0, 0, 65, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 146, 4, 0, 0, 193, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 227, 12, 0, 0, 73, 13, 0, 0, 81, 13, 0, 0, 89, 13, 0, 0, 97, 13, 0, 0, 105, 13, 0, 0,
- 67, 4, 0, 0, 112, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 20, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 62, 4, 0, 0, 142, 4, 0, 0, 120, 13, 0, 0, 195, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 125, 13, 0, 0, 67, 4, 0, 0,
- 132, 13, 0, 0, 8, 12, 0, 0, 60, 4, 0, 0, 138, 13, 0, 0, 203, 12, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 146, 13, 0, 0, 154, 13, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 62, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 212, 6, 0, 0, 162, 13, 0, 0, 20, 8, 0, 0,
- 35, 4, 0, 0, 120, 10, 0, 0, 35, 4, 0, 0, 168, 4, 0, 0, 170, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 62, 4, 0, 0, 178, 13, 0, 0, 121, 8, 0, 0, 186, 13, 0, 0, 213, 9, 0, 0, 194, 13, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
- 35, 4, 0, 0, 35, 4, 0, 0, 127, 9, 0, 0, 35, 4, 0, 0, 26, 8, 0, 0, 200, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 30, 13, 0, 0, 38, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 46, 13, 0, 0, 51, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 79, 4, 0, 0, 124, 7, 0, 0, 35, 4, 0, 0, 62, 10, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 59, 13, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 67, 13, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 75, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 83, 13, 0, 0, 35, 4, 0, 0, 88, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 146, 4, 0, 0, 193, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 250, 12, 0, 0, 96, 13, 0, 0, 104, 13, 0, 0, 112, 13, 0, 0, 120, 13, 0, 0, 128, 13, 0, 0,
+ 67, 4, 0, 0, 135, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 39, 8, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 62, 4, 0, 0, 142, 4, 0, 0, 143, 13, 0, 0, 195, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 148, 13, 0, 0, 67, 4, 0, 0,
+ 155, 13, 0, 0, 39, 12, 0, 0, 60, 4, 0, 0, 161, 13, 0, 0, 234, 12, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 169, 13, 0, 0, 177, 13, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 62, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 218, 6, 0, 0, 185, 13, 0, 0, 39, 8, 0, 0,
+ 35, 4, 0, 0, 151, 10, 0, 0, 35, 4, 0, 0, 168, 4, 0, 0, 193, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 62, 4, 0, 0, 201, 13, 0, 0, 148, 8, 0, 0, 209, 13, 0, 0, 217, 13, 0, 0, 225, 13, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0,
+ 35, 4, 0, 0, 35, 4, 0, 0, 162, 9, 0, 0, 35, 4, 0, 0, 45, 8, 0, 0, 231, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 113, 8, 0, 0, 67, 4, 0, 0, 112, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 140, 8, 0, 0, 67, 4, 0, 0, 139, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 207, 13, 0, 0, 112, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 214, 13, 0, 0, 112, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 238, 13, 0, 0, 139, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 245, 13, 0, 0, 139, 8, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 221, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 112, 8, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 252, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 139, 8, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 193, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 227, 13, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 2, 14, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 235, 13, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 63, 4, 0, 0, 67, 4, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 10, 14, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 35, 4, 0, 0, 63, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0,
- 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 214, 13, 0, 0, 34, 4, 1, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 67, 4, 0, 0, 245, 13, 0, 0, 34, 4, 1, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 7, 0, 0, 15, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
@@ -215,373 +215,378 @@ internal static class IndicShapingTrie
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0,
4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 8, 3, 0, 0, 14, 18, 0, 0, 9, 7, 0, 0,
- 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 8, 4, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 11, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 15, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 8, 3, 0, 0, 14, 17, 0, 0, 9, 7, 0, 0,
+ 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 8, 4, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 10, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 14, 18, 0, 0, 12, 7, 0, 0, 2, 7, 0, 0, 12, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 15, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 14, 17, 0, 0, 12, 7, 0, 0, 2, 7, 0, 0, 12, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 8, 4, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 16, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 8, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 15, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 16, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 2, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 4, 17, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 15, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 2, 7, 0, 0, 11, 13, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 4, 16, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 14, 18, 0, 0, 12, 7, 0, 0, 2, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 8, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0,
+ 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 15, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 14, 17, 0, 0, 12, 7, 0, 0, 2, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 8, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 14, 9, 0, 0, 6, 3, 0, 0, 14, 9, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0,
0, 0, 0, 0, 7, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 14, 18, 0, 0, 12, 7, 0, 0, 5, 7, 0, 0, 12, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 0, 0, 5, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 15, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 14, 17, 0, 0, 12, 7, 0, 0, 5, 7, 0, 0, 12, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, 5, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 15, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 9, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0,
4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 14, 18, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 15, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 14, 17, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0,
7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 14, 18, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 15, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 14, 17, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
0, 0, 0, 0, 7, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 7, 7, 0, 0, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 15, 15, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 16, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 18, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0,
- 0, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 6, 4, 0, 0, 6, 15, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 12, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
- 12, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0,
- 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 0, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 6, 3, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 11, 0, 0, 0, 3, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0, 14, 18, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 0, 0, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0,
- 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 8, 3, 0, 0, 14, 8, 0, 0, 15, 14, 0, 0, 9, 7, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 1, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 17, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0,
- 8, 3, 0, 0, 4, 1, 0, 0, 11, 3, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 4, 1, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 7, 7, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 15, 14, 0, 0, 15, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 10, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 15, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 17, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0,
+ 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 6, 4, 0, 0, 6, 14, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 12, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 12, 7, 0, 0,
+ 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0,
+ 2, 7, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 0, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 6, 3, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 11, 0, 0, 0, 3, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0, 14, 17, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0,
+ 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 15, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 15, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 11, 23, 0, 0, 11, 23, 0, 0, 6, 20, 0, 0, 6, 20, 0, 0, 8, 21, 0, 0, 8, 21, 0, 0, 3, 22, 0, 0, 14, 9, 0, 0, 6, 20, 0, 0, 6, 20, 0, 0, 6, 20, 0, 0, 14, 9, 0, 0, 8, 3, 0, 0, 14, 8, 0, 0, 15, 28, 0, 0, 6, 32, 0, 0, 11, 38, 0, 0, 15, 36, 0, 0, 8, 37, 0, 0, 8, 35, 0, 0, 4, 1, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 11, 23, 0, 0, 11, 23, 0, 0, 8, 21, 0, 0, 8, 21, 0, 0, 4, 15, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 8, 38, 0, 0, 8, 38, 0, 0, 8, 41, 0, 0, 4, 1, 0, 0, 11, 23, 0, 0, 11, 39, 0, 0, 11, 39, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 11, 23, 0, 0, 11, 23, 0, 0, 11, 39, 0, 0, 11, 39, 0, 0, 11, 39, 0, 0, 11, 39, 0, 0, 11, 39, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 6, 20, 0, 0, 6, 20, 0, 0, 6, 20, 0, 0, 6, 20, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 8, 37, 0, 0, 11, 23, 0, 0, 3, 22, 0, 0, 6, 20, 0, 0, 6, 20, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0,
+ 4, 1, 0, 0, 14, 8, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 6, 20, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 15, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 6, 3, 0, 0,
+ 14, 8, 0, 0, 12, 7, 0, 0, 6, 12, 0, 0, 6, 12, 0, 0, 12, 7, 0, 0, 6, 3, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 15, 28, 0, 0, 12, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 17, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0,
+ 4, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 14, 8, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
+ 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0,
+ 4, 16, 0, 0, 4, 16, 0, 0, 6, 0, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 15, 28, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0,
+ 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0,
+ 14, 8, 0, 0, 14, 8, 0, 0, 4, 16, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 6, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0,
+ 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 11, 4, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 4, 16, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0,
+ 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 28, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 14, 17, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 6, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0,
+ 4, 16, 0, 0, 4, 16, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 15, 0, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 17, 0, 0, 14, 17, 0, 0, 14, 17, 0, 0, 14, 17, 0, 0, 14, 9, 0, 0,
+ 14, 17, 0, 0, 14, 17, 0, 0, 14, 17, 0, 0, 14, 17, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 14, 9, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 5, 0, 0, 15, 6, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 7, 0, 0, 15, 7, 0, 0, 15, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0,
- 6, 3, 0, 0, 14, 8, 0, 0, 12, 7, 0, 0, 6, 13, 0, 0, 6, 13, 0, 0, 12, 7, 0, 0, 6, 3, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 12, 7, 0, 0, 15, 14, 0, 0, 12, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 18, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 17, 0, 0,
- 4, 17, 0, 0, 4, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 14, 8, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0,
- 4, 17, 0, 0, 11, 3, 0, 0, 11, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 4, 2, 0, 0, 6, 4, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 14, 8, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 16, 0, 0,
+ 4, 16, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 1, 0, 0, 14, 8, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0,
+ 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
+ 9, 7, 0, 0, 8, 4, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 17, 0, 0, 14, 17, 0, 0, 14, 17, 0, 0,
+ 14, 17, 0, 0, 14, 17, 0, 0, 14, 17, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 8, 3, 0, 0, 8, 3, 0, 0, 8, 3, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 16, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 6, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0,
+ 4, 16, 0, 0, 11, 4, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 6, 20, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 6, 0, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 0, 0, 0, 0, 15, 14, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 6, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 17, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 6, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 11, 4, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0,
- 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 4, 17, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 14, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 14, 18, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 6, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 15, 0, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0,
- 14, 10, 0, 0, 14, 18, 0, 0, 14, 18, 0, 0, 14, 18, 0, 0, 14, 18, 0, 0, 14, 10, 0, 0, 14, 18, 0, 0, 14, 18, 0, 0, 14, 18, 0, 0, 14, 18, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 14, 10, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 5, 0, 0, 15, 6, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 7, 0, 0, 15, 7, 0, 0, 15, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0,
+ 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 11, 39, 0, 0, 6, 3, 0, 0, 11, 3, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 6, 3, 0, 0, 15, 0, 0, 0, 6, 3, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 8, 0, 0, 15, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
+ 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 11, 3, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 12, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 6, 4, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 14, 8, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 17, 0, 0, 4, 1, 0, 0, 14, 8, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 17, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 8, 4, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0,
- 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 18, 0, 0, 14, 18, 0, 0, 14, 18, 0, 0, 14, 18, 0, 0, 14, 18, 0, 0, 14, 18, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 8, 3, 0, 0, 8, 3, 0, 0, 8, 3, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 17, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 6, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 11, 4, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0,
- 4, 17, 0, 0, 4, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 11, 3, 0, 0, 6, 3, 0, 0, 11, 3, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0,
- 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 6, 3, 0, 0, 15, 0, 0, 0, 6, 3, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 8, 0, 0, 15, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 11, 3, 0, 0,
- 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0, 15, 40, 0, 0,
+ 15, 40, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 5, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, 8, 3, 0, 0, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 14, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 15, 15, 0, 0, 15, 15, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 6, 4, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 9, 7, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 8, 4, 0, 0, 8, 3, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0,
- 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 14, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 8, 3, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 11, 4, 0, 0, 14, 18, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 9, 7, 0, 0, 8, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 2, 7, 0, 0, 14, 8, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 11, 4, 0, 0, 6, 3, 0, 0, 14, 8, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 10, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0,
- 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 8, 3, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 8, 3, 0, 0, 14, 18, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 11, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 14, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 8, 4, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 3, 0, 0, 14, 18, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 15, 15, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 5, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, 8, 3, 0, 0, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 28, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 15, 14, 0, 0, 15, 14, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 8, 3, 0, 0, 14, 18, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 8, 3, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 9, 7, 0, 0, 11, 4, 0, 0, 8, 3, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0,
- 4, 17, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 8, 3, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
- 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0,
- 9, 7, 0, 0, 15, 14, 0, 0, 6, 0, 0, 0, 4, 17, 0, 0, 6, 15, 0, 0, 4, 17, 0, 0, 8, 3, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 14, 18, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 6, 0, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 11, 0, 0, 15, 0, 0, 0, 15, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0,
- 6, 0, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 15, 14, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 18, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0,
- 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 14, 18, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0,
- 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 0, 0, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 4, 17, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0,
- 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 14, 0, 0, 11, 15, 0, 0, 4, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0, 4, 11, 0, 0,
- 4, 11, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
- 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 15, 14, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
- 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 11, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 6, 4, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 9, 7, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 8, 4, 0, 0, 8, 3, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0,
+ 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 28, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 8, 3, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 11, 4, 0, 0, 14, 17, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0,
+ 8, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 2, 7, 0, 0, 14, 8, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 11, 4, 0, 0, 6, 3, 0, 0, 14, 8, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 9, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0,
+ 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 8, 3, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 8, 3, 0, 0, 8, 3, 0, 0, 14, 17, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 11, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 9, 0, 0,
+ 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 14, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
+ 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 8, 4, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 3, 0, 0, 14, 17, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 15, 14, 0, 0, 15, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 8, 3, 0, 0, 14, 17, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 8, 3, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
+ 9, 7, 0, 0, 11, 4, 0, 0, 8, 3, 0, 0, 4, 1, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0,
+ 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 8, 3, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0,
+ 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 9, 7, 0, 0,
+ 15, 28, 0, 0, 6, 0, 0, 0, 4, 16, 0, 0, 6, 14, 0, 0, 4, 16, 0, 0, 8, 3, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 14, 17, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0,
+ 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 6, 0, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 10, 0, 0, 15, 0, 0, 0, 15, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0,
+ 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 15, 28, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 14, 17, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0,
+ 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 8, 4, 0, 0, 14, 17, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0,
+ 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 4, 16, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0,
+ 14, 8, 0, 0, 14, 8, 0, 0, 8, 3, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 15, 28, 0, 0, 11, 14, 0, 0, 4, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0, 4, 10, 0, 0,
+ 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 4, 2, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0,
+ 9, 7, 0, 0, 9, 7, 0, 0, 14, 8, 0, 0, 14, 8, 0, 0, 15, 28, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0,
+ 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 1, 0, 0, 4, 10, 0, 0, 9, 7, 0, 0, 9, 7, 0, 0, 2, 7, 0, 0, 9, 7, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
}
}
diff --git a/src/SixLabors.Fonts/Unicode/Resources/MyanmarShapingData.Generated.cs b/src/SixLabors.Fonts/Unicode/Resources/MyanmarShapingData.Generated.cs
new file mode 100644
index 000000000..7fb7a1cd6
--- /dev/null
+++ b/src/SixLabors.Fonts/Unicode/Resources/MyanmarShapingData.Generated.cs
@@ -0,0 +1,219 @@
+// Copyright (c) Six Labors.
+// Licensed under the Apache License, Version 2.0.
+
+//
+using System;
+using System.Collections.Generic;
+
+namespace SixLabors.Fonts.Unicode.Resources
+{
+ internal static partial class MyanmarShapingData
+ {
+ public static int[][] StateTable => new int[65][]
+ {
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 2,2,3,4,5,5,6,7,2,2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 },
+ new int[] { 0,0,23,24,25,25,26,27,0,0,0,0,28,29,30,31,32,33,34,35,36,37,38,39,26 },
+ new int[] { 0,0,0,0,40,40,6,0,0,0,0,0,0,0,0,13,41,0,0,0,0,19,0,0,6 },
+ new int[] { 42,42,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,40,40,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,0,0,0,13,0,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,23,24,25,25,26,27,0,0,0,0,28,29,30,31,43,33,34,35,36,37,38,39,26 },
+ new int[] { 2,2,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,10,11,0,13,0,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,0,11,0,13,0,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,10,11,12,13,0,0,0,0,0,19,44,0,6 },
+ new int[] { 0,0,45,0,40,40,6,46,0,0,0,0,47,0,0,13,48,49,0,0,0,19,0,48,6 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,10,11,12,13,14,15,16,17,18,19,0,21,6 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,10,11,12,13,44,0,0,0,0,19,0,21,6 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,10,11,12,13,0,15,0,17,0,19,0,21,6 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,10,11,12,13,44,50,0,0,0,19,0,21,6 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,10,11,12,13,51,15,16,17,0,19,0,21,6 },
+ new int[] { 0,0,52,0,40,40,6,19,0,0,0,0,0,0,0,0,6,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,3,4,40,40,6,7,0,0,0,0,10,11,12,13,14,15,16,17,18,19,0,21,6 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,10,11,12,13,44,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,0,0,40,40,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,0,0,25,25,26,0,0,0,0,0,0,0,0,31,53,0,0,0,0,37,0,0,26 },
+ new int[] { 54,54,0,0,0,0,0,0,0,0,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,25,25,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,0,0,0,31,0,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,28,29,0,31,0,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,0,29,0,31,0,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,28,29,30,31,0,0,0,0,0,37,55,0,26 },
+ new int[] { 0,0,56,0,25,25,26,57,0,0,0,0,58,0,0,31,59,60,0,0,0,37,0,59,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,28,29,30,31,32,33,34,35,36,37,0,39,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,28,29,30,31,55,0,0,0,0,37,0,39,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,28,29,30,31,0,33,0,35,0,37,0,39,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,28,29,30,31,55,61,0,0,0,37,0,39,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,28,29,30,31,62,33,34,35,0,37,0,39,26 },
+ new int[] { 0,0,63,0,25,25,26,37,0,0,0,0,0,0,0,0,26,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,23,24,25,25,26,27,0,0,0,0,28,29,30,31,32,33,34,35,36,37,0,39,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,28,29,30,31,55,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,40,40,6,0,0,0,0,0,0,0,0,13,0,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,3,4,40,40,6,7,0,0,0,0,10,11,12,13,14,15,16,17,18,19,20,21,6 },
+ new int[] { 0,0,23,64,25,25,26,27,0,0,0,0,28,29,30,31,32,33,34,35,36,37,0,39,26 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,10,11,12,13,0,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,0,0,40,40,6,0,0,0,0,0,0,0,0,13,41,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,45,0,40,40,6,46,0,0,0,0,0,0,0,13,0,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,45,0,40,40,6,46,0,0,0,0,47,0,0,13,0,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,45,0,40,40,6,46,0,0,0,0,47,0,0,13,48,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,45,0,40,40,6,46,0,0,0,0,47,0,0,13,48,0,0,0,0,19,0,48,6 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,10,11,12,13,44,0,0,0,0,19,0,21,6 },
+ new int[] { 0,0,3,0,40,40,6,7,0,0,0,0,10,11,12,13,0,15,16,17,0,19,0,21,6 },
+ new int[] { 0,0,0,0,40,40,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,19,0,0,6 },
+ new int[] { 0,0,0,0,25,25,26,0,0,0,0,0,0,0,0,31,0,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,23,24,25,25,26,27,0,0,0,0,28,29,30,31,32,33,34,35,36,37,38,39,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,28,29,30,31,0,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,0,0,25,25,26,0,0,0,0,0,0,0,0,31,53,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,56,0,25,25,26,57,0,0,0,0,0,0,0,31,0,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,56,0,25,25,26,57,0,0,0,0,58,0,0,31,0,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,56,0,25,25,26,57,0,0,0,0,58,0,0,31,59,0,0,0,0,37,0,0,26 },
+ new int[] { 0,0,56,0,25,25,26,57,0,0,0,0,58,0,0,31,59,0,0,0,0,37,0,59,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,28,29,30,31,55,0,0,0,0,37,0,39,26 },
+ new int[] { 0,0,23,0,25,25,26,27,0,0,0,0,28,29,30,31,0,33,34,35,0,37,0,39,26 },
+ new int[] { 0,0,0,0,25,25,26,0,0,0,0,0,0,0,0,0,26,0,0,0,0,37,0,0,26 },
+ new int[] { 2,2,3,4,40,40,6,7,2,2,2,0,10,11,12,13,14,15,16,17,18,19,20,21,6 }
+ };
+
+ public static bool[] AcceptingStates => new bool[]
+ {
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ false,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true,
+ true
+ };
+
+ public static string[][] Tags => new string[65][]
+ {
+ Array.Empty(),
+ new string[] { "broken_cluster" },
+ new string[] { "consonant_syllable" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "joiner_or_spacing_mark","broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "consonant_syllable" },
+ Array.Empty(),
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "joiner_or_spacing_mark","broken_cluster" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "consonant_syllable" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "broken_cluster" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "consonant_syllable" },
+ new string[] { "broken_cluster" }
+ };
+ }
+}
diff --git a/src/SixLabors.Fonts/Unicode/Resources/UniversalShapingData.Generated.cs b/src/SixLabors.Fonts/Unicode/Resources/UniversalShapingData.Generated.cs
index 8620af5b7..6168c9281 100644
--- a/src/SixLabors.Fonts/Unicode/Resources/UniversalShapingData.Generated.cs
+++ b/src/SixLabors.Fonts/Unicode/Resources/UniversalShapingData.Generated.cs
@@ -32,6 +32,7 @@ internal static class UniversalShapingData
"MBlw",
"CS",
"R",
+ "HVM",
"FMBlw",
"SUB",
"MPst",
@@ -98,62 +99,62 @@ internal static class UniversalShapingData
public static int[][] StateTable => new int[56][]
{
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 2,2,3,4,4,0,0,5,6,7,8,9,10,11,12,13,0,14,15,0,16,0,17,10,18,19,20,21,22,0,0,23,0,0,2,0,24,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,27,0,0,0,0,26,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,31,32,33,34,35,36,37,38,39,40,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,39,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,7,8,0,0,11,0,13,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,0,8,0,0,0,0,13,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,7,8,9,10,11,12,13,0,0,15,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,7,8,0,10,11,0,13,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,0,8,0,0,11,0,13,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,7,8,9,10,11,12,13,0,14,15,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,7,8,0,10,11,0,13,0,0,0,0,0,0,0,10,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,4,4,0,0,5,6,7,8,9,10,11,12,13,0,14,15,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,7,8,49,10,11,12,13,0,49,15,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,50,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,7,8,0,10,11,0,13,0,0,15,0,0,0,0,10,0,19,20,21,22,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,7,8,0,10,11,0,13,0,0,15,0,0,0,0,10,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,0,52 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,27,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,0,0,0,0,0,0,37,38,0,0,0,0,41,0,0,0,44,45,46,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,0,30,0,0,0,0,0,0,0,38,0,0,0,0,41,0,0,0,44,45,46,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,31,32,0,0,35,0,37,38,0,0,0,0,41,0,0,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,0,32,0,0,0,0,37,38,0,0,0,0,41,0,0,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,31,32,33,34,35,36,37,38,0,40,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,31,32,0,34,35,0,37,38,0,0,0,0,41,0,0,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,0,32,0,0,35,0,37,38,0,0,0,0,41,0,0,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,0,30,0,0,0,0,0,0,37,38,0,0,0,0,41,0,0,0,44,45,46,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,31,32,33,34,35,36,37,38,39,40,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,31,32,0,34,35,0,37,38,0,0,0,0,41,0,34,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,31,32,53,34,35,36,37,38,53,40,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,54,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,31,32,0,34,35,0,37,38,0,40,0,0,41,0,34,0,44,45,46,47,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,41,0,0,0,44,45,46,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,41,0,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,41,0,0,0,0,45,46,0,0,0,0,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,31,32,0,34,35,0,37,38,0,40,0,0,41,0,34,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,0,0,0,0,0,0,37,38,0,0,0,0,41,0,0,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,7,8,49,10,11,12,13,0,0,15,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,5,6,7,8,49,10,11,12,13,0,49,15,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,31,32,53,34,35,36,37,38,0,40,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,28,0,29,30,31,32,53,34,35,36,37,38,53,40,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,0,0,0 },
- new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,0,52 }
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 2,2,3,4,4,0,0,5,6,7,8,9,10,11,12,13,0,14,15,0,16,0,0,17,10,18,19,20,21,22,0,0,23,0,0,2,0,24,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,27,0,0,0,0,26,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,31,32,33,34,35,36,37,38,39,40,0,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,39,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,7,8,0,0,11,0,13,0,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,0,8,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,7,8,9,10,11,12,13,0,0,15,0,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,7,8,0,10,11,0,13,0,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,0,8,0,0,11,0,13,0,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,7,8,9,10,11,12,13,0,14,15,0,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,7,8,0,10,11,0,13,0,0,0,0,0,0,0,0,10,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,4,4,0,0,5,6,7,8,9,10,11,12,13,0,14,15,0,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,7,8,49,10,11,12,13,0,49,15,0,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,50,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,7,8,0,10,11,0,13,0,0,15,0,0,0,0,0,10,0,19,20,21,22,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,7,8,0,10,11,0,13,0,0,15,0,0,0,0,0,10,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,0,52 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,27,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,0,0,0,0,0,0,37,38,0,0,0,0,0,41,0,0,0,44,45,46,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,0,30,0,0,0,0,0,0,0,38,0,0,0,0,0,41,0,0,0,44,45,46,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,31,32,0,0,35,0,37,38,0,0,0,0,0,41,0,0,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,0,32,0,0,0,0,37,38,0,0,0,0,0,41,0,0,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,31,32,33,34,35,36,37,38,0,40,0,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,31,32,0,34,35,0,37,38,0,0,0,0,0,41,0,0,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,0,32,0,0,35,0,37,38,0,0,0,0,0,41,0,0,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,0,30,0,0,0,0,0,0,37,38,0,0,0,0,0,41,0,0,0,44,45,46,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,31,32,33,34,35,36,37,38,39,40,0,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,31,32,0,34,35,0,37,38,0,0,0,0,0,41,0,34,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,31,32,53,34,35,36,37,38,53,40,0,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,54,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,31,32,0,34,35,0,37,38,0,40,0,0,0,41,0,34,0,44,45,46,47,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,41,0,0,0,44,45,46,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,41,0,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,41,0,0,0,0,45,46,0,0,0,0,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,31,32,0,34,35,0,37,38,0,40,0,0,0,41,0,34,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,0,0,0,0,0,0,37,38,0,0,0,0,0,41,0,0,0,44,45,46,0,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,7,8,49,10,11,12,13,0,0,15,0,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,5,6,7,8,49,10,11,12,13,0,49,15,0,0,0,0,17,10,18,19,20,21,22,0,0,23,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,31,32,53,34,35,36,37,38,0,40,0,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,28,0,29,30,31,32,53,34,35,36,37,38,53,40,0,0,0,41,42,34,43,44,45,46,47,0,0,48,0,0,0,0,0,0 },
+ new int[] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,0,52 }
};
public static bool[] AcceptingStates => new bool[]
diff --git a/src/SixLabors.Fonts/Unicode/Resources/UniversalShapingTrie.Generated.cs b/src/SixLabors.Fonts/Unicode/Resources/UniversalShapingTrie.Generated.cs
index d6631094d..83a6911df 100644
--- a/src/SixLabors.Fonts/Unicode/Resources/UniversalShapingTrie.Generated.cs
+++ b/src/SixLabors.Fonts/Unicode/Resources/UniversalShapingTrie.Generated.cs
@@ -220,7 +220,7 @@ internal static class UniversalShapingTrie
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0,
+ 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0,
13, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
@@ -231,16 +231,16 @@ internal static class UniversalShapingTrie
4, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 18, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0,
0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 21, 0, 0, 0, 2, 0, 0, 0,
- 21, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 2, 0, 0, 0,
+ 22, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0,
- 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 13, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 22, 0, 0, 0,
- 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0,
- 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 21, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 13, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 23, 0, 0, 0,
+ 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0,
+ 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0,
- 15, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 9, 0, 0, 0, 23, 0, 0, 0, 24, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0,
+ 15, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 9, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0,
8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
18, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 15, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0,
@@ -256,13 +256,13 @@ internal static class UniversalShapingTrie
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
0, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0,
- 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 16, 0, 0, 0, 25, 0, 0, 0, 17, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0, 14, 0, 0, 0, 16, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0,
+ 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 16, 0, 0, 0, 26, 0, 0, 0, 17, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 9, 0, 0, 0, 14, 0, 0, 0, 16, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0,
4, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 15, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0,
- 27, 0, 0, 0, 9, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
+ 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 15, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0,
+ 28, 0, 0, 0, 9, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
@@ -270,29 +270,29 @@ internal static class UniversalShapingTrie
2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
- 24, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 28, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 10, 0, 0, 0,
- 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
+ 25, 0, 0, 0, 18, 0, 0, 0, 23, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 29, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 10, 0, 0, 0,
+ 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 25, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 26, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 17, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 12, 0, 0, 0,
12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
- 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 29, 0, 0, 0, 30, 0, 0, 0, 29, 0, 0, 0, 29, 0, 0, 0, 29, 0, 0, 0, 29, 0, 0, 0,
- 29, 0, 0, 0, 29, 0, 0, 0, 29, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 25, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
- 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0,
- 22, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
- 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 17, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0,
- 25, 0, 0, 0, 25, 0, 0, 0, 31, 0, 0, 0, 31, 0, 0, 0, 16, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 30, 0, 0, 0, 30, 0, 0, 0, 30, 0, 0, 0, 30, 0, 0, 0,
+ 30, 0, 0, 0, 30, 0, 0, 0, 30, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 26, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
+ 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0,
+ 23, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
+ 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 17, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0,
+ 26, 0, 0, 0, 26, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 15, 0, 0, 0,
15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 19, 0, 0, 0,
19, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -346,18 +346,18 @@ internal static class UniversalShapingTrie
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
- 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 23, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 24, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0,
7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 15, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
- 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0, 25, 0, 0, 0,
- 26, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 25, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
+ 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0,
+ 27, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 26, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 17, 0, 0, 0,
10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 9, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 14, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0,
0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 23, 0, 0, 0, 24, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 25, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 25, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 26, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
@@ -366,7 +366,7 @@ internal static class UniversalShapingTrie
12, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0,
10, 0, 0, 0, 13, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0,
@@ -392,9 +392,9 @@ internal static class UniversalShapingTrie
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 19, 0, 0, 0, 19, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0,
- 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 14, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0,
- 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 36, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
+ 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 14, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0,
+ 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 37, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 11, 0, 0, 0,
1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
@@ -403,7 +403,7 @@ internal static class UniversalShapingTrie
1, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0,
- 9, 0, 0, 0, 9, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 21, 0, 0, 0, 11, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
+ 9, 0, 0, 0, 9, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 22, 0, 0, 0, 11, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0,
@@ -432,27 +432,27 @@ internal static class UniversalShapingTrie
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 14, 0, 0, 0, 11, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
- 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 24, 0, 0, 0, 28, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 25, 0, 0, 0, 29, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 11, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0,
- 12, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 20, 0, 0, 0, 23, 0, 0, 0, 20, 0, 0, 0, 18, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 12, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 20, 0, 0, 0, 24, 0, 0, 0, 20, 0, 0, 0, 18, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0,
13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
- 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 21, 0, 0, 0, 13, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 20, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 22, 0, 0, 0, 13, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 20, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 18, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 4, 0, 0, 0,
- 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 27, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 17, 0, 0, 0, 14, 0, 0, 0,
+ 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 17, 0, 0, 0, 14, 0, 0, 0,
1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0,
9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
- 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0,
- 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 22, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0,
+ 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 23, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0,
0, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, 20, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0,
diff --git a/src/SixLabors.Fonts/VerticalAlignment.cs b/src/SixLabors.Fonts/VerticalAlignment.cs
index e70389d25..4cb0afc80 100644
--- a/src/SixLabors.Fonts/VerticalAlignment.cs
+++ b/src/SixLabors.Fonts/VerticalAlignment.cs
@@ -19,7 +19,12 @@ public enum VerticalAlignment
Center = 1,
///
- /// Aligns text upwards from the bottom
+ /// Aligns text upwards from the bottom.
///
- Bottom = 2
+ Bottom = 2,
+
+ ///
+ /// Aligns text to the baseline.
+ ///
+ Baseline = 3
}
diff --git a/src/UnicodeTrieGenerator/Generator.IndicShapingEngine.cs b/src/UnicodeTrieGenerator/Generator.IndicShapingEngine.cs
index 695cc7193..94f2da360 100644
--- a/src/UnicodeTrieGenerator/Generator.IndicShapingEngine.cs
+++ b/src/UnicodeTrieGenerator/Generator.IndicShapingEngine.cs
@@ -4,7 +4,6 @@
#pragma warning disable SYSLIB1045 // Convert to 'GeneratedRegexAttribute'.
using System.Text.RegularExpressions;
using SixLabors.Fonts.Unicode;
-using SixLabors.Fonts.Unicode.Resources;
using UnicodeTrieGenerator.StateAutomation;
using Categories = SixLabors.Fonts.Unicode.Resources.IndicShapingData.Categories;
using IPC = SixLabors.Fonts.Unicode.IndicPositionalCategory;
@@ -20,6 +19,7 @@ public static partial class Generator
{
private static readonly Dictionary CategoryMap = new()
{
+ // { ISC.Other, Categories.X },
{ ISC.Avagraha, Categories.Symbol },
{ ISC.Bindu, Categories.SM },
{ ISC.BrahmiJoiningNumber, Categories.Placeholder },
@@ -36,8 +36,8 @@ public static partial class Generator
{ ISC.ConsonantSubjoined, Categories.CM },
{ ISC.ConsonantSucceedingRepha, Categories.N },
{ ISC.ConsonantWithStacker, Categories.Repha },
- { ISC.GeminationMark, Categories.SM },
- { ISC.InvisibleStacker, Categories.Coeng },
+ { ISC.GeminationMark, Categories.SM }, // https://github.com/harfbuzz/harfbuzz/issues/552
+ { ISC.InvisibleStacker, Categories.Coeng }, // TODO: Use H once we add explicit Khmer shaper
{ ISC.Joiner, Categories.ZWJ },
{ ISC.ModifyingLetter, Categories.X },
{ ISC.NonJoiner, Categories.ZWNJ },
@@ -56,14 +56,78 @@ public static partial class Generator
{ ISC.VowelIndependent, Categories.V }
};
+ // Per-codepoint category overrides for Indic-style shaping.
+ // These values augment the base Unicode/Indic tables to match
+ // HarfBuzz behavior for Indic, Khmer, and Myanmar scripts.
private static readonly Dictionary IndicShapingOverrides = new()
{
+ // --------------------------------------------------------------------
+ // Variation selectors
+ //
+ // These are the Unicode variation selectors. They only appear in the
+ // Myanmar grammar, but they are not Myanmar specific.
+ // --------------------------------------------------------------------
+ { 0xFE00, Categories.VS },
+ { 0xFE01, Categories.VS },
+ { 0xFE02, Categories.VS },
+ { 0xFE03, Categories.VS },
+ { 0xFE04, Categories.VS },
+ { 0xFE05, Categories.VS },
+ { 0xFE06, Categories.VS },
+ { 0xFE07, Categories.VS },
+ { 0xFE08, Categories.VS },
+ { 0xFE09, Categories.VS },
+ { 0xFE0A, Categories.VS },
+ { 0xFE0B, Categories.VS },
+ { 0xFE0C, Categories.VS },
+ { 0xFE0D, Categories.VS },
+ { 0xFE0E, Categories.VS },
+ { 0xFE0F, Categories.VS },
+
+ // --------------------------------------------------------------------
+ // Placeholder-like characters from the OT Myanmar spec
+ //
+ // These are listed in the Myanmar OpenType spec as placeholder bases,
+ // but they are not Myanmar specific.
+ // --------------------------------------------------------------------
+ { 0x2015, Categories.Placeholder },
+ { 0x2022, Categories.Placeholder },
+ { 0x25FB, Categories.Placeholder },
+ { 0x25FC, Categories.Placeholder },
+ { 0x25FD, Categories.Placeholder },
+ { 0x25FE, Categories.Placeholder },
+
+ // --------------------------------------------------------------------
+ // Indic overrides
+ // --------------------------------------------------------------------
+
+ // Ra (script-specific consonant Ra)
+ { 0x0930, Categories.Ra }, // Devanagari
+ { 0x09B0, Categories.Ra }, // Bengali
+ { 0x09F0, Categories.Ra }, // Bengali
+ { 0x0A30, Categories.Ra }, // Gurmukhi, no reph
+ { 0x0AB0, Categories.Ra }, // Gujarati
+ { 0x0B30, Categories.Ra }, // Oriya
+ { 0x0BB0, Categories.Ra }, // Tamil, no reph
+ { 0x0C30, Categories.Ra }, // Telugu, reph formed only with ZWJ
+ { 0x0CB0, Categories.Ra }, // Kannada
+ { 0x0D30, Categories.Ra }, // Malayalam, no reph, logical repha
+
+ // These act more like bindus.
{ 0x0953, Categories.SM },
{ 0x0954, Categories.SM },
+
+ // U+0A40 GURMUKHI VOWEL SIGN II may be preceded by U+0A02 GURMUKHI SIGN BINDI.
+ { 0x0A40, Categories.MPst },
+
+ // Characters that act like consonants.
{ 0x0A72, Categories.C },
{ 0x0A73, Categories.C },
{ 0x1CF5, Categories.C },
{ 0x1CF6, Categories.C },
+
+ // TODO: These should only be allowed after a visarga.
+ // For now, treat them like regular tone marks (A).
{ 0x1CE2, Categories.A },
{ 0x1CE3, Categories.A },
{ 0x1CE4, Categories.A },
@@ -71,7 +135,13 @@ public static partial class Generator
{ 0x1CE6, Categories.A },
{ 0x1CE7, Categories.A },
{ 0x1CE8, Categories.A },
+
+ // TODO: Should only be allowed after some nasalization marks.
+ // For now, treat as tone mark (A).
{ 0x1CED, Categories.A },
+
+ // Take marks in standalone clusters, similar to Avagraha, so classify
+ // as Symbol.
{ 0xA8F2, Categories.Symbol },
{ 0xA8F3, Categories.Symbol },
{ 0xA8F4, Categories.Symbol },
@@ -86,22 +156,108 @@ public static partial class Generator
{ 0x1CEF, Categories.Symbol },
{ 0x1CF0, Categories.Symbol },
{ 0x1CF1, Categories.Symbol },
- { 0x17C6, Categories.N },
- { 0x2010, Categories.Placeholder },
- { 0x2011, Categories.Placeholder },
+
+ // Special matra classification.
+ // https://github.com/harfbuzz/harfbuzz/issues/524
+ { 0x0A51, Categories.M },
+
+ // Grantha marks that can also appear in Tamil (per ScriptExtensions.txt),
+ // so the Indic shaper must know their categories.
+ { 0x11301, Categories.SM },
+ { 0x11302, Categories.SM },
+ { 0x11303, Categories.SM },
+ { 0x1133B, Categories.N },
+ { 0x1133C, Categories.N },
+
+ // Additional nukta-like marks.
+ // https://github.com/harfbuzz/harfbuzz/issues/552
+ { 0x0AFB, Categories.N },
+
+ // https://github.com/harfbuzz/harfbuzz/issues/2849
+ { 0x0B55, Categories.N },
+
+ // Extra placeholders for standalone shaping.
+ // https://github.com/harfbuzz/harfbuzz/pull/1613
+ { 0x09FC, Categories.Placeholder },
+
+ // https://github.com/harfbuzz/harfbuzz/pull/623
+ { 0x0C80, Categories.Placeholder },
+
+ // https://github.com/harfbuzz/harfbuzz/pull/3511
+ { 0x0D04, Categories.Placeholder },
{ 0x25CC, Categories.Dotted_Circle },
- { 0x0930, Categories.Ra },
- { 0x09B0, Categories.Ra },
- { 0x09F0, Categories.Ra },
- { 0x0A30, Categories.Ra },
- { 0x0AB0, Categories.Ra },
- { 0x0B30, Categories.Ra },
- { 0x0BB0, Categories.Ra },
- { 0x0C30, Categories.Ra },
- { 0x0CB0, Categories.Ra },
- { 0x0D30, Categories.Ra },
- { 0x0DBB, Categories.Ra },
- { 0x179A, Categories.Ra }
+
+ // --------------------------------------------------------------------
+ // Khmer overrides
+ // --------------------------------------------------------------------
+ { 0x179A, Categories.Ra }, // Khmer Ra
+ { 0x17C6, Categories.N }, // TODO: Replace with Xgroup as per below once we support it.
+
+ // { 0x17CC, Categories.Robatic },
+ // { 0x17C9, Categories.Robatic },
+ // { 0x17CA, Categories.Robatic },
+ // { 0x17C6, Categories.Xgroup },
+ // { 0x17CB, Categories.Xgroup },
+ // { 0x17CD, Categories.Xgroup },
+ // { 0x17CE, Categories.Xgroup },
+ // { 0x17CF, Categories.Xgroup },
+ // { 0x17D0, Categories.Xgroup },
+ // { 0x17D1, Categories.Xgroup },
+ // { 0x17C7, Categories.Ygroup },
+ // { 0x17C8, Categories.Ygroup },
+ // { 0x17DD, Categories.Ygroup },
+ // { 0x17D3, Categories.Ygroup }, // Just guessing. Uniscribe does not categorize it.
+
+ // https://github.com/harfbuzz/harfbuzz/issues/2384
+ { 0x17D9, Categories.Placeholder },
+
+ // --------------------------------------------------------------------
+ // Myanmar overrides
+ //
+ // Spec reference:
+ // https://learn.microsoft.com/en-us/typography/script-development/myanmar#analyze
+ // --------------------------------------------------------------------
+
+ // The spec says C, IndicSyllableCategory says Consonant_Placeholder.
+ { 0x104E, Categories.C },
+ { 0x1004, Categories.Ra },
+ { 0x101B, Categories.Ra },
+ { 0x105A, Categories.Ra },
+ { 0x1032, Categories.A },
+ { 0x1036, Categories.A },
+ { 0x103A, Categories.As },
+
+ // 0x1040: D0 in the spec, but Uniscribe does not seem to treat it as such.
+ // (intentionally not overridden here)
+ { 0x103E, Categories.MH },
+ { 0x1060, Categories.ML },
+ { 0x103C, Categories.MR },
+ { 0x103D, Categories.MW },
+ { 0x1082, Categories.MW },
+ { 0x103B, Categories.MY },
+ { 0x105E, Categories.MY },
+ { 0x105F, Categories.MY },
+ { 0x1063, Categories.PT },
+ { 0x1064, Categories.PT },
+ { 0x1069, Categories.PT },
+ { 0x106A, Categories.PT },
+ { 0x106B, Categories.PT },
+ { 0x106C, Categories.PT },
+ { 0x106D, Categories.PT },
+ { 0xAA7B, Categories.PT },
+ { 0x1038, Categories.SM },
+ { 0x1087, Categories.SM },
+ { 0x1088, Categories.SM },
+ { 0x1089, Categories.SM },
+ { 0x108A, Categories.SM },
+ { 0x108B, Categories.SM },
+ { 0x108C, Categories.SM },
+ { 0x108D, Categories.SM },
+ { 0x108F, Categories.SM },
+ { 0x109A, Categories.SM },
+ { 0x109B, Categories.SM },
+ { 0x109C, Categories.SM },
+ { 0x104A, Categories.Placeholder },
};
private static readonly Dictionary PositionMap = new()
@@ -177,15 +333,16 @@ private static int GetPosition(Codepoint codepoint, Categories category)
{
Positions position = PositionMap.GetValueOrDefault(codepoint.IndicPositionalCategory, Positions.End);
- if ((category & IndicShapingData.ConsonantFlags) != 0)
+ // Keep in sync with ethe constants flag in the shaper.
+ if (category is Categories.C or Categories.Ra or Categories.CM or Categories.V or Categories.Placeholder or Categories.Dotted_Circle)
{
position = Positions.Base_C;
}
- else if (category == Categories.M)
+ else if (category is Categories.M)
{
position = MatraPosition(codepoint, position);
}
- else if (category is Categories.SM or Categories.VD or Categories.A or Categories.Symbol)
+ else if (category is Categories.SM or Categories.A or Categories.Symbol)
{
position = Positions.SMVD;
}
@@ -203,26 +360,90 @@ private static void GenerateIndicShapingDataTrie(Codepoint[] codePoints)
{
SetBlocks(codePoints);
- Dictionary symbols = Enum.GetValues().ToDictionary(c => c.ToString(), c => (int)Math.Log((int)c, 2));
+ Categories[] categories = Enum.GetValues();
+ Dictionary categoryMap = categories.ToDictionary(c => c.ToString(), c => (int)c);
UnicodeTrieBuilder builder = new();
for (int i = 0; i < codePoints.Length; i++)
{
Codepoint codePoint = codePoints[i];
- Categories category = IndicShapingOverrides.GetValueOrDefault(codePoint.Code, CategoryMap.GetValueOrDefault(codePoint.IndicSyllabicCategory, Categories.X));
+ Categories rawCategory = IndicShapingOverrides.GetValueOrDefault(
+ codePoint.Code,
+ CategoryMap.GetValueOrDefault(codePoint.IndicSyllabicCategory, Categories.X));
+
+ // Apply HarfBuzz-style matra normalization for Khmer/Myanmar blocks.
+ Categories category = NormalizeCategoryForBlock(codePoint, rawCategory);
+
int position = GetPosition(codePoint, category);
- builder.Set(codePoint.Code, (uint)((symbols[category.ToString()] << 8) | position));
+ builder.Set(codePoint.Code, (uint)((categoryMap[category.ToString()] << 8) | position));
}
UnicodeTrie trie = builder.Freeze();
GenerateTrieClass("IndicShaping", trie);
+ // HarfBuzz's Ragel state machines use a dense, zero-based alphabet
+ // (0..N-1) for DFA transitions, even though the underlying shaping
+ // categories (C, V, H, MR, MW, VBlw, etc.) are sparse numeric values.
+ // For example, Indic categories include values such as 1, 2, 3, 4,
+ // 15, 18, 20, 21, 32, 35, 41, 57.
+ //
+ // Our PEG-generated state machine table also expects its input symbols
+ // to be dense 0..N-1 indices, not HarfBuzz's raw category codes.
+ // Therefore, we build a compact symbol map by assigning each
+ // Categories enum value a sequential integer (0..N-1) in the
+ // order they appear in the enum.
+ //
+ // The state machine is generated against these compact IDs, and later
+ // SetupSyllables maps each Indic category to the corresponding
+ // compact symbol before running the DFA.
+ Dictionary symbols = new(categories.Length);
+ int id = 0;
+
+ foreach (Categories c in categories)
+ {
+ symbols[c.ToString()] = id++;
+ }
+
StateMachine machine = GetStateMachine("indic", symbols);
GenerateDataClass("IndicShaping", null, null, machine, true);
}
+ private static Categories NormalizeCategoryForBlock(Codepoint codepoint, Categories category)
+ {
+ // HarfBuzz: matra_categories = ('M', 'MPst')
+ // For Khmer and Myanmar blocks, convert generic matras (M/MPst)
+ // into positional vowel categories VPre/VAbv/VBlw/VPst based on
+ // the base positional category (PRE_C / ABOVE_C / BELOW_C / POST_C).
+ if (category is Categories.M or Categories.MPst)
+ {
+ string block = codepoint.Block;
+
+ // TODO: Once we implement the Khmer shaper, enable Khmer here too.
+ // if (block.StartsWith("Khmer", StringComparison.Ordinal) ||
+ // block.StartsWith("Myanmar", StringComparison.Ordinal))
+ if (block.StartsWith("Myanmar", StringComparison.Ordinal))
+ {
+ // Base positional category from IndicPositionalCategory.txt
+ Positions basePos = PositionMap.GetValueOrDefault(
+ codepoint.IndicPositionalCategory,
+ Positions.End);
+
+ return basePos switch
+ {
+ Positions.Pre_C => Categories.VPre,
+ Positions.Above_C => Categories.VAbv,
+ Positions.Below_C => Categories.VBlw,
+ Positions.Post_C => Categories.VPst,
+ _ => category
+ };
+ }
+ }
+
+ return category;
+ }
+
private static void SetBlocks(Codepoint[] codePoints)
{
Regex regex = new(@"^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s*;\s*([\w\s-]+)");
diff --git a/src/UnicodeTrieGenerator/Generator.MyanmarShapingEngine.cs b/src/UnicodeTrieGenerator/Generator.MyanmarShapingEngine.cs
new file mode 100644
index 000000000..0e8344c89
--- /dev/null
+++ b/src/UnicodeTrieGenerator/Generator.MyanmarShapingEngine.cs
@@ -0,0 +1,44 @@
+// Copyright (c) Six Labors.
+// Licensed under the Six Labors Split License.
+
+using UnicodeTrieGenerator.StateAutomation;
+using MyanmarCategories = SixLabors.Fonts.Unicode.Resources.IndicShapingData.MyanmarCategories;
+
+namespace UnicodeTrieGenerator;
+
+///
+/// Contains code to generate a trie and state machine for storing Myanmar Shaping Data category data.
+///
+public static partial class Generator
+{
+ private static void GenerateMyanmarShapingData()
+ {
+ // HarfBuzz's Ragel state machines use a dense, zero-based alphabet
+ // (0..N-1) for DFA transitions, even though the underlying shaping
+ // categories (C, V, H, MR, MW, VBlw, etc.) are sparse numeric values.
+ // For example, Myanmar categories include values such as 1, 2, 3, 4,
+ // 15, 18, 20, 21, 32, 35, 41, 57.
+ //
+ // Our PEG-generated state machine table also expects its input symbols
+ // to be dense 0..N-1 indices, not HarfBuzz's raw category codes.
+ // Therefore, we build a compact symbol map by assigning each
+ // MyanmarCategories enum value a sequential integer (0..N-1) in the
+ // order they appear in the enum.
+ //
+ // The state machine is generated against these compact IDs, and later
+ // SetupSyllables maps each Myanmar category to the corresponding
+ // compact symbol before running the DFA.
+ MyanmarCategories[] categories = Enum.GetValues();
+ Dictionary symbols = new(categories.Length);
+ int id = 0;
+
+ foreach (MyanmarCategories c in categories)
+ {
+ symbols[c.ToString()] = id++;
+ }
+
+ StateMachine machine = GetStateMachine("myanmar", symbols);
+
+ GenerateDataClass("MyanmarShaping", null, null, machine, true);
+ }
+}
diff --git a/src/UnicodeTrieGenerator/Generator.UniversalShapingEngine.cs b/src/UnicodeTrieGenerator/Generator.UniversalShapingEngine.cs
index b5c389c95..f9b1dde87 100644
--- a/src/UnicodeTrieGenerator/Generator.UniversalShapingEngine.cs
+++ b/src/UnicodeTrieGenerator/Generator.UniversalShapingEngine.cs
@@ -68,6 +68,12 @@ public static partial class Generator
0x25fe
}
},
+ {
+ "HVM", new List