Browse Source

Update Unicode data and algorithms to v. 16.0 (#16919)

* Fix BiDi algorithm and tests

* More adjustments

* Add EastAsianWidth trie and class

* Start implementing Unicode v15.1 Standard Annex #14

* Update Unicode data to V15.1 and initial Unicode® Standard Annex #14 implementation

* Some adjustments

* More fixes

* 543 to go

* 273 to go

* Almost done

* Finish up line breaker

* Some adjustments
pull/17727/head
Benedikt Stebner 1 year ago
committed by GitHub
parent
commit
4c428d073d
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1328
      src/Avalonia.Base/Media/TextFormatting/Unicode/BiDi.trie.cs
  2. 34
      src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs
  3. 31
      src/Avalonia.Base/Media/TextFormatting/Unicode/Codepoint.cs
  4. 669
      src/Avalonia.Base/Media/TextFormatting/Unicode/EastAsianWidth.trie.cs
  5. 12
      src/Avalonia.Base/Media/TextFormatting/Unicode/EastAsianWidthClass.cs
  6. 5
      src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakClass.cs
  7. 1864
      src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs
  8. 43
      src/Avalonia.Base/Media/TextFormatting/Unicode/PropertyValueAliasHelper.cs
  9. 7
      src/Avalonia.Base/Media/TextFormatting/Unicode/Script.cs
  10. 11
      src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.cs
  11. 3659
      src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.trie.cs
  12. 45
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiAlgorithmTests.cs
  13. 26
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTestDataGenerator.cs
  14. 73
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTests.cs
  15. 36
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiTestDataGenerator.cs
  16. 130
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/EastAsianWidthClassTrieGenerator.cs
  17. 23
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/EastAsianWidthClassTrieGeneratorTests.cs
  18. 37
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGeneratorTests.cs
  19. 36
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakTestDataGenerator.cs
  20. 170
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs
  21. 6
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs
  22. 31
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeEnumsGenerator.cs

1328
src/Avalonia.Base/Media/TextFormatting/Unicode/BiDi.trie.cs

File diff suppressed because it is too large

34
src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs

@ -24,11 +24,11 @@ namespace Avalonia.Media.TextFormatting.Unicode
public sbyte ParagraphEmbeddingLevel { get; set; }
public bool HasBrackets { get; private set; }
public bool? HasBrackets { get; private set; }
public bool HasEmbeddings { get; private set; }
public bool? HasEmbeddings { get; private set; }
public bool HasIsolates { get; private set; }
public bool? HasIsolates { get; private set; }
/// <summary>
/// Gets the length of the data held by the BidiData
@ -86,30 +86,38 @@ namespace Avalonia.Media.TextFormatting.Unicode
(1U << (int)BidiClass.RightToLeftIsolate) |
(1U << (int)BidiClass.FirstStrongIsolate) |
(1U << (int)BidiClass.PopDirectionalIsolate);
var codePointEnumerator = new CodepointEnumerator(text);
while (codePointEnumerator.MoveNext(out var codepoint))
{
// Look up BiDiClass
var dir = codepoint.BiDiClass;
_classes[i] = dir;
var dirBit = 1U << (int)dir;
HasEmbeddings = (dirBit & embeddingMask) != 0U;
HasIsolates = (dirBit & isolateMask) != 0U;
if (!HasEmbeddings.HasValue && (dirBit & embeddingMask) != 0U)
{
HasEmbeddings = true;
}
if (!HasIsolates.HasValue && (dirBit & isolateMask) != 0U)
{
HasIsolates = true;
}
// Lookup paired bracket types
var pbt = codepoint.PairedBracketType;
_pairedBracketTypes[i] = pbt;
if (pbt == BidiPairedBracketType.Open)
{
// Opening bracket types can never have a null pairing.
codepoint.TryGetPairedBracket(out var paired);
_pairedBracketValues[i] = (int)Codepoint.GetCanonicalType(paired).Value;
HasBrackets = true;
@ -117,7 +125,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
else if (pbt == BidiPairedBracketType.Close)
{
_pairedBracketValues[i] = (int)Codepoint.GetCanonicalType(codepoint).Value;
HasBrackets = true;
}
@ -125,7 +133,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
}
Length = i;
Classes = _classes.AsSlice(0, Length);
PairedBracketTypes = _pairedBracketTypes.AsSlice(0, Length);
PairedBracketValues = _pairedBracketValues.AsSlice(0, Length);
@ -174,7 +182,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
public ArraySlice<sbyte> GetTempLevelBuffer(int length)
{
_tempLevelBuffer.Clear();
return _tempLevelBuffer.Add(length, false);
}

31
src/Avalonia.Base/Media/TextFormatting/Unicode/Codepoint.cs

@ -58,6 +58,37 @@ namespace Avalonia.Media.TextFormatting.Unicode
/// </summary>
public GraphemeBreakClass GraphemeBreakClass => UnicodeData.GetGraphemeClusterBreak(_value);
/// <summary>
/// Gets the <see cref="EastAsianWidthClass"/>.
/// </summary>
public EastAsianWidthClass EastAsianWidthClass => UnicodeData.GetEastAsianWidthClass(_value);
/// <summary>
/// Determines whether this <see cref="Codepoint"/> is an east asian char.
/// </summary>
/// <returns>
/// <c>true</c> if [is an east asian character]; otherwise, <c>false</c>.
/// </returns>
public bool IsEastAsian
{
get
{
var eastAsianWidth = EastAsianWidthClass;
switch (eastAsianWidth)
{
case EastAsianWidthClass.Fullwidth:
case EastAsianWidthClass.Halfwidth:
case EastAsianWidthClass.Wide:
{
return true;
}
}
return false;
}
}
/// <summary>
/// Determines whether this <see cref="Codepoint"/> is a break char.
/// </summary>

669
src/Avalonia.Base/Media/TextFormatting/Unicode/EastAsianWidth.trie.cs

@ -0,0 +1,669 @@
//---------------------------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by UnicodeDataGenerator.
// Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
// </auto-generated>"
//---------------------------------------------------------------------------------------------------
using System;
using System.Runtime.CompilerServices;
namespace Avalonia.Media.TextFormatting.Unicode;
internal static class EastAsianWidthTrie
{
public static UnicodeTrie Trie
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => new(Data, 0x00110000, 0x00000000);
}
private static ReadOnlySpan<uint> Data => new uint[]
{
0x000003E7, 0x000003EF, 0x000003F7, 0x000003FF, 0x0000041F, 0x00000427, 0x0000042F, 0x00000437, 0x0000043F, 0x00000447, 0x0000044F, 0x00000457,
0x00000417, 0x0000041F, 0x0000045C, 0x00000464, 0x00000417, 0x0000041F, 0x00000468, 0x00000470, 0x00000417, 0x0000041F, 0x00000477, 0x0000047F,
0x00000407, 0x0000040F, 0x0000040B, 0x00000413, 0x00000483, 0x0000048B, 0x00000493, 0x0000049B, 0x000004A3, 0x000004AB, 0x000004AF, 0x000004B7,
0x00000417, 0x0000041F, 0x00000417, 0x0000041F, 0x00000417, 0x0000041F, 0x00000417, 0x0000041F, 0x00000417, 0x0000041F, 0x00000417, 0x0000041F,
0x00000417, 0x0000041F, 0x00000417, 0x0000041F, 0x00000417, 0x0000041F, 0x00000417, 0x0000041F, 0x00000417, 0x0000041F, 0x00000417, 0x0000041F,
0x00000417, 0x0000041F, 0x00000417, 0x0000041F, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7,
0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000004BF, 0x000004BF, 0x000004BF, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7,
0x000003E7, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7,
0x000003E7, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7,
0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7,
0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7,
0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000004C7, 0x000004CF, 0x000003E7, 0x000004D7, 0x000004DF, 0x000004E5, 0x000003E7, 0x000003E7,
0x000004ED, 0x000004F5, 0x000004F9, 0x00000501, 0x00000508, 0x0000050F, 0x00000516, 0x0000051D, 0x00000525, 0x0000052D, 0x00000535, 0x0000053D,
0x00000545, 0x0000054C, 0x00000417, 0x00000417, 0x00000554, 0x0000055B, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000561,
0x00000417, 0x000003E7, 0x000003E7, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000569, 0x00000407, 0x00000407, 0x0000056E, 0x00000412,
0x00000572, 0x0000057A, 0x00000581, 0x00000589, 0x00000591, 0x00000417, 0x00000598, 0x000005A0, 0x000005A8, 0x000005B0, 0x000005B8, 0x000005C0,
0x000005C8, 0x000005CE, 0x000005D6, 0x000005DC, 0x000005E4, 0x000005EA, 0x000003E7, 0x000005F2, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000005F9, 0x00000417, 0x000003E7, 0x000003E7,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000005FB, 0x000003E7, 0x00000603, 0x000003E7,
0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x000003E7,
0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417,
0x0000060B, 0x000004BF, 0x000004BF, 0x000004C2, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x00000612, 0x000004BB,
0x0000061A, 0x0000061B, 0x00000623, 0x000004BF, 0x0000061D, 0x000004BF, 0x000004BF, 0x000004BF, 0x0000062B, 0x0000062F, 0x000004BF, 0x000004BF,
0x00000634, 0x000004BF, 0x000004BF, 0x0000063B, 0x0000061B, 0x000004BF, 0x00000641, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x00000417, 0x00000417,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x00000646, 0x000004BF, 0x0000064D, 0x000003E7,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7,
0x000003E7, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7,
0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000655,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x0000065D, 0x000003E7, 0x000003E7,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417,
0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x00000665, 0x000004BB, 0x0000066D, 0x00000674, 0x00000417, 0x00000417, 0x00000417, 0x000003E7,
0x0000067C, 0x0000067D, 0x0000067D, 0x00000685, 0x00000686, 0x00000687, 0x0000068F, 0x00000697, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x0000101C, 0x0000101C, 0x0000107C, 0x000010BC, 0x000010FC, 0x0000113C, 0x0000105C, 0x00001170,
0x0000105C, 0x000011A0, 0x0000105C, 0x000011DC, 0x0000101C, 0x0000102C, 0x0000120C, 0x0000124C, 0x0000128C, 0x000012BC, 0x0000105C, 0x0000105C,
0x0000105C, 0x0000105C, 0x0000105C, 0x0000105C, 0x0000105C, 0x0000105C, 0x0000105C, 0x0000105C, 0x0000105C, 0x0000105C, 0x0000105C, 0x0000105C,
0x00000A40, 0x00000A80, 0x00000AB7, 0x00000AF6, 0x00000B36, 0x00000B61, 0x00000BA1, 0x000006C0, 0x00000BC4, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x00000BF7, 0x00000193, 0x00000193, 0x00000C37, 0x00000C77, 0x000006C0, 0x000006C0, 0x000006C0, 0x00000CA0, 0x00000CE0, 0x00000CFD,
0x000006C0, 0x00000D23, 0x00000D62, 0x00000DA1, 0x00000DE1, 0x00000E1A, 0x00000E5A, 0x00000E9A, 0x00000193, 0x00000193, 0x00000193, 0x00000193,
0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193,
0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193,
0x00000193, 0x00000193, 0x00000193, 0x00000EDA, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193,
0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193,
0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000193, 0x00000EDA,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x00000F1A, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0,
0x000006C0, 0x000006C0, 0x000006C0, 0x000006C0, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700,
0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700,
0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000F5A,
0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700,
0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700,
0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000F5A, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7,
0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7,
0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417,
0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7,
0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417,
0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7,
0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417,
0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x000003E7,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7,
0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x000003E7,
0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x00000417,
0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417,
0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x0000069F, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004C1, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x00000612, 0x00000417, 0x000006A7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000006AB, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000006B3, 0x000006B8, 0x000006BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004C0, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x00000417,
0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7,
0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417,
0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7,
0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7,
0x000003E7, 0x000003E7, 0x000003E7, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x000006C7, 0x000003E7, 0x00000417, 0x00000417, 0x000003E7, 0x000003E7, 0x000005A4, 0x000003E7, 0x000006CF, 0x000006D4,
0x00000407, 0x000006DA, 0x000006DF, 0x000006E6, 0x00000417, 0x000003E7, 0x000006EE, 0x000004C0, 0x000006F4, 0x000006FC, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x000004BF, 0x00000704, 0x000004BF, 0x0000070A, 0x000004C2, 0x000004BF, 0x00000712, 0x0000071A, 0x000004BF, 0x0000061B,
0x00000722, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x00000723, 0x000004BF, 0x0000072B, 0x00000733, 0x00000739, 0x00000740, 0x000006C7,
0x00000417, 0x00000746, 0x000004BF, 0x000004BF, 0x000004C3, 0x00000417, 0x000004BF, 0x000004BF, 0x0000074D, 0x00000755, 0x00000417, 0x00000417,
0x00000417, 0x000003E7, 0x00000417, 0x00000417, 0x000003E7, 0x000006C4, 0x000003E7, 0x00000417, 0x000003E7, 0x00000417, 0x000003E7, 0x000003E7,
0x00000417, 0x00000417, 0x000004BC, 0x0000075D, 0x00000708, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x00000417, 0x00000417,
0x000003E7, 0x00000765, 0x0000076A, 0x0000076E, 0x00000776, 0x0000077E, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000003E7, 0x00000417,
0x000003E7, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF, 0x000004BF,
0x000004BF, 0x0000072B, 0x000003E7, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000413, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417,
0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000417, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407,
0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000407, 0x00000786, 0x000103E6, 0x000103E6,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000004, 0x00000004, 0x00000004, 0x00000004,
0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004,
0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004,
0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004,
0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004,
0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004,
0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004,
0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004,
0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000004, 0x00000004, 0x00000000, 0x00000004, 0x00000004, 0x00000000,
0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000004, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000,
0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003,
0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000003,
0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000,
0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003,
0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000000,
0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000002, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000,
0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000,
0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000000,
0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000000,
0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000,
0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000,
0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000005, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000005, 0x00000005, 0x00000000, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000005, 0x00000000,
0x00000000, 0x00000005, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000005,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000004, 0x00000004,
0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000004, 0x00000004, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000001, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001,
0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001,
0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001,
0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,
0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,
0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,
0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000003, 0x00000003, 0x00000003, 0x00000002, 0x00000002,
0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000003, 0x00000003, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,
0x00000003, 0x00000003, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000003, 0x00000003, 0x00000002, 0x00000002,
0x00000002, 0x00000003, 0x00000003, 0x00000003, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x00000003,
0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000005, 0x00000005, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000003,
0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000005, 0x00000000, 0x00000000, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000005, 0x00000005, 0x00000005, 0x00000005,
0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000000, 0x00000003, 0x00000003, 0x00000003
};
}

12
src/Avalonia.Base/Media/TextFormatting/Unicode/EastAsianWidthClass.cs

@ -0,0 +1,12 @@
namespace Avalonia.Media.TextFormatting.Unicode
{
public enum EastAsianWidthClass
{
Ambiguous, //A
Fullwidth, //F
Halfwidth, //H
Neutral, //N
Narrow, //Na
Wide, //W
}
}

5
src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakClass.cs

@ -37,6 +37,9 @@ namespace Avalonia.Media.TextFormatting.Unicode
ContingentBreak, //CB
Unknown, //XX
Ambiguous, //AI
Aksara, //AK
AksaraPrebase, //AP
AksaraStart, //AS
MandatoryBreak, //BK
ConditionalJapaneseStarter, //CJ
CarriageReturn, //CR
@ -45,5 +48,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
ComplexContext, //SA
Surrogate, //SG
Space, //SP
ViramaFinal, //VF
Virama, //VI
}
}

1864
src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs

File diff suppressed because it is too large

43
src/Avalonia.Base/Media/TextFormatting/Unicode/PropertyValueAliasHelper.cs

@ -46,6 +46,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ Script.Elbasan, "Elba"},
{ Script.Elymaic, "Elym"},
{ Script.Ethiopic, "Ethi"},
{ Script.Garay, "Gara"},
{ Script.Georgian, "Geor"},
{ Script.Glagolitic, "Glag"},
{ Script.GunjalaGondi, "Gong"},
@ -54,6 +55,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ Script.Grantha, "Gran"},
{ Script.Greek, "Grek"},
{ Script.Gujarati, "Gujr"},
{ Script.GurungKhema, "Gukh"},
{ Script.Gurmukhi, "Guru"},
{ Script.Hangul, "Hang"},
{ Script.Han, "Hani"},
@ -76,6 +78,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ Script.Khojki, "Khoj"},
{ Script.KhitanSmallScript, "Kits"},
{ Script.Kannada, "Knda"},
{ Script.KiratRai, "Krai"},
{ Script.Kaithi, "Kthi"},
{ Script.TaiTham, "Lana"},
{ Script.Lao, "Laoo"},
@ -112,6 +115,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ Script.Nushu, "Nshu"},
{ Script.Ogham, "Ogam"},
{ Script.OlChiki, "Olck"},
{ Script.OlOnal, "Onao"},
{ Script.OldTurkic, "Orkh"},
{ Script.Oriya, "Orya"},
{ Script.Osage, "Osge"},
@ -143,6 +147,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ Script.SoraSompeng, "Sora"},
{ Script.Soyombo, "Soyo"},
{ Script.Sundanese, "Sund"},
{ Script.Sunuwar, "Sunu"},
{ Script.SylotiNagri, "Sylo"},
{ Script.Syriac, "Syrc"},
{ Script.Tagbanwa, "Tagb"},
@ -160,7 +165,9 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ Script.Tibetan, "Tibt"},
{ Script.Tirhuta, "Tirh"},
{ Script.Tangsa, "Tnsa"},
{ Script.Todhri, "Todr"},
{ Script.Toto, "Toto"},
{ Script.TuluTigalari, "Tutg"},
{ Script.Ugaritic, "Ugar"},
{ Script.Vai, "Vaii"},
{ Script.Vithkuqi, "Vith"},
@ -175,11 +182,11 @@ namespace Avalonia.Media.TextFormatting.Unicode
public static string GetTag(Script script)
{
if (!s_scriptToTag.TryGetValue(script, out var value))
if(!s_scriptToTag.ContainsKey(script))
{
return "Zzzz";
}
return value;
return s_scriptToTag[script];
}
private static readonly Dictionary<string, Script> s_tagToScript =
@ -224,6 +231,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ "Elba", Script.Elbasan},
{ "Elym", Script.Elymaic},
{ "Ethi", Script.Ethiopic},
{ "Gara", Script.Garay},
{ "Geor", Script.Georgian},
{ "Glag", Script.Glagolitic},
{ "Gong", Script.GunjalaGondi},
@ -232,6 +240,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ "Gran", Script.Grantha},
{ "Grek", Script.Greek},
{ "Gujr", Script.Gujarati},
{ "Gukh", Script.GurungKhema},
{ "Guru", Script.Gurmukhi},
{ "Hang", Script.Hangul},
{ "Hani", Script.Han},
@ -254,6 +263,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ "Khoj", Script.Khojki},
{ "Kits", Script.KhitanSmallScript},
{ "Knda", Script.Kannada},
{ "Krai", Script.KiratRai},
{ "Kthi", Script.Kaithi},
{ "Lana", Script.TaiTham},
{ "Laoo", Script.Lao},
@ -290,6 +300,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ "Nshu", Script.Nushu},
{ "Ogam", Script.Ogham},
{ "Olck", Script.OlChiki},
{ "Onao", Script.OlOnal},
{ "Orkh", Script.OldTurkic},
{ "Orya", Script.Oriya},
{ "Osge", Script.Osage},
@ -321,6 +332,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ "Sora", Script.SoraSompeng},
{ "Soyo", Script.Soyombo},
{ "Sund", Script.Sundanese},
{ "Sunu", Script.Sunuwar},
{ "Sylo", Script.SylotiNagri},
{ "Syrc", Script.Syriac},
{ "Tagb", Script.Tagbanwa},
@ -338,7 +350,9 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ "Tibt", Script.Tibetan},
{ "Tirh", Script.Tirhuta},
{ "Tnsa", Script.Tangsa},
{ "Todr", Script.Todhri},
{ "Toto", Script.Toto},
{ "Tutg", Script.TuluTigalari},
{ "Ugar", Script.Ugaritic},
{ "Vaii", Script.Vai},
{ "Vith", Script.Vithkuqi},
@ -353,11 +367,11 @@ namespace Avalonia.Media.TextFormatting.Unicode
public static Script GetScript(string tag)
{
if (!s_tagToScript.TryGetValue(tag, out var value))
if(!s_tagToScript.ContainsKey(tag))
{
return Script.Unknown;
}
return value;
return s_tagToScript[tag];
}
private static readonly Dictionary<string, GeneralCategory> s_tagToGeneralCategory =
@ -404,11 +418,11 @@ namespace Avalonia.Media.TextFormatting.Unicode
public static GeneralCategory GetGeneralCategory(string tag)
{
if (!s_tagToGeneralCategory.TryGetValue(tag, out var value))
if(!s_tagToGeneralCategory.ContainsKey(tag))
{
return GeneralCategory.Other;
}
return value;
return s_tagToGeneralCategory[tag];
}
private static readonly Dictionary<string, LineBreakClass> s_tagToLineBreakClass =
@ -448,6 +462,9 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ "CB", LineBreakClass.ContingentBreak},
{ "XX", LineBreakClass.Unknown},
{ "AI", LineBreakClass.Ambiguous},
{ "AK", LineBreakClass.Aksara},
{ "AP", LineBreakClass.AksaraPrebase},
{ "AS", LineBreakClass.AksaraStart},
{ "BK", LineBreakClass.MandatoryBreak},
{ "CJ", LineBreakClass.ConditionalJapaneseStarter},
{ "CR", LineBreakClass.CarriageReturn},
@ -456,15 +473,17 @@ namespace Avalonia.Media.TextFormatting.Unicode
{ "SA", LineBreakClass.ComplexContext},
{ "SG", LineBreakClass.Surrogate},
{ "SP", LineBreakClass.Space},
{ "VF", LineBreakClass.ViramaFinal},
{ "VI", LineBreakClass.Virama},
};
public static LineBreakClass GetLineBreakClass(string tag)
{
if (!s_tagToLineBreakClass.TryGetValue(tag, out var value))
if(!s_tagToLineBreakClass.ContainsKey(tag))
{
return LineBreakClass.Unknown;
}
return value;
return s_tagToLineBreakClass[tag];
}
private static readonly Dictionary<string, BidiPairedBracketType> s_tagToBidiPairedBracketType =
@ -476,11 +495,11 @@ namespace Avalonia.Media.TextFormatting.Unicode
public static BidiPairedBracketType GetBidiPairedBracketType(string tag)
{
if (!s_tagToBidiPairedBracketType.TryGetValue(tag, out var value))
if(!s_tagToBidiPairedBracketType.ContainsKey(tag))
{
return BidiPairedBracketType.None;
}
return value;
return s_tagToBidiPairedBracketType[tag];
}
private static readonly Dictionary<string, BidiClass> s_tagToBidiClass =
@ -512,11 +531,11 @@ namespace Avalonia.Media.TextFormatting.Unicode
public static BidiClass GetBidiClass(string tag)
{
if (!s_tagToBidiClass.TryGetValue(tag, out var value))
if(!s_tagToBidiClass.ContainsKey(tag))
{
return BidiClass.LeftToRight;
}
return value;
return s_tagToBidiClass[tag];
}
}

7
src/Avalonia.Base/Media/TextFormatting/Unicode/Script.cs

@ -42,6 +42,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
Elbasan, //Elba
Elymaic, //Elym
Ethiopic, //Ethi
Garay, //Gara
Georgian, //Geor
Glagolitic, //Glag
GunjalaGondi, //Gong
@ -50,6 +51,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
Grantha, //Gran
Greek, //Grek
Gujarati, //Gujr
GurungKhema, //Gukh
Gurmukhi, //Guru
Hangul, //Hang
Han, //Hani
@ -72,6 +74,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
Khojki, //Khoj
KhitanSmallScript, //Kits
Kannada, //Knda
KiratRai, //Krai
Kaithi, //Kthi
TaiTham, //Lana
Lao, //Laoo
@ -108,6 +111,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
Nushu, //Nshu
Ogham, //Ogam
OlChiki, //Olck
OlOnal, //Onao
OldTurkic, //Orkh
Oriya, //Orya
Osage, //Osge
@ -139,6 +143,7 @@ namespace Avalonia.Media.TextFormatting.Unicode
SoraSompeng, //Sora
Soyombo, //Soyo
Sundanese, //Sund
Sunuwar, //Sunu
SylotiNagri, //Sylo
Syriac, //Syrc
Tagbanwa, //Tagb
@ -156,7 +161,9 @@ namespace Avalonia.Media.TextFormatting.Unicode
Tibetan, //Tibt
Tirhuta, //Tirh
Tangsa, //Tnsa
Todhri, //Todr
Toto, //Toto
TuluTigalari, //Tutg
Ugaritic, //Ugar
Vai, //Vaii
Vithkuqi, //Vith

11
src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.cs

@ -105,5 +105,16 @@ namespace Avalonia.Media.TextFormatting.Unicode
{
return (GraphemeBreakClass)GraphemeBreakTrie.Trie.Get(codepoint);
}
/// <summary>
/// Gets the EastAsianWidth class for the Unicode codepoint.
/// </summary>
/// <param name="codepoint">The codepoint in question.</param>
/// <returns>The code point's EastAsianWidth class.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static EastAsianWidthClass GetEastAsianWidthClass(uint codepoint)
{
return (EastAsianWidthClass)EastAsianWidthTrie.Trie.Get(codepoint);
}
}
}

3659
src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.trie.cs

File diff suppressed because it is too large

45
tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiAlgorithmTests.cs

@ -13,30 +13,21 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
{
_outputHelper = outputHelper;
}
[Fact(Skip = "Only run when the Unicode spec changes.")]
public void Should_Process()
{
var generator = new BiDiTestDataGenerator();
foreach(var testData in generator)
{
Assert.True(Run(testData));
}
}
private bool Run(BiDiTestData testData)
[ClassData(typeof(BiDiTestDataGenerator))]
[Theory(Skip = "Only run when the Unicode spec changes.")]
public void Should_Process(int lineNumber, BidiClass[] classes, sbyte paragraphEmbeddingLevel, int[] levels)
{
var bidi = new BidiAlgorithm();
// Run the algorithm...
ArraySlice<sbyte> resultLevels;
bidi.Process(
testData.Classes,
classes,
ArraySlice<BidiPairedBracketType>.Empty,
ArraySlice<int>.Empty,
testData.ParagraphEmbeddingLevel,
paragraphEmbeddingLevel,
false,
null,
null,
@ -46,17 +37,17 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
// Check the results match
var pass = true;
if (resultLevels.Length == testData.Levels.Length)
if (resultLevels.Length == levels.Length)
{
for (var i = 0; i < testData.Levels.Length; i++)
for (var i = 0; i < levels.Length; i++)
{
if (testData.Levels[i] == -1)
if (levels[i] == -1)
{
continue;
}
if (resultLevels[i] != testData.Levels[i])
if (resultLevels[i] != levels[i])
{
pass = false;
break;
@ -70,16 +61,14 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
if (!pass)
{
_outputHelper.WriteLine($"Failed line {testData.LineNumber}");
_outputHelper.WriteLine($" Data: {string.Join(" ", testData.Classes)}");
_outputHelper.WriteLine($" Embed Level: {testData.ParagraphEmbeddingLevel}");
_outputHelper.WriteLine($" Expected: {string.Join(" ", testData.Levels)}");
_outputHelper.WriteLine($"Failed line {lineNumber}");
_outputHelper.WriteLine($" Data: {string.Join(" ", classes)}");
_outputHelper.WriteLine($" Embed Level: {paragraphEmbeddingLevel}");
_outputHelper.WriteLine($" Expected: {string.Join(" ", levels)}");
_outputHelper.WriteLine($" Actual: {string.Join(" ", resultLevels)}");
return false;
}
return true;
Assert.True(pass);
}
}
}

26
tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTestDataGenerator.cs

@ -8,16 +8,16 @@ using Avalonia.Base.UnitTests.Media.TextFormatting;
namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
{
internal class BiDiClassTestDataGenerator : IEnumerable<BiDiClassData>
public class BiDiClassTestDataGenerator : IEnumerable<object[]>
{
private readonly List<BiDiClassData> _testData;
private readonly List<object[]> _testData;
public BiDiClassTestDataGenerator()
{
_testData = ReadData();
}
public IEnumerator<BiDiClassData> GetEnumerator()
public IEnumerator<object[]> GetEnumerator()
{
return _testData.GetEnumerator();
}
@ -27,9 +27,9 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
return GetEnumerator();
}
private static List<BiDiClassData> ReadData()
private static List<object[]> ReadData()
{
var testData = new List<BiDiClassData>();
var testData = new List<object[]>();
using (var client = new HttpClient())
{
@ -80,14 +80,14 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
// Parse field 4 - resolved levels
var resolvedOrder = fields[4].Split(' ').Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)).Select(x => Convert.ToInt32(x)).ToArray();
testData.Add(new BiDiClassData
testData.Add(new object[]
{
LineNumber = lineNumber,
CodePoints = codePoints,
ParagraphLevel = paragraphLevel,
ResolvedParagraphLevel = resolvedParagraphLevel,
ResolvedLevels = resolvedLevels,
ResolvedOrder = resolvedOrder
lineNumber,
codePoints,
paragraphLevel,
resolvedParagraphLevel,
resolvedLevels,
resolvedOrder
});
}
}
@ -100,7 +100,7 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
}
internal struct BiDiClassData
public struct BiDiClassData
{
public int LineNumber { get; set; }
public int[] CodePoints{ get; set; }

73
tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTests.cs

@ -15,30 +15,28 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
{
_outputHelper = outputHelper;
}
[Fact(Skip = "Only run when the Unicode spec changes.")]
public void Should_Resolve()
{
var generator = new BiDiClassTestDataGenerator();
foreach (var testData in generator)
{
Assert.True(Run(testData));
}
}
private bool Run(BiDiClassData t)
[Theory(Skip = "Only run when the Unicode spec changes.")]
[ClassData(typeof(BiDiClassTestDataGenerator))]
public void Should_Resolve(
int lineNumber,
int[] codePoints,
sbyte paragraphLevel,
sbyte resolvedParagraphLevel,
sbyte[] resolvedLevels,
int[] resolvedOrder)
{
var bidi = new BidiAlgorithm();
var bidiData = new BidiData { ParagraphEmbeddingLevel = t.ParagraphLevel };
var text = Encoding.UTF32.GetString(MemoryMarshal.Cast<int, byte>(t.CodePoints).ToArray());
var bidiData = new BidiData { ParagraphEmbeddingLevel = paragraphLevel };
var text = Encoding.UTF32.GetString(MemoryMarshal.Cast<int, byte>(codePoints).ToArray());
// Append
bidiData.Append(text);
// Act
for (int i = 0; i < 10; i++)
for (var i = 0; i < 10; i++)
{
bidi.Process(bidiData);
}
@ -46,51 +44,20 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
var resultLevels = bidi.ResolvedLevels;
var resultParagraphLevel = bidi.ResolvedParagraphEmbeddingLevel;
// Assert
var passed = true;
Assert.Equal(resolvedParagraphLevel, resultParagraphLevel);
if (t.ResolvedParagraphLevel != resultParagraphLevel)
for (var i = 0; i < resolvedLevels.Length; i++)
{
return false;
}
for (var i = 0; i < t.ResolvedLevels.Length; i++)
{
if (t.ResolvedLevels[i] == -1)
if (resolvedLevels[i] == -1)
{
continue;
}
if (t.ResolvedLevels[i] != resultLevels[i])
{
passed = false;
break;
}
}
var expectedLevel = resolvedLevels[i];
var actualLevel = resultLevels[i];
if (passed)
{
return true;
Assert.Equal(expectedLevel, actualLevel);
}
_outputHelper.WriteLine($"Failed line {t.LineNumber}");
_outputHelper.WriteLine(
$" Code Points: {string.Join(" ", t.CodePoints.Select(x => x.ToString("X4")))}");
_outputHelper.WriteLine(
$" Pair Bracket Types: {string.Join(" ", bidiData.PairedBracketTypes.Select(x => " " + x.ToString()))}");
_outputHelper.WriteLine(
$" Pair Bracket Values: {string.Join(" ", bidiData.PairedBracketValues.Select(x => x.ToString("X4")))}");
_outputHelper.WriteLine($" Embed Level: {t.ParagraphLevel}");
_outputHelper.WriteLine($" Expected Embed Level: {t.ResolvedParagraphLevel}");
_outputHelper.WriteLine($" Actual Embed Level: {resultParagraphLevel}");
_outputHelper.WriteLine($" Directionality: {string.Join(" ", bidiData.Classes)}");
_outputHelper.WriteLine($" Expected Levels: {string.Join(" ", t.ResolvedLevels)}");
_outputHelper.WriteLine($" Actual Levels: {string.Join(" ", resultLevels)}");
return false;
}
}
}

36
tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiTestDataGenerator.cs

@ -9,16 +9,11 @@ using Avalonia.Media.TextFormatting.Unicode;
namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
{
internal class BiDiTestDataGenerator : IEnumerable<BiDiTestData>
internal class BiDiTestDataGenerator : IEnumerable<object[]>
{
private readonly List<BiDiTestData> _testData;
private readonly List<object[]> _testData = ReadTestData();
public BiDiTestDataGenerator()
{
_testData = ReadTestData();
}
public IEnumerator<BiDiTestData> GetEnumerator()
public IEnumerator<object[]> GetEnumerator()
{
return _testData.GetEnumerator();
}
@ -28,9 +23,9 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
return GetEnumerator();
}
private static List<BiDiTestData> ReadTestData()
private static List<object[]> ReadTestData()
{
var testData = new List<BiDiTestData>();
var testData = new List<object[]>();
using (var client = new HttpClient())
{
@ -122,13 +117,12 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
throw new NotSupportedException();
}
testData.Add(new BiDiTestData
{
LineNumber = lineNumber,
Classes = directions,
ParagraphEmbeddingLevel = paragraphEmbeddingLevel,
Levels = levels
});
testData.Add([
lineNumber,
directions,
paragraphEmbeddingLevel,
levels
]);
break;
}
@ -140,12 +134,4 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
return testData;
}
}
internal class BiDiTestData
{
public int LineNumber { get; set; }
public BidiClass[] Classes { get; set; }
public sbyte ParagraphEmbeddingLevel { get; set; }
public int[] Levels { get; set; }
}
}

130
tests/Avalonia.Base.UnitTests/Media/TextFormatting/EastAsianWidthClassTrieGenerator.cs

@ -0,0 +1,130 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Text.RegularExpressions;
using Avalonia.Media.TextFormatting.Unicode;
namespace Avalonia.Base.UnitTests.Media.TextFormatting;
internal static class EastAsianWidthClassTrieGenerator
{
public static UnicodeTrie Execute(out List<(uint start, uint end, EastAsianWidthClass)> values)
{
if (!Directory.Exists("Generated"))
{
Directory.CreateDirectory("Generated");
}
var trie = GenerateTrie(out values);
UnicodeDataGenerator.GenerateTrieClass("EastAsianWidth", trie);
return trie;
}
private static UnicodeTrie GenerateTrie(out List<(uint start, uint end, EastAsianWidthClass)> values)
{
var trieBuilder = new UnicodeTrieBuilder((uint)EastAsianWidthClass.Neutral);
var data = ReadData(Path.Combine(UnicodeDataGenerator.Ucd, "EastAsianWidth.txt"));
values = new List<(uint start, uint end, EastAsianWidthClass)>(data.Count);
foreach (var (start, end, tag) in data)
{
EastAsianWidthClass value;
switch (tag.Replace("_", ""))
{
case "A":
value = EastAsianWidthClass.Ambiguous;
break;
case "F":
value = EastAsianWidthClass.Fullwidth;
break;
case "H":
value = EastAsianWidthClass.Halfwidth;
break;
case "N":
value = EastAsianWidthClass.Neutral;
break;
case "Na":
value = EastAsianWidthClass.Narrow;
break;
case "W":
value = EastAsianWidthClass.Wide;
break;
default:
continue;
}
if (start == end)
{
trieBuilder.Set(start, (uint)value);
}
else
{
trieBuilder.SetRange(start, end, (uint)value);
}
values.Add(((uint)start, (uint)end, value));
}
return trieBuilder.Freeze();
}
private static List<(int, int, string)> ReadData(string file)
{
var data = new List<(int, int, string)>();
var rx = new Regex(@"([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s*;\s*(\w+)\s*#.*", RegexOptions.Compiled);
using (var client = new HttpClient())
{
using (var result = client.GetAsync(file).GetAwaiter().GetResult())
{
if (!result.IsSuccessStatusCode)
{
return data;
}
using (var stream = result.Content.ReadAsStreamAsync().GetAwaiter().GetResult())
using (var reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (string.IsNullOrEmpty(line))
{
continue;
}
var match = rx.Match(line);
if (!match.Success)
{
continue;
}
var start = Convert.ToInt32(match.Groups[1].Value, 16);
var end = start;
if (!string.IsNullOrEmpty(match.Groups[2].Value))
{
end = Convert.ToInt32(match.Groups[2].Value, 16);
}
var breakType = match.Groups[3].Value;
data.Add((start, end, breakType));
}
}
}
}
return data;
}
}

23
tests/Avalonia.Base.UnitTests/Media/TextFormatting/EastAsianWidthClassTrieGeneratorTests.cs

@ -0,0 +1,23 @@
using Xunit;
namespace Avalonia.Base.UnitTests.Media.TextFormatting
{
public class EastAsianWidthClassTrieGeneratorTests
{
[Fact(Skip = "Only run when we update the trie.")]
public void Should_Generate()
{
UnicodeEnumsGenerator.CreateEastAsianWidthClassEnum();
var trie = EastAsianWidthClassTrieGenerator.Execute(out var values);
foreach (var (start, end, value) in values)
{
var expected = (uint)value;
var actual = trie.Get(start);
Assert.Equal(expected, actual);
}
}
}
}

37
tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGeneratorTests.cs

@ -1,7 +1,4 @@
using System;
using System.Runtime.InteropServices;
using System.Text;
using Avalonia.Media.TextFormatting;
using Avalonia.Media.TextFormatting.Unicode;
using Avalonia.Visuals.UnitTests.Media.TextFormatting;
using Xunit;
@ -22,22 +19,10 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
_outputHelper = outputHelper;
}
[Fact(Skip = "Only run when we update the trie.")]
public void Should_Enumerate()
[ClassData(typeof(GraphemeBreakTestDataGenerator))]
[Theory(Skip = "Only run when we update the trie.")]
public void Should_Enumerate(string line, int lineNumber, string grapheme, string text)
{
var generator = new GraphemeBreakTestDataGenerator();
foreach (var testData in generator)
{
Assert.True(Run(testData));
}
}
private bool Run(GraphemeBreakData t)
{
var text = Encoding.UTF32.GetString(MemoryMarshal.Cast<int, byte>(t.Codepoints).ToArray());
var grapheme = Encoding.UTF32.GetString(MemoryMarshal.Cast<int, byte>(t.Grapheme).ToArray()).AsSpan();
var enumerator = new GraphemeEnumerator(text);
enumerator.MoveNext(out var g);
@ -52,7 +37,7 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
{
var a = grapheme[i];
var b = actual[i];
if (a != b)
{
pass = false;
@ -60,21 +45,17 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
break;
}
}
}
}
if (!pass)
{
_outputHelper.WriteLine($"Failed line {t.LineNumber}");
_outputHelper.WriteLine($"Failed line {lineNumber}");
_outputHelper.WriteLine($" Text: {text}");
_outputHelper.WriteLine($" Codepoints: {string.Join(" ", t.Codepoints)}");
_outputHelper.WriteLine($" Grapheme: {string.Join(" ", t.Grapheme)}");
_outputHelper.WriteLine($" Line: {t.Line}");
_outputHelper.WriteLine($" Grapheme: {grapheme}");
_outputHelper.WriteLine($" Line: {line}");
return false;
Assert.True(false);
}
return true;
}
[Fact(Skip = "Only run when we update the trie.")]

36
tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakTestDataGenerator.cs

@ -4,20 +4,17 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Text;
using Avalonia.Base.UnitTests.Media.TextFormatting;
namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
{
internal class GraphemeBreakTestDataGenerator : IEnumerable<GraphemeBreakData>
internal class GraphemeBreakTestDataGenerator : IEnumerable<object[]>
{
private readonly List<GraphemeBreakData> _testData;
private readonly List<object[]> _testData = ReadData();
public GraphemeBreakTestDataGenerator()
{
_testData = ReadData();
}
public IEnumerator<GraphemeBreakData> GetEnumerator()
public IEnumerator<object[]> GetEnumerator()
{
return _testData.GetEnumerator();
}
@ -27,9 +24,9 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
return GetEnumerator();
}
private static List<GraphemeBreakData> ReadData()
private static List<object[]> ReadData()
{
var testData = new List<GraphemeBreakData>();
var testData = new List<object[]>();
var url = Path.Combine(UnicodeDataGenerator.Ucd, "auxiliary/GraphemeBreakTest.txt");
@ -82,14 +79,15 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
codepoints.AddRange(remaining);
}
var data = new GraphemeBreakData
var data = new object[]
{
Line = line,
LineNumber = lineNumber,
Grapheme = grapheme,
Codepoints = codepoints.ToArray()
line, lineNumber,
Encoding.UTF32.GetString(MemoryMarshal.Cast<int, byte>(grapheme.ToArray()).ToArray()),
Encoding.UTF32.GetString(MemoryMarshal.Cast<int, byte>(codepoints.ToArray()).ToArray())
};
testData.Add(data);
}
}
@ -97,12 +95,4 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting
return testData;
}
}
internal struct GraphemeBreakData
{
public string Line { get; set; }
public int LineNumber { get; set; }
public int[] Grapheme { get; set; }
public int[] Codepoints{ get; set; }
}
}

170
tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumuratorTests.cs → tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs

@ -4,22 +4,22 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using Avalonia.Media.TextFormatting;
using Avalonia.Media.TextFormatting.Unicode;
using Xunit;
using Xunit.Abstractions;
using static Avalonia.Media.TextFormatting.Unicode.LineBreakEnumerator;
namespace Avalonia.Base.UnitTests.Media.TextFormatting
{
public class LineBreakEnumeratorTests
{
private readonly ITestOutputHelper _outputHelper;
public LineBreakEnumeratorTests(ITestOutputHelper outputHelper)
{
_outputHelper = outputHelper;
}
[Fact]
public void BasicLatinTest()
{
@ -53,6 +53,26 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
Assert.False(lineBreaker.MoveNext(out lineBreak));
}
[InlineData("Hello\nWorld", 5, 6)]
[InlineData("Hello\rWorld", 5, 6 )]
[InlineData("Hello\r\nWorld", 5 , 7)]
[Theory]
public void ShouldFindMandatoryBreaks(string text, int positionMeasure, int positionWrap)
{
var lineBreaker = new LineBreakEnumerator(text);
var breaks = GetBreaks(lineBreaker);
Assert.Equal(2, breaks.Count);
var firstBreak = breaks[0];
Assert.True(firstBreak.Required);
Assert.Equal(positionMeasure, firstBreak.PositionMeasure);
Assert.Equal(positionWrap, firstBreak.PositionWrap);
}
[Fact]
public void ForwardTextWithOuterWhitespace()
@ -69,47 +89,21 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
Assert.Equal(21, positionsF[3].PositionMeasure);
}
private static List<LineBreak> GetBreaks(LineBreakEnumerator lineBreaker)
{
var breaks = new List<LineBreak>();
while (lineBreaker.MoveNext(out var lineBreak))
{
breaks.Add(lineBreak);
}
return breaks;
}
[Fact]
public void ForwardTest()
{
var lineBreaker = new LineBreakEnumerator("Apples Pears Bananas");
var positionsF = GetBreaks(lineBreaker);
Assert.Equal(7, positionsF[0].PositionWrap);
Assert.Equal(6, positionsF[0].PositionMeasure);
Assert.Equal(13, positionsF[1].PositionWrap);
Assert.Equal(12, positionsF[1].PositionMeasure);
Assert.Equal(20, positionsF[2].PositionWrap);
Assert.Equal(20, positionsF[2].PositionMeasure);
}
[Theory(Skip = "Only run when the Unicode spec changes.")]
[Theory(Skip = "Only runs when the spec changes")]
[ClassData(typeof(LineBreakTestDataGenerator))]
public void ShouldFindBreaks(int lineNumber, int[] codePoints, int[] breakPoints)
public void ShouldFindBreaks(int lineNumber, int[] codePoints, int[] breakPoints, string rules)
{
var text = string.Join(null, codePoints.Select(char.ConvertFromUtf32));
var lineBreaker = new LineBreakEnumerator(text);
var foundBreaks = new List<int>();
while (lineBreaker.MoveNext(out var lineBreak))
{
foundBreaks.Add(lineBreak.PositionWrap);
}
// Check the same
var pass = true;
@ -137,13 +131,26 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
_outputHelper.WriteLine($" Actual Breaks: {string.Join(" ", foundBreaks)}");
_outputHelper.WriteLine($" Text: {text}");
_outputHelper.WriteLine($" Char Props: {string.Join(" ", codePoints.Select(x => new Codepoint((uint)x).LineBreakClass))}");
_outputHelper.WriteLine($" Rules: {rules}");
_outputHelper.WriteLine("");
}
Assert.True(pass);
}
private class LineBreakTestDataGenerator : IEnumerable<object[]>
private static List<LineBreak> GetBreaks(LineBreakEnumerator lineBreaker)
{
var breaks = new List<LineBreak>();
while (lineBreaker.MoveNext(out var lineBreak))
{
breaks.Add(lineBreak);
}
return breaks;
}
public class LineBreakTestDataGenerator : IEnumerable<object[]>
{
private readonly List<object[]> _testData;
@ -192,57 +199,21 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
break;
}
// Get the line, remove comments
line = line.Split('#')[0].Trim();
var segments = line.Split('#');
// Ignore blank/comment only lines
if (string.IsNullOrWhiteSpace(line))
if (string.IsNullOrWhiteSpace(segments[0]))
{
lineNumber++;
continue;
}
var codePoints = new List<int>();
var breakPoints = new List<int>();
// Parse the test
var p = 0;
var lineData = ReadLineData(segments[0].Trim());
while (p < line.Length)
{
// Ignore white space
if (char.IsWhiteSpace(line[p]))
{
p++;
continue;
}
if (line[p] == '×')
{
p++;
continue;
}
if (line[p] == '÷')
{
breakPoints.Add(codePoints.Select(x=> x > ushort.MaxValue ? 2 : 1).Sum());
p++;
continue;
}
var codePointPos = p;
while (p < line.Length && IsHexDigit(line[p]))
{
p++;
}
var codePointStr = line.Substring(codePointPos, p - codePointPos);
var codePoint = Convert.ToInt32(codePointStr, 16);
codePoints.Add(codePoint);
}
tests.Add(new object[] { lineNumber, codePoints.ToArray(), breakPoints.ToArray() });
tests.Add([lineNumber, lineData.Item1, lineData.Item2, segments[1]]);
lineNumber++;
}
@ -252,6 +223,51 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
return tests;
}
public static (int[], int[]) ReadLineData(string line)
{
var codePoints = new List<int>();
var breakPoints = new List<int>();
// Parse the test
var p = 0;
while (p < line.Length)
{
// Ignore white space
if (char.IsWhiteSpace(line[p]))
{
p++;
continue;
}
if (line[p] == '×')
{
p++;
continue;
}
if (line[p] == '÷')
{
breakPoints.Add(codePoints.Select(x => x > ushort.MaxValue ? 2 : 1).Sum());
p++;
continue;
}
var codePointPos = p;
while (p < line.Length && IsHexDigit(line[p]))
{
p++;
}
var codePointStr = line.Substring(codePointPos, p - codePointPos);
var codePoint = Convert.ToInt32(codePointStr, 16);
codePoints.Add(codePoint);
}
return (codePoints.ToArray(), breakPoints.ToArray());
}
private static bool IsHexDigit(char ch)
{
return char.IsDigit(ch) || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f');

6
tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs

@ -9,7 +9,7 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
{
internal static class UnicodeDataGenerator
{
public const string Ucd = "https://www.unicode.org/Public/15.0.0/ucd/";
public const string Ucd = "https://www.unicode.org/Public/16.0.0/ucd/";
public static UnicodeTrie GenerateBiDiTrie(out BiDiDataEntries biDiDataEntries, out Dictionary<int, BiDiDataItem> biDiData)
{
@ -198,7 +198,7 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
return unicodeData;
}
private static Dictionary<string, int> CreateTagToIndexMappings(IReadOnlyList<DataEntry> entries)
public static Dictionary<string, int> CreateTagToIndexMappings(IReadOnlyList<DataEntry> entries)
{
var mappings = new Dictionary<string, int>();
@ -210,7 +210,7 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
return mappings;
}
private static Dictionary<string, int> CreateNameToIndexMappings(IReadOnlyList<DataEntry> entries)
public static Dictionary<string, int> CreateNameToIndexMappings(IReadOnlyList<DataEntry> entries)
{
var mappings = new Dictionary<string, int>();

31
tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeEnumsGenerator.cs

@ -40,6 +40,33 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
return entries;
}
public static List<DataEntry> CreateEastAsianWidthClassEnum()
{
var entries = new List<DataEntry>();
ParseDataEntries("# East_Asian_Width (ea)", entries);
using (var stream = File.Create("Generated\\EastAsianWidthClass.cs"))
using (var writer = new StreamWriter(stream))
{
writer.WriteLine("namespace Avalonia.Media.TextFormatting.Unicode");
writer.WriteLine("{");
writer.WriteLine(" public enum EastAsianWidthClass");
writer.WriteLine(" {");
foreach (var entry in entries)
{
writer.WriteLine(" " + entry.Name.Replace("_", "") + ", //" + entry.Tag +
(string.IsNullOrEmpty(entry.Comment) ? string.Empty : "#" + entry.Comment));
}
writer.WriteLine(" }");
writer.WriteLine("}");
}
return entries;
}
public static List<DataEntry> CreateGeneralCategoryEnum()
{
var entries = new List<DataEntry> { new DataEntry("Other", "C", " Cc | Cf | Cn | Co | Cs") };
@ -320,9 +347,9 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
WritePropertyValueAlias(writer, unicodeDataEntries.LineBreakClasses, "LineBreakClass", "Unknown");
WritePropertyValueAlias(writer, biDiDataEntries.PairedBracketTypes, "BiDiPairedBracketType", "None");
WritePropertyValueAlias(writer, biDiDataEntries.PairedBracketTypes, "BidiPairedBracketType", "None");
WritePropertyValueAlias(writer, biDiDataEntries.BiDiClasses, "BiDiClass", "LeftToRight");
WritePropertyValueAlias(writer, biDiDataEntries.BiDiClasses, "BidiClass", "LeftToRight");
writer.WriteLine(" }");
writer.WriteLine("}");

Loading…
Cancel
Save