Coverage Report

Created: 2025-08-11 06:44

/src/mpv/misc/codepoint_width.c
Line
Count
Source (jump to first uncovered line)
1
#include "codepoint_width.h"
2
3
#include <stdbool.h>
4
#include <stdint.h>
5
6
typedef uint_least32_t char32_t;
7
8
// Generated by GraphemeTableGen (https://github.com/microsoft/terminal/blob/0961a77a5aec003e9f79d388f8e7bffb9a550cdb/src/tools/GraphemeTableGen/Program.cs)
9
// on 2025-02-25T07:26:37Z, from Unicode 16.0.0, 9224 bytes
10
// Copyright (c) Microsoft Corporation.
11
// Licensed under the MIT license.
12
13
// Manually adjusted for C compatibility
14
// To generate:
15
// 0. Install .NET 8.0
16
// 1. Download the tool from: https://github.com/microsoft/terminal/tree/main/src/tools/GraphemeTableGen
17
// 2. Download the Unicode data from: https://www.unicode.org/Public/UCD/latest/ucdxml/ucd.nounihan.grouped.zip
18
// 3. Build the project: `dotnet build GraphemeTableGen.csproj`
19
// 4. Run the tool: `./GraphemeTableGen ucd.nounihan.grouped.xml`
20
// 5. Copy the generated code and adjust it for C compatibility by replacing `constexpr` and `auto` keywords.
21
22
// clang-format off
23
static const uint16_t s_stage0[] = {
24
    0x0000, 0x0020, 0x0040, 0x0060, 0x0080, 0x009f, 0x00bf, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca,
25
    0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00d8, 0x00f8, 0x010a, 0x010e, 0x010b, 0x0108, 0x0113, 0x0133, 0x0153, 0x0153, 0x0153, 0x016f,
26
    0x018f, 0x01a7, 0x01c7, 0x01e7, 0x0133, 0x0133, 0x0205, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0221, 0x0236, 0x00ca, 0x00ca,
27
    0x0256, 0x0276, 0x0133, 0x0133, 0x0133, 0x028b, 0x02ab, 0x02b9, 0x0133, 0x02cc, 0x02ea, 0x0302, 0x0322, 0x033f, 0x035f, 0x037f,
28
    0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca,
29
    0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x039f,
30
    0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca,
31
    0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x039f,
32
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
33
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
34
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
35
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
36
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
37
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
38
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
39
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
40
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
41
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
42
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
43
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
44
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
45
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
46
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
47
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
48
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
49
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
50
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
51
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
52
    0x03bf, 0x03c7, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
53
    0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133,
54
    0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153,
55
    0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x03e7,
56
    0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153,
57
    0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x03e7,
58
};
59
static const uint16_t s_stage1[] = {
60
    0x0000, 0x0004, 0x000c, 0x0014, 0x001c, 0x0024, 0x002a, 0x0031, 0x002a, 0x0037, 0x002a, 0x003f, 0x0047, 0x0049, 0x004f, 0x0057, 0x005f, 0x0065, 0x006d, 0x002a, 0x002a, 0x002a, 0x0073, 0x007b, 0x0083, 0x008a, 0x002a, 0x0091, 0x0098, 0x009f, 0x00a3, 0x00aa,
61
    0x00b2, 0x00b8, 0x00be, 0x00c5, 0x00cd, 0x00d5, 0x00dd, 0x00e5, 0x00ed, 0x00f5, 0x00fd, 0x0105, 0x010d, 0x0115, 0x011d, 0x0125, 0x012d, 0x0135, 0x013d, 0x0145, 0x014d, 0x0155, 0x015d, 0x0164, 0x016b, 0x0173, 0x0175, 0x017d, 0x0182, 0x018a, 0x0192, 0x019a,
62
    0x019d, 0x01a5, 0x01ad, 0x002a, 0x01b5, 0x01b9, 0x01bd, 0x01c2, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x01ca, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x01d0, 0x01d7, 0x01de, 0x01e6,
63
    0x01ed, 0x002a, 0x01f5, 0x002a, 0x01fb, 0x002a, 0x002a, 0x002a, 0x0203, 0x0209, 0x0211, 0x0218, 0x0220, 0x0228, 0x0230, 0x0236, 0x023d, 0x002a, 0x002a, 0x0244, 0x002a, 0x002a, 0x002a, 0x0047, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
64
    0x024c, 0x0254, 0x025c, 0x0262, 0x026a, 0x0272, 0x027a, 0x0282, 0x028a, 0x0292, 0x029a, 0x002a, 0x02a2, 0x002a, 0x02a9, 0x02b0, 0x002a, 0x02b8, 0x02bc, 0x02c4, 0x002a, 0x002a, 0x02cc, 0x02d4, 0x02dc, 0x02e4, 0x02ec, 0x02f4, 0x02fc, 0x0304, 0x030c, 0x002a,
65
    0x002a, 0x002a, 0x002a, 0x0314, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x031c, 0x0322, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0326, 0x002a, 0x032d, 0x002a, 0x0043, 0x002a, 0x002a, 0x0335, 0x0339, 0x0341, 0x0341, 0x0341, 0x0347, 0x034d,
66
    0x0355, 0x035b, 0x0341, 0x0363, 0x0341, 0x036a, 0x036e, 0x0374, 0x037b, 0x0381, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341,
67
    0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0388, 0x0390, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0393, 0x039b, 0x017f, 0x002a, 0x002a, 0x002a, 0x002a, 0x03a3, 0x002a, 0x03ab, 0x03b3, 0x03bb, 0x03c3, 0x03cb, 0x03d3,
68
    0x03d8, 0x03e0, 0x03e8, 0x03f0, 0x002a, 0x002a, 0x002a, 0x03f7, 0x03ff, 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x03ff, 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x03ff, 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x03ff, 0x0400, 0x0401,
69
    0x0402, 0x0403, 0x0404, 0x0405, 0x03ff, 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x03ff, 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x040c, 0x0414, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
70
    0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc,
71
    0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x041c, 0x002a, 0x002a, 0x002a, 0x002a,
72
    0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0424, 0x042a, 0x002a, 0x032d, 0x0355, 0x0432, 0x0437, 0x043b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0443, 0x002a, 0x002a, 0x002a, 0x044b, 0x002a, 0x0450, 0x002a, 0x002a, 0x002a,
73
    0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0458, 0x002a, 0x002a, 0x01f1, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0460, 0x0465, 0x002a, 0x002a, 0x002a,
74
    0x002a, 0x046b, 0x0471, 0x002a, 0x00a7, 0x0479, 0x002a, 0x0481, 0x0489, 0x0491, 0x0499, 0x04a1, 0x04a9, 0x04b1, 0x04b9, 0x04bc, 0x04c4, 0x002a, 0x04c9, 0x04d1, 0x04d9, 0x04e0, 0x04e8, 0x04ed, 0x04f5, 0x04f9, 0x0501, 0x002a, 0x002a, 0x0504, 0x050c, 0x0510,
75
    0x0518, 0x051b, 0x002a, 0x0522, 0x002a, 0x002a, 0x002a, 0x0528, 0x002a, 0x002a, 0x002a, 0x0530, 0x0538, 0x002a, 0x053e, 0x0546, 0x054e, 0x0556, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x055a, 0x002a, 0x0562, 0x002a, 0x0569, 0x0571, 0x0578, 0x002a, 0x002a,
76
    0x002a, 0x002a, 0x057b, 0x0583, 0x058b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0211, 0x0593, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
77
    0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0598, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
78
    0x002a, 0x059e, 0x05a5, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x05ac, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x05b3, 0x05ba, 0x05be, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341,
79
    0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x05c6, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341,
80
    0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x05ce, 0x05d6, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
81
    0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x05d8, 0x0341, 0x0341, 0x0341, 0x0341, 0x05e0, 0x05e7, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x05ed, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
82
    0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x05f5, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
83
    0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x05fd, 0x0605, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0609, 0x0611, 0x002a, 0x002a, 0x0619, 0x002a, 0x002a, 0x0341, 0x0621, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
84
    0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0629, 0x0631, 0x0639, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
85
    0x002a, 0x002a, 0x0641, 0x002a, 0x0648, 0x002a, 0x05a5, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x064b, 0x0651, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0651, 0x002a, 0x002a, 0x002a, 0x0657, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
86
    0x002a, 0x002a, 0x065d, 0x002a, 0x0665, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x066d,
87
    0x066e, 0x066e, 0x0675, 0x067d, 0x0683, 0x068b, 0x0691, 0x0699, 0x06a1, 0x066e, 0x066e, 0x06a9, 0x06b0, 0x06b8, 0x06bf, 0x06c7, 0x06cf, 0x06d0, 0x06d1, 0x06d9, 0x06e1, 0x06e9, 0x06ee, 0x06d0, 0x06f6, 0x06d0, 0x06fe, 0x002a, 0x0706, 0x002a, 0x070e, 0x0716,
88
    0x071d, 0x0724, 0x066e, 0x072c, 0x0734, 0x06d0, 0x06d0, 0x066e, 0x073c, 0x0744, 0x074c, 0x002a, 0x002a, 0x002a, 0x002a, 0x066e, 0x066e, 0x066e, 0x066e, 0x066e, 0x066e, 0x066e, 0x066e, 0x066e, 0x066e, 0x066e, 0x066e, 0x066e, 0x066e, 0x066e, 0x0754, 0x0341,
89
    0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0341, 0x0342, 0x075c,
90
    0x0047, 0x0764, 0x0764, 0x0047, 0x0047, 0x0047, 0x076c, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764,
91
    0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x0764, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc,
92
    0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x02bc, 0x0774,
93
};
94
static const uint16_t s_stage2[] = {
95
    0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0008, 0x0008,
96
    0x0008, 0x0008, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000,
97
    0x0011, 0x0018, 0x0020, 0x0022, 0x002a, 0x0008, 0x0029, 0x0030,
98
    0x0036, 0x003e, 0x0040, 0x0047, 0x004c, 0x0008, 0x004a, 0x002d,
99
    0x004e, 0x002d, 0x0053, 0x0029, 0x005b, 0x0063, 0x0034, 0x0008,
100
    0x004e, 0x002d, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
101
    0x0008, 0x0008, 0x002a, 0x006b, 0x0049, 0x0008, 0x0008, 0x0008,
102
    0x0008, 0x004c, 0x0008, 0x004c, 0x0008, 0x0008, 0x0008, 0x0072,
103
    0x005a, 0x0079, 0x0081, 0x0008, 0x0008, 0x0008, 0x0008, 0x0089,
104
    0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0008,
105
    0x0008, 0x0091, 0x0092, 0x0098, 0x0028, 0x0091, 0x0092, 0x0098,
106
    0x0028, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x004c,
107
    0x0008, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x004c,
108
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x00a0, 0x00a6, 0x0008,
109
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x00ad, 0x0089, 0x0089,
110
    0x0089, 0x0089, 0x00af, 0x00b5, 0x0008, 0x0008, 0x0008, 0x0008,
111
    0x0008, 0x0008, 0x0008, 0x00bd, 0x0008, 0x0089, 0x00c5, 0x0008,
112
    0x0008, 0x0008, 0x0008, 0x00a0, 0x0089, 0x0089, 0x0008, 0x0008,
113
    0x00c9, 0x0008, 0x0008, 0x00a8, 0x00d1, 0x00d8, 0x00df, 0x0008,
114
    0x0008, 0x00e5, 0x00c8, 0x0008, 0x0008, 0x0008, 0x0089, 0x0089,
115
    0x00a5, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x00a8,
116
    0x0089, 0x00c9, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x00a0,
117
    0x00a4, 0x00ed, 0x0008, 0x0008, 0x00a8, 0x00f5, 0x00f9, 0x00a2,
118
    0x0008, 0x0008, 0x0008, 0x00fd, 0x0008, 0x0008, 0x0008, 0x0008,
119
    0x0105, 0x0089, 0x0008, 0x0008, 0x0008, 0x0008, 0x00ac, 0x0089,
120
    0x0089, 0x010c, 0x0089, 0x0089, 0x0089, 0x0111, 0x0008, 0x0115,
121
    0x011a, 0x011a, 0x011a, 0x011a, 0x0120, 0x0127, 0x012e, 0x00ad,
122
    0x011a, 0x0136, 0x0008, 0x0008, 0x011a, 0x013d, 0x0008, 0x0115,
123
    0x011a, 0x011a, 0x0145, 0x014c, 0x0152, 0x0159, 0x0160, 0x0166,
124
    0x016e, 0x0136, 0x0008, 0x0175, 0x0177, 0x017e, 0x0008, 0x0008,
125
    0x0008, 0x0008, 0x0008, 0x0008, 0x0182, 0x0189, 0x0190, 0x00c8,
126
    0x0008, 0x0008, 0x0008, 0x0194, 0x0008, 0x017e, 0x0008, 0x0115,
127
    0x011a, 0x011a, 0x0145, 0x019c, 0x0152, 0x01a4, 0x01ab, 0x0008,
128
    0x0008, 0x0136, 0x0008, 0x0008, 0x01b2, 0x013d, 0x0008, 0x0115,
129
    0x011a, 0x011a, 0x0145, 0x019c, 0x01ba, 0x0159, 0x0160, 0x01c2,
130
    0x016e, 0x0136, 0x0008, 0x01ca, 0x0008, 0x01d0, 0x0008, 0x0008,
131
    0x0008, 0x0008, 0x0008, 0x0008, 0x01d3, 0x01db, 0x01e2, 0x0166,
132
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x01ea, 0x0008, 0x0115,
133
    0x011a, 0x011a, 0x0145, 0x011a, 0x01f2, 0x01f9, 0x0200, 0x0206,
134
    0x020e, 0x0136, 0x0008, 0x0008, 0x0008, 0x013d, 0x0008, 0x0008,
135
    0x0008, 0x0008, 0x0008, 0x0008, 0x0212, 0x021a, 0x0221, 0x0227,
136
    0x0008, 0x0136, 0x0008, 0x016a, 0x0008, 0x022f, 0x0008, 0x0115,
137
    0x011a, 0x011a, 0x011a, 0x011a, 0x0237, 0x023e, 0x0245, 0x0166,
138
    0x0008, 0x0136, 0x0008, 0x0008, 0x0008, 0x013d, 0x0008, 0x0008,
139
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x024c, 0x0253, 0x025b,
140
    0x0008, 0x0008, 0x0263, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
141
    0x0008, 0x026a, 0x00a5, 0x00ca, 0x008a, 0x0008, 0x0008, 0x0008,
142
    0x0008, 0x0008, 0x0008, 0x026a, 0x00a3, 0x0008, 0x008a, 0x0008,
143
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x00a6, 0x0008, 0x0008,
144
    0x0178, 0x024d, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
145
    0x00ad, 0x0128, 0x00b0, 0x00a9, 0x0089, 0x00ad, 0x0089, 0x0089,
146
    0x0089, 0x00a3, 0x0177, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
147
    0x0008, 0x0008, 0x00a9, 0x0271, 0x0279, 0x0008, 0x0008, 0x01d3,
148
    0x027e, 0x00c9, 0x0008, 0x00e0, 0x0008, 0x0286, 0x00ed, 0x0008,
149
    0x00ed, 0x0008, 0x0008, 0x0008, 0x0008, 0x028e, 0x028e, 0x028e,
150
    0x028e, 0x028e, 0x028e, 0x028e, 0x028e, 0x0296, 0x0296, 0x0296,
151
    0x0296, 0x0296, 0x029e, 0x029e, 0x029e, 0x029e, 0x029e, 0x029e,
152
    0x029e, 0x029e, 0x0008, 0x0008, 0x0008, 0x00a9, 0x0008, 0x0008,
153
    0x0008, 0x0008, 0x02a6, 0x0008, 0x0008, 0x0008, 0x02ac, 0x0008,
154
    0x0008, 0x0136, 0x0008, 0x0008, 0x0008, 0x0136, 0x0008, 0x0008,
155
    0x0008, 0x0008, 0x0008, 0x0008, 0x02b1, 0x0129, 0x02b9, 0x0127,
156
    0x00a4, 0x00ed, 0x0008, 0x0008, 0x0008, 0x0008, 0x00a0, 0x0008,
157
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0206, 0x0008, 0x0008,
158
    0x0008, 0x0008, 0x00c8, 0x0008, 0x0008, 0x0008, 0x0008, 0x02c1,
159
    0x02c8, 0x02d0, 0x02d7, 0x0008, 0x0008, 0x00ca, 0x02df, 0x0008,
160
    0x0008, 0x0008, 0x0008, 0x02e3, 0x008a, 0x02eb, 0x012a, 0x02f3,
161
    0x00d8, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0089,
162
    0x0089, 0x008a, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
163
    0x0110, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x02fb, 0x0301,
164
    0x01d9, 0x0008, 0x0008, 0x0008, 0x0008, 0x00a0, 0x00a4, 0x0008,
165
    0x0112, 0x0008, 0x0008, 0x0008, 0x0309, 0x0311, 0x0008, 0x0008,
166
    0x0008, 0x0008, 0x0317, 0x031f, 0x022f, 0x0008, 0x0008, 0x0008,
167
    0x0008, 0x0327, 0x032b, 0x030b, 0x0008, 0x0008, 0x0330, 0x0089,
168
    0x0271, 0x018b, 0x0338, 0x00a6, 0x0008, 0x0340, 0x0348, 0x034d,
169
    0x0022, 0x0355, 0x035d, 0x0363, 0x0008, 0x036a, 0x0008, 0x0008,
170
    0x0372, 0x0089, 0x002c, 0x007a, 0x0025, 0x0008, 0x0008, 0x0008,
171
    0x0008, 0x002c, 0x0008, 0x0008, 0x0089, 0x0089, 0x0089, 0x0089,
172
    0x00c9, 0x0008, 0x037a, 0x004c, 0x0073, 0x0008, 0x0381, 0x002d,
173
    0x0008, 0x036a, 0x0008, 0x0008, 0x0033, 0x0060, 0x0092, 0x0026,
174
    0x0092, 0x0028, 0x0008, 0x004c, 0x0389, 0x038f, 0x0008, 0x0396,
175
    0x0008, 0x0028, 0x0008, 0x0008, 0x039c, 0x0008, 0x007a, 0x0008,
176
    0x0008, 0x0008, 0x0040, 0x03a4, 0x039f, 0x03a9, 0x0068, 0x03ae,
177
    0x007d, 0x0032, 0x0008, 0x03b4, 0x002e, 0x0008, 0x03bc, 0x03ba,
178
    0x0008, 0x0008, 0x03ba, 0x0008, 0x002b, 0x004c, 0x002b, 0x0008,
179
    0x0008, 0x007a, 0x0008, 0x0008, 0x002e, 0x03c4, 0x0008, 0x03cc,
180
    0x0008, 0x0008, 0x03d4, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
181
    0x0008, 0x03d5, 0x0008, 0x0008, 0x0008, 0x03dd, 0x03e5, 0x03ed,
182
    0x0008, 0x0008, 0x0008, 0x0008, 0x0092, 0x0092, 0x0092, 0x0092,
183
    0x0092, 0x0092, 0x0092, 0x0092, 0x03f5, 0x0092, 0x0092, 0x0092,
184
    0x0092, 0x0098, 0x0092, 0x0092, 0x0008, 0x0008, 0x0008, 0x0008,
185
    0x0098, 0x03fb, 0x0401, 0x0032, 0x0407, 0x040e, 0x0028, 0x0008,
186
    0x0349, 0x007a, 0x0008, 0x0416, 0x041e, 0x0425, 0x042d, 0x0433,
187
    0x043a, 0x043a, 0x0442, 0x043a, 0x0437, 0x0442, 0x0446, 0x043a,
188
    0x044e, 0x0451, 0x043a, 0x043b, 0x0459, 0x045f, 0x0467, 0x046b,
189
    0x0469, 0x0473, 0x043a, 0x0477, 0x0478, 0x047e, 0x0480, 0x0485,
190
    0x0455, 0x0482, 0x048b, 0x0491, 0x0499, 0x0473, 0x04a1, 0x03cf,
191
    0x036a, 0x04a9, 0x0394, 0x002b, 0x04ad, 0x04b5, 0x04bc, 0x0008,
192
    0x04c4, 0x0008, 0x004e, 0x0092, 0x0008, 0x0008, 0x04cc, 0x0008,
193
    0x036a, 0x0008, 0x04a9, 0x04d4, 0x0008, 0x0008, 0x0008, 0x0008,
194
    0x0008, 0x0008, 0x0393, 0x0008, 0x04dc, 0x0008, 0x0008, 0x04e4,
195
    0x0008, 0x0008, 0x0008, 0x0008, 0x04e8, 0x0028, 0x0008, 0x0008,
196
    0x0008, 0x0008, 0x0008, 0x00ca, 0x00a6, 0x0008, 0x0008, 0x0008,
197
    0x0008, 0x0008, 0x0008, 0x0008, 0x00ca, 0x04f0, 0x04f0, 0x04f0,
198
    0x04f6, 0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04fa,
199
    0x0008, 0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04f0,
200
    0x04f0, 0x0502, 0x0008, 0x0008, 0x0008, 0x04f0, 0x04f0, 0x04f0,
201
    0x04f0, 0x04f0, 0x050a, 0x0512, 0x0515, 0x051c, 0x04f0, 0x04f0,
202
    0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04f1, 0x0524, 0x04f0,
203
    0x04f0, 0x04f0, 0x04f0, 0x052c, 0x04f0, 0x04f0, 0x04f0, 0x04f0,
204
    0x04f0, 0x051c, 0x04f0, 0x04f1, 0x04f0, 0x04f0, 0x04f0, 0x04f0,
205
    0x04f0, 0x04f0, 0x0502, 0x0534, 0x04f0, 0x04f0, 0x04f0, 0x04f1,
206
    0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x0092, 0x04f0, 0x04f0, 0x04f0,
207
    0x04f0, 0x04f0, 0x04f0, 0x0513, 0x053b, 0x04f0, 0x04f0, 0x04f0,
208
    0x04f0, 0x04f9, 0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04f0,
209
    0x04f1, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
210
    0x00ca, 0x0330, 0x0543, 0x0008, 0x0008, 0x0008, 0x00a8, 0x0008,
211
    0x0008, 0x0008, 0x0008, 0x0549, 0x01cf, 0x0008, 0x0008, 0x0550,
212
    0x01ce, 0x0008, 0x0008, 0x0557, 0x0008, 0x0008, 0x0008, 0x0008,
213
    0x0008, 0x0327, 0x025b, 0x055f, 0x0008, 0x0008, 0x0008, 0x0089,
214
    0x0089, 0x00a6, 0x00ca, 0x0008, 0x0008, 0x0008, 0x0008, 0x00a8,
215
    0x0543, 0x0008, 0x0008, 0x00ca, 0x0089, 0x022f, 0x0008, 0x028e,
216
    0x028e, 0x028e, 0x0567, 0x0111, 0x0008, 0x0008, 0x0008, 0x0008,
217
    0x0008, 0x056c, 0x0572, 0x0579, 0x0008, 0x0008, 0x0008, 0x00ed,
218
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0580, 0x0587, 0x0008,
219
    0x01cf, 0x058e, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x01ce,
220
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0596, 0x01c1,
221
    0x00c8, 0x0008, 0x0008, 0x0008, 0x0008, 0x059e, 0x05a6, 0x0008,
222
    0x0008, 0x0008, 0x0008, 0x01d6, 0x05ae, 0x0008, 0x0008, 0x05b6,
223
    0x05b7, 0x05b7, 0x05bb, 0x05b7, 0x05b7, 0x05b7, 0x05b6, 0x05b7,
224
    0x05b7, 0x05bb, 0x05b7, 0x05b7, 0x05b7, 0x05b6, 0x05b7, 0x05b7,
225
    0x05c0, 0x0008, 0x0296, 0x0296, 0x05c8, 0x05cf, 0x029e, 0x029e,
226
    0x029e, 0x029e, 0x029e, 0x05d3, 0x0008, 0x0008, 0x0008, 0x0177,
227
    0x0008, 0x0008, 0x0008, 0x0008, 0x0089, 0x0089, 0x04f0, 0x0532,
228
    0x0089, 0x0089, 0x04f0, 0x04f0, 0x04f5, 0x04f0, 0x04f1, 0x04fa,
229
    0x0008, 0x0008, 0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x0533, 0x0008,
230
    0x0008, 0x0008, 0x01d3, 0x0008, 0x0008, 0x0008, 0x0008, 0x04f1,
231
    0x0008, 0x0000, 0x05db, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
232
    0x0008, 0x0008, 0x00ed, 0x0008, 0x0008, 0x0008, 0x0008, 0x00c9,
233
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x00a8, 0x00a5,
234
    0x05e2, 0x00aa, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x02d8,
235
    0x0008, 0x0008, 0x0008, 0x0008, 0x00aa, 0x0008, 0x0008, 0x0008,
236
    0x0008, 0x0008, 0x00a2, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
237
    0x05e9, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
238
    0x00aa, 0x05ef, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
239
    0x0008, 0x05f7, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
240
    0x0089, 0x008a, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x05ff,
241
    0x00ca, 0x0112, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0607,
242
    0x060e, 0x01d0, 0x00e7, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
243
    0x0008, 0x00a5, 0x0008, 0x0008, 0x0008, 0x00ca, 0x026e, 0x00a3,
244
    0x0008, 0x0227, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x01cf,
245
    0x0008, 0x0112, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0604,
246
    0x0128, 0x0616, 0x061d, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
247
    0x0008, 0x0625, 0x062c, 0x0177, 0x00c8, 0x0008, 0x0008, 0x0008,
248
    0x0008, 0x0008, 0x0008, 0x0008, 0x00ca, 0x02f3, 0x00a5, 0x0008,
249
    0x0008, 0x022f, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
250
    0x0634, 0x063c, 0x0640, 0x0166, 0x0008, 0x0646, 0x00a3, 0x00a3,
251
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x02f3,
252
    0x064d, 0x0654, 0x065c, 0x0008, 0x0663, 0x0008, 0x0008, 0x0008,
253
    0x0008, 0x0008, 0x0008, 0x055a, 0x0089, 0x066b, 0x0008, 0x0008,
254
    0x0177, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x02f3,
255
    0x0673, 0x067a, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
256
    0x0008, 0x0166, 0x0158, 0x0682, 0x00c9, 0x0008, 0x0008, 0x0280,
257
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x02f3, 0x0689,
258
    0x00c9, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
259
    0x0691, 0x0581, 0x0008, 0x0008, 0x0008, 0x0318, 0x0699, 0x00a4,
260
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0625, 0x0089, 0x0224,
261
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x06a1, 0x06a8,
262
    0x06b0, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
263
    0x0606, 0x06b6, 0x06be, 0x0008, 0x0008, 0x0008, 0x00ad, 0x00a5,
264
    0x0008, 0x0008, 0x0008, 0x0008, 0x00a0, 0x06c6, 0x00ca, 0x0008,
265
    0x0580, 0x02d7, 0x0008, 0x0008, 0x0008, 0x0008, 0x06cd, 0x06d3,
266
    0x0128, 0x00a6, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0166,
267
    0x008a, 0x0581, 0x0008, 0x0008, 0x00ac, 0x0089, 0x0089, 0x06db,
268
    0x06e2, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x06e9,
269
    0x06f0, 0x06f7, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
270
    0x0008, 0x06ff, 0x0707, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
271
    0x0008, 0x070f, 0x0008, 0x0717, 0x0008, 0x0008, 0x0008, 0x0008,
272
    0x0008, 0x024f, 0x071f, 0x0727, 0x0008, 0x0008, 0x01d0, 0x0008,
273
    0x0008, 0x0008, 0x0008, 0x00a7, 0x0089, 0x0543, 0x0008, 0x0008,
274
    0x0008, 0x0008, 0x0008, 0x00a8, 0x0089, 0x02f1, 0x0008, 0x0008,
275
    0x0008, 0x0008, 0x0008, 0x0008, 0x00a3, 0x0008, 0x0008, 0x0008,
276
    0x0008, 0x0008, 0x0008, 0x008a, 0x0008, 0x0008, 0x0008, 0x0008,
277
    0x072c, 0x0733, 0x0008, 0x0008, 0x00ca, 0x025a, 0x025b, 0x025b,
278
    0x025b, 0x025b, 0x025b, 0x00ca, 0x00a5, 0x0008, 0x0008, 0x0008,
279
    0x0008, 0x0008, 0x073b, 0x0008, 0x0743, 0x0008, 0x04f0, 0x04f0,
280
    0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x0008, 0x04f0, 0x04f0,
281
    0x0502, 0x0008, 0x0008, 0x0008, 0x0008, 0x0534, 0x04f0, 0x0533,
282
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x04f4, 0x074b,
283
    0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x0529, 0x0008, 0x0752, 0x0008,
284
    0x0008, 0x075a, 0x0008, 0x04fe, 0x0008, 0x04f0, 0x04f0, 0x04f0,
285
    0x04f0, 0x04f0, 0x04f0, 0x04f0, 0x04fa, 0x0008, 0x0008, 0x0008,
286
    0x0206, 0x00a4, 0x0008, 0x0008, 0x0008, 0x0089, 0x0089, 0x0089,
287
    0x0089, 0x0089, 0x0543, 0x0089, 0x0089, 0x008a, 0x0008, 0x0008,
288
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x01d4, 0x0602, 0x02f3,
289
    0x0089, 0x0762, 0x00a4, 0x0008, 0x0008, 0x0008, 0x05ef, 0x0008,
290
    0x0008, 0x0191, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
291
    0x0008, 0x04f0, 0x04f0, 0x04f1, 0x0008, 0x04f0, 0x04f0, 0x04f1,
292
    0x0008, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x008a,
293
    0x00a0, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x00a3, 0x00ed,
294
    0x0008, 0x01ce, 0x0008, 0x0008, 0x00a0, 0x00ad, 0x0089, 0x0008,
295
    0x0008, 0x008a, 0x0089, 0x0089, 0x0764, 0x00b3, 0x00a5, 0x0008,
296
    0x0008, 0x00ca, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
297
    0x0177, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x00aa, 0x0008,
298
    0x0008, 0x0008, 0x0008, 0x0008, 0x00a8, 0x0008, 0x0008, 0x008a,
299
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x00aa, 0x00a5, 0x0008,
300
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x076c, 0x043a, 0x043a,
301
    0x043a, 0x043a, 0x043a, 0x043a, 0x043a, 0x043a, 0x043b, 0x043a,
302
    0x043a, 0x043a, 0x043a, 0x043a, 0x043a, 0x0092, 0x0774, 0x0092,
303
    0x0092, 0x0092, 0x077c, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092,
304
    0x0784, 0x078c, 0x078e, 0x0092, 0x0796, 0x079d, 0x07a2, 0x0092,
305
    0x07a5, 0x043a, 0x043a, 0x043a, 0x043a, 0x07aa, 0x07b0, 0x07b0,
306
    0x07b0, 0x07b8, 0x043a, 0x04f0, 0x07c0, 0x04f0, 0x0513, 0x07c6,
307
    0x07cb, 0x04f0, 0x07ce, 0x07d6, 0x043a, 0x0444, 0x043a, 0x043a,
308
    0x043a, 0x0442, 0x0442, 0x0442, 0x0442, 0x07d7, 0x043d, 0x07df,
309
    0x0442, 0x0442, 0x0442, 0x0442, 0x0442, 0x0442, 0x0442, 0x07e0,
310
    0x0442, 0x0442, 0x0446, 0x043a, 0x0442, 0x0442, 0x0442, 0x0442,
311
    0x07e6, 0x0446, 0x043a, 0x0442, 0x0442, 0x07ed, 0x07f5, 0x0442,
312
    0x0442, 0x0442, 0x0442, 0x0442, 0x0442, 0x0442, 0x0443, 0x07fd,
313
    0x0442, 0x0442, 0x0442, 0x0442, 0x0442, 0x0442, 0x0442, 0x0442,
314
    0x0800, 0x0442, 0x0442, 0x0442, 0x0442, 0x0442, 0x0442, 0x0442,
315
    0x0807, 0x0391, 0x080f, 0x0442, 0x0442, 0x0442, 0x043a, 0x043a,
316
    0x0468, 0x043a, 0x043a, 0x07d1, 0x043a, 0x076c, 0x043a, 0x043a,
317
    0x043a, 0x043a, 0x043a, 0x043a, 0x043a, 0x043f, 0x0442, 0x0442,
318
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0444, 0x076c,
319
    0x0802, 0x043e, 0x043a, 0x07d3, 0x043e, 0x0445, 0x0008, 0x0008,
320
    0x0008, 0x0008, 0x0008, 0x0008, 0x0817, 0x043a, 0x0008, 0x0008,
321
    0x04dc, 0x043a, 0x0442, 0x0446, 0x07d7, 0x043a, 0x0008, 0x0817,
322
    0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x043a, 0x0008,
323
    0x0819, 0x0008, 0x0008, 0x0008, 0x0008, 0x043a, 0x0008, 0x0008,
324
    0x0008, 0x0391, 0x043a, 0x043a, 0x0008, 0x0821, 0x0442, 0x0442,
325
    0x0442, 0x0442, 0x0442, 0x0826, 0x082a, 0x0442, 0x0442, 0x0442,
326
    0x0442, 0x0442, 0x0442, 0x0442, 0x043a, 0x043a, 0x043a, 0x043a,
327
    0x043a, 0x043a, 0x0442, 0x0445, 0x0442, 0x0475, 0x0442, 0x0442,
328
    0x0442, 0x0442, 0x0442, 0x0442, 0x0443, 0x043c, 0x0442, 0x0800,
329
    0x0442, 0x07d6, 0x0442, 0x07d7, 0x043a, 0x043a, 0x043a, 0x043a,
330
    0x043a, 0x043a, 0x043a, 0x0459, 0x0832, 0x0000, 0x0000, 0x0000,
331
    0x0089, 0x0089, 0x0089, 0x0089, 0x0000, 0x0000, 0x0000, 0x0000,
332
    0x0000, 0x0000, 0x0000, 0x0000, 0x0089, 0x0089, 0x0089, 0x0089,
333
    0x0089, 0x0089, 0x0000, 0x0000, 0x0092, 0x0092, 0x0092, 0x0092,
334
    0x0092, 0x0092, 0x0092, 0x083a,
335
};
336
static const uint8_t s_stage3[] = {
337
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
338
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
339
    0x41, 0x40, 0xc0, 0x40, 0x40, 0xc0, 0x40, 0x40,
340
    0xc0, 0x4c, 0xc0, 0x40, 0x40, 0x41, 0xcc, 0x40,
341
    0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x40, 0xc0, 0xc0,
342
    0xc0, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
343
    0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0xc0,
344
    0x40, 0x40, 0x40, 0x40, 0xc0, 0x40, 0xc0, 0xc0,
345
    0xc0, 0x40, 0xc0, 0xc0, 0x40, 0x40, 0x40, 0xc0,
346
    0xc0, 0xc0, 0x40, 0xc0, 0x40, 0xc0, 0x40, 0x40,
347
    0x40, 0x40, 0x40, 0x40, 0xc0, 0xc0, 0xc0, 0x40,
348
    0x40, 0x40, 0x40, 0xc0, 0xc0, 0xc0, 0x40, 0xc0,
349
    0x40, 0x40, 0x40, 0xc0, 0xc0, 0xc0, 0xc0, 0x40,
350
    0xc0, 0x40, 0x40, 0xc0, 0x40, 0xc0, 0x40, 0xc0,
351
    0x40, 0xc0, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x40,
352
    0x40, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
353
    0x40, 0xc0, 0xc0, 0xc0, 0xc0, 0x40, 0xc0, 0x40,
354
    0xc0, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
355
    0x02, 0x40, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
356
    0xc0, 0xc0, 0x40, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
357
    0x40, 0x40, 0x40, 0x02, 0x02, 0x02, 0x02, 0x02,
358
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x02, 0x02,
359
    0x02, 0x02, 0x02, 0x02, 0x02, 0x40, 0x02, 0x02,
360
    0x40, 0x02, 0x02, 0x40, 0x02, 0x04, 0x04, 0x04,
361
    0x04, 0x04, 0x04, 0x40, 0x40, 0x02, 0x02, 0x02,
362
    0x40, 0x02, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
363
    0x40, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x40,
364
    0x02, 0x02, 0x02, 0x02, 0x02, 0x40, 0x40, 0x02,
365
    0x40, 0x02, 0x02, 0x02, 0x02, 0x40, 0x40, 0x40,
366
    0x40, 0x40, 0x40, 0x40, 0x04, 0x40, 0x40, 0x40,
367
    0x40, 0x40, 0x02, 0x40, 0x40, 0x02, 0x02, 0x40,
368
    0x02, 0x02, 0x02, 0x02, 0x02, 0x40, 0x02, 0x02,
369
    0x02, 0x40, 0x40, 0x40, 0x40, 0x04, 0x04, 0x40,
370
    0x40, 0x40, 0x40, 0x40, 0x02, 0x02, 0x04, 0x02,
371
    0x02, 0x02, 0x02, 0x02, 0x42, 0x40, 0x40, 0x40,
372
    0x40, 0x40, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b,
373
    0x4b, 0x4b, 0x02, 0x42, 0x02, 0x40, 0x42, 0x42,
374
    0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x42,
375
    0x42, 0x42, 0x42, 0x0a, 0x42, 0x42, 0x40, 0x40,
376
    0x02, 0x02, 0x40, 0x40, 0x40, 0x40, 0x02, 0x42,
377
    0x42, 0x40, 0x40, 0x40, 0x40, 0x4b, 0x40, 0x4b,
378
    0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x40, 0x4b, 0x40,
379
    0x40, 0x40, 0x4b, 0x4b, 0x40, 0x40, 0x02, 0x40,
380
    0x42, 0x42, 0x02, 0x02, 0x02, 0x02, 0x40, 0x40,
381
    0x42, 0x40, 0x40, 0x42, 0x42, 0x0a, 0x40, 0x40,
382
    0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0x40, 0x40,
383
    0x40, 0x40, 0x4b, 0x4b, 0x40, 0x4b, 0x4b, 0x40,
384
    0x40, 0x40, 0x40, 0x40, 0x40, 0x02, 0x40, 0x02,
385
    0x02, 0x42, 0x40, 0x40, 0x40, 0x40, 0x02, 0x40,
386
    0x42, 0x42, 0x02, 0x02, 0x40, 0x40, 0x40, 0x40,
387
    0x02, 0x40, 0x40, 0x02, 0x02, 0x02, 0x40, 0x40,
388
    0x40, 0x02, 0x40, 0x40, 0x4b, 0x40, 0x4b, 0x4b,
389
    0x40, 0x4b, 0x4b, 0x4b, 0x42, 0x02, 0x02, 0x02,
390
    0x02, 0x02, 0x40, 0x02, 0x42, 0x40, 0x42, 0x42,
391
    0x0a, 0x40, 0x40, 0x4b, 0x02, 0x02, 0x02, 0x02,
392
    0x02, 0x02, 0x4b, 0x4b, 0x40, 0x40, 0x02, 0x40,
393
    0x42, 0x02, 0x40, 0x40, 0x40, 0x40, 0x40, 0x02,
394
    0x02, 0x42, 0x40, 0x4b, 0x40, 0x40, 0x40, 0x40,
395
    0x40, 0x40, 0x02, 0x40, 0x40, 0x40, 0x40, 0x40,
396
    0x40, 0x42, 0x42, 0x02, 0x42, 0x42, 0x40, 0x40,
397
    0x40, 0x42, 0x42, 0x40, 0x42, 0x42, 0x42, 0x02,
398
    0x40, 0x40, 0x02, 0x42, 0x42, 0x42, 0x02, 0x40,
399
    0x40, 0x40, 0x4b, 0x4b, 0x40, 0x40, 0x02, 0x40,
400
    0x02, 0x02, 0x42, 0x42, 0x42, 0x42, 0x40, 0x02,
401
    0x02, 0x40, 0x02, 0x02, 0x02, 0x0a, 0x40, 0x40,
402
    0x40, 0x40, 0x40, 0x02, 0x02, 0x40, 0x4b, 0x4b,
403
    0x4b, 0x40, 0x40, 0x40, 0x40, 0x40, 0x02, 0x40,
404
    0x42, 0x02, 0x42, 0x42, 0x42, 0x42, 0x42, 0x40,
405
    0x02, 0x42, 0x40, 0x42, 0x42, 0x02, 0x02, 0x40,
406
    0x40, 0x40, 0x40, 0x40, 0x42, 0x42, 0x40, 0x02,
407
    0x02, 0x42, 0x42, 0x40, 0x40, 0x40, 0x40, 0x4b,
408
    0x4b, 0x4b, 0x02, 0x02, 0x40, 0x42, 0x42, 0x02,
409
    0x02, 0x02, 0x02, 0x40, 0x42, 0x42, 0x40, 0x42,
410
    0x42, 0x42, 0x0a, 0x44, 0x40, 0x40, 0x02, 0x40,
411
    0x40, 0x40, 0x40, 0x42, 0x42, 0x02, 0x02, 0x02,
412
    0x40, 0x02, 0x40, 0x42, 0x42, 0x42, 0x42, 0x42,
413
    0x42, 0x42, 0x42, 0x40, 0x40, 0x42, 0x42, 0x40,
414
    0x40, 0x40, 0x40, 0x02, 0x40, 0x42, 0x02, 0x02,
415
    0x02, 0x02, 0x42, 0x02, 0x02, 0x02, 0x02, 0x02,
416
    0x02, 0x40, 0x02, 0x02, 0x42, 0x42, 0x02, 0x02,
417
    0x40, 0x40, 0x40, 0x40, 0x02, 0x02, 0x40, 0x40,
418
    0x02, 0x40, 0x42, 0x02, 0x02, 0x40, 0x85, 0x85,
419
    0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x46, 0x46,
420
    0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x47, 0x47,
421
    0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x40, 0x40,
422
    0x02, 0x02, 0x02, 0x42, 0x40, 0x40, 0x02, 0x02,
423
    0x42, 0x40, 0x40, 0x40, 0x40, 0x02, 0x02, 0x42,
424
    0x02, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x02,
425
    0x42, 0x02, 0x02, 0x02, 0x42, 0x42, 0x42, 0x42,
426
    0x02, 0x42, 0x42, 0x42, 0x40, 0x40, 0x40, 0x40,
427
    0x42, 0x42, 0x02, 0x42, 0x42, 0x42, 0x42, 0x42,
428
    0x02, 0x02, 0x02, 0x40, 0x40, 0x40, 0x40, 0x02,
429
    0x42, 0x42, 0x02, 0x40, 0x40, 0x40, 0x40, 0x40,
430
    0x42, 0x02, 0x42, 0x02, 0x40, 0x02, 0x40, 0x40,
431
    0x02, 0x02, 0x02, 0x42, 0x42, 0x42, 0x02, 0x02,
432
    0x02, 0x02, 0x02, 0x40, 0x40, 0x40, 0x40, 0x02,
433
    0x42, 0x02, 0x02, 0x02, 0x42, 0x02, 0x42, 0x42,
434
    0x42, 0x40, 0x42, 0x02, 0x02, 0x02, 0x02, 0x42,
435
    0x42, 0x02, 0x02, 0x42, 0x02, 0x02, 0x02, 0x40,
436
    0x40, 0x40, 0x40, 0x40, 0x40, 0x02, 0x42, 0x02,
437
    0x02, 0x42, 0x42, 0x42, 0x02, 0x42, 0x02, 0x40,
438
    0x40, 0x40, 0x40, 0x42, 0x42, 0x42, 0x42, 0x02,
439
    0x02, 0x02, 0x02, 0x40, 0x02, 0x02, 0x02, 0x02,
440
    0x40, 0x40, 0x40, 0x40, 0x02, 0x40, 0x40, 0x42,
441
    0x40, 0x40, 0x40, 0x02, 0x02, 0x0d, 0x02, 0x02,
442
    0xc0, 0x40, 0x40, 0xc0, 0xc0, 0xc0, 0xc0, 0x40,
443
    0x40, 0xc0, 0xc0, 0x40, 0x40, 0x41, 0x41, 0x02,
444
    0x02, 0x02, 0x02, 0x02, 0x40, 0xc0, 0x40, 0xc0,
445
    0xc0, 0x40, 0xc0, 0x40, 0x40, 0x40, 0xc0, 0x4c,
446
    0x40, 0xc0, 0x40, 0x4c, 0x40, 0x40, 0x40, 0x40,
447
    0x40, 0x40, 0x02, 0x02, 0x02, 0x02, 0x02, 0x41,
448
    0x02, 0x02, 0x40, 0x40, 0x40, 0xc0, 0x40, 0xc0,
449
    0x40, 0x40, 0xc0, 0xcc, 0x40, 0x40, 0x40, 0xc0,
450
    0x40, 0xc0, 0xc0, 0xc0, 0xc0, 0xcc, 0xcc, 0xcc,
451
    0xcc, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x4c,
452
    0x4c, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x40,
453
    0xc0, 0x40, 0x40, 0x40, 0xc0, 0x40, 0x40, 0xc0,
454
    0x40, 0x40, 0x40, 0xc0, 0x40, 0x40, 0xc0, 0xc0,
455
    0xc0, 0xc0, 0xc0, 0x40, 0xc0, 0x40, 0x40, 0x40,
456
    0xc0, 0x40, 0x40, 0x40, 0xc0, 0xc0, 0x40, 0x40,
457
    0xc0, 0xc0, 0xc0, 0xc0, 0x40, 0x40, 0x8c, 0x8c,
458
    0x40, 0x40, 0x40, 0x40, 0x4c, 0x80, 0x80, 0x40,
459
    0x40, 0x40, 0x40, 0x40, 0x4c, 0x40, 0x40, 0x40,
460
    0x40, 0x40, 0x40, 0x40, 0x4c, 0x40, 0x8c, 0x8c,
461
    0x8c, 0x8c, 0x4c, 0x4c, 0x4c, 0x8c, 0x4c, 0x4c,
462
    0x8c, 0x40, 0x40, 0x40, 0x40, 0x4c, 0x4c, 0x4c,
463
    0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0xc0, 0xcc,
464
    0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x4c, 0x4c, 0x40,
465
    0x40, 0x40, 0x40, 0xc0, 0xc0, 0x40, 0x40, 0xcc,
466
    0xc0, 0x40, 0x40, 0x40, 0x40, 0xc0, 0xc0, 0x40,
467
    0x40, 0xc0, 0x40, 0x40, 0xc0, 0xc0, 0x40, 0x40,
468
    0x40, 0x4c, 0x4c, 0x8c, 0x8c, 0x40, 0x4c, 0x4c,
469
    0x4c, 0x4c, 0x4c, 0xcc, 0xc0, 0x4c, 0xcc, 0x4c,
470
    0x4c, 0x4c, 0x4c, 0xcc, 0xcc, 0x4c, 0x4c, 0x4c,
471
    0x40, 0x8c, 0x8c, 0x4c, 0x4c, 0x4c, 0x4c, 0xcc,
472
    0x4c, 0xcc, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,
473
    0x4c, 0x4c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
474
    0x8c, 0x8c, 0x4c, 0x4c, 0x4c, 0x4c, 0xcc, 0xcc,
475
    0x4c, 0xcc, 0xcc, 0xcc, 0x4c, 0xcc, 0xcc, 0x4c,
476
    0xcc, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x40,
477
    0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x4c,
478
    0x4c, 0x4c, 0x8c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,
479
    0x4c, 0xcc, 0xcc, 0x4c, 0x4c, 0x8c, 0x8c, 0x4c,
480
    0x4c, 0x4c, 0x4c, 0x4c, 0x8c, 0x8c, 0xcc, 0xcc,
481
    0xcc, 0xcc, 0xcc, 0xcc, 0x8c, 0xcc, 0xcc, 0xcc,
482
    0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x8c, 0x8c, 0xcc,
483
    0x8c, 0xcc, 0xcc, 0x8c, 0xcc, 0xcc, 0x8c, 0xcc,
484
    0xcc, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x8c, 0x40,
485
    0x40, 0x4c, 0x4c, 0x4c, 0x40, 0x4c, 0x40, 0x4c,
486
    0x40, 0x8c, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
487
    0x40, 0x4c, 0x40, 0x40, 0x4c, 0x40, 0x40, 0x40,
488
    0x40, 0x8c, 0x40, 0x8c, 0x40, 0x40, 0x40, 0x8c,
489
    0x8c, 0x8c, 0x40, 0x8c, 0x40, 0x40, 0x40, 0x4c,
490
    0x4c, 0x4c, 0x4c, 0x4c, 0x40, 0x40, 0x40, 0x40,
491
    0x40, 0x8c, 0x8c, 0x8c, 0x40, 0x40, 0x40, 0x40,
492
    0x40, 0x40, 0x40, 0x8c, 0x40, 0x40, 0x40, 0x40,
493
    0x40, 0x4c, 0x4c, 0x4c, 0x40, 0x40, 0x40, 0x8c,
494
    0x8c, 0x40, 0x40, 0x40, 0x40, 0x8c, 0xc0, 0xc0,
495
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
496
    0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40,
497
    0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
498
    0x40, 0x40, 0x80, 0x80, 0x02, 0x02, 0x02, 0x02,
499
    0x82, 0x82, 0x8c, 0x80, 0x80, 0x80, 0x80, 0x80,
500
    0x80, 0x80, 0x8c, 0x80, 0x40, 0x80, 0x80, 0x80,
501
    0x80, 0x80, 0x80, 0x80, 0x40, 0x02, 0x02, 0x80,
502
    0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40,
503
    0x40, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40,
504
    0x40, 0x40, 0x40, 0x80, 0x8c, 0x80, 0x80, 0x80,
505
    0x80, 0x80, 0x80, 0x02, 0x02, 0x02, 0x02, 0x02,
506
    0x02, 0x40, 0x40, 0x02, 0x40, 0x40, 0x40, 0x02,
507
    0x40, 0x40, 0x40, 0x42, 0x42, 0x02, 0x02, 0x42,
508
    0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42,
509
    0x42, 0x42, 0x42, 0x02, 0x02, 0x40, 0x40, 0x85,
510
    0x85, 0x85, 0x85, 0x85, 0x40, 0x40, 0x40, 0x02,
511
    0x42, 0x42, 0x02, 0x02, 0x42, 0x42, 0x02, 0x02,
512
    0x42, 0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
513
    0x40, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x42,
514
    0x02, 0x02, 0x42, 0x42, 0x02, 0x02, 0x40, 0x40,
515
    0x40, 0x40, 0x02, 0x42, 0x40, 0x40, 0x02, 0x40,
516
    0x02, 0x02, 0x02, 0x40, 0x40, 0x02, 0x40, 0x40,
517
    0x40, 0x42, 0x02, 0x02, 0x42, 0x42, 0x40, 0x40,
518
    0x40, 0x40, 0x40, 0x42, 0x02, 0x40, 0x02, 0x42,
519
    0x42, 0x40, 0x42, 0x02, 0x40, 0x40, 0x88, 0x89,
520
    0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88,
521
    0x89, 0x89, 0x89, 0x89, 0x40, 0x40, 0x40, 0x40,
522
    0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x40,
523
    0x40, 0x40, 0x47, 0x47, 0x47, 0x47, 0x47, 0x40,
524
    0x40, 0x40, 0x40, 0x41, 0x02, 0x02, 0x02, 0x40,
525
    0xc0, 0x40, 0x40, 0x02, 0x02, 0x02, 0x40, 0x02,
526
    0x02, 0x40, 0x40, 0x40, 0x02, 0x02, 0x40, 0x40,
527
    0x40, 0x02, 0x02, 0x02, 0x02, 0x40, 0x40, 0x42,
528
    0x02, 0x42, 0x40, 0x40, 0x40, 0x40, 0x40, 0x02,
529
    0x40, 0x40, 0x02, 0x02, 0x40, 0x40, 0x40, 0x42,
530
    0x42, 0x42, 0x02, 0x02, 0x02, 0x02, 0x42, 0x02,
531
    0x02, 0x40, 0x40, 0x04, 0x40, 0x40, 0x42, 0x40,
532
    0x44, 0x44, 0x40, 0x40, 0x40, 0x40, 0x02, 0x02,
533
    0x02, 0x02, 0x40, 0x42, 0x02, 0x40, 0x40, 0x40,
534
    0x40, 0x42, 0x42, 0x42, 0x02, 0x02, 0x42, 0x42,
535
    0x02, 0x42, 0x02, 0x02, 0x40, 0x40, 0x40, 0x02,
536
    0x02, 0x40, 0x42, 0x42, 0x02, 0x42, 0x42, 0x42,
537
    0x42, 0x40, 0x40, 0x42, 0x42, 0x42, 0x40, 0x40,
538
    0x42, 0x42, 0x40, 0x40, 0x02, 0x02, 0x40, 0x42,
539
    0x40, 0x40, 0x42, 0x40, 0x42, 0x42, 0x42, 0x40,
540
    0x42, 0x42, 0x02, 0x42, 0x02, 0x44, 0x02, 0x40,
541
    0x40, 0x40, 0x40, 0x40, 0x02, 0x02, 0x40, 0x40,
542
    0x40, 0x40, 0x40, 0x42, 0x42, 0x02, 0x02, 0x02,
543
    0x42, 0x02, 0x40, 0x02, 0x42, 0x02, 0x42, 0x42,
544
    0x42, 0x42, 0x02, 0x42, 0x02, 0x02, 0x40, 0x40,
545
    0x40, 0x40, 0x42, 0x42, 0x42, 0x42, 0x02, 0x02,
546
    0x42, 0x02, 0x02, 0x02, 0x42, 0x42, 0x02, 0x42,
547
    0x02, 0x40, 0x40, 0x40, 0x02, 0x42, 0x02, 0x42,
548
    0x42, 0x40, 0x40, 0x02, 0x02, 0x02, 0x02, 0x42,
549
    0x02, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x40,
550
    0x42, 0x40, 0x40, 0x02, 0x02, 0x42, 0x02, 0x44,
551
    0x42, 0x44, 0x42, 0x02, 0x40, 0x40, 0x40, 0x40,
552
    0x02, 0x02, 0x42, 0x42, 0x42, 0x42, 0x02, 0x40,
553
    0x40, 0x40, 0x42, 0x40, 0x40, 0x40, 0x02, 0x42,
554
    0x44, 0x02, 0x02, 0x02, 0x02, 0x40, 0x40, 0x40,
555
    0x40, 0x44, 0x44, 0x44, 0x44, 0x02, 0x02, 0x02,
556
    0x02, 0x02, 0x02, 0x40, 0x42, 0x02, 0x02, 0x02,
557
    0x02, 0x02, 0x02, 0x42, 0x02, 0x02, 0x42, 0x02,
558
    0x02, 0x40, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
559
    0x40, 0x40, 0x02, 0x40, 0x02, 0x02, 0x40, 0x02,
560
    0x02, 0x02, 0x02, 0x02, 0x02, 0x44, 0x02, 0x40,
561
    0x40, 0x42, 0x42, 0x42, 0x42, 0x42, 0x40, 0x02,
562
    0x02, 0x40, 0x42, 0x42, 0x02, 0x42, 0x02, 0x40,
563
    0x40, 0x40, 0x02, 0x02, 0x42, 0x42, 0x40, 0x02,
564
    0x02, 0x44, 0x42, 0x40, 0x40, 0x40, 0x40, 0x02,
565
    0x02, 0x02, 0x40, 0x40, 0x40, 0x42, 0x42, 0x02,
566
    0x42, 0x02, 0x40, 0x40, 0x40, 0x40, 0x40, 0x46,
567
    0x40, 0x40, 0x40, 0x46, 0x46, 0x46, 0x40, 0x40,
568
    0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x02,
569
    0x40, 0x40, 0x40, 0x82, 0x82, 0x40, 0x40, 0x40,
570
    0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40,
571
    0x80, 0x80, 0x40, 0x40, 0x80, 0x40, 0x40, 0x40,
572
    0x40, 0x40, 0x80, 0x80, 0x80, 0x40, 0x40, 0x80,
573
    0x40, 0x40, 0x02, 0x02, 0x02, 0x40, 0x40, 0x02,
574
    0x02, 0x02, 0x02, 0x02, 0x4c, 0x4c, 0x4c, 0x4c,
575
    0x8c, 0x4c, 0x4c, 0x4c, 0xc0, 0xc0, 0xc0, 0x40,
576
    0x40, 0x4c, 0x4c, 0x4c, 0xc0, 0xc0, 0xc0, 0xc0,
577
    0xc0, 0xc0, 0x40, 0x4c, 0xc0, 0xc0, 0x40, 0x40,
578
    0x4c, 0x4c, 0x4c, 0x4c, 0xcc, 0xcc, 0xc0, 0xc0,
579
    0xc0, 0xc0, 0xc0, 0xc0, 0xcc, 0xcc, 0xc0, 0xc0,
580
    0xc0, 0xc0, 0xc0, 0xc0, 0x8c, 0xc0, 0x8c, 0x8c,
581
    0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0xc0, 0xc0, 0xc0,
582
    0xc0, 0xc0, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,
583
    0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43,
584
    0x80, 0x8c, 0x8c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,
585
    0x80, 0x80, 0x8c, 0x80, 0x80, 0x80, 0x80, 0x80,
586
    0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x80, 0x4c,
587
    0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x8c, 0x8c,
588
    0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x8c,
589
    0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x4c, 0x8c, 0x8c,
590
    0x8c, 0x4c, 0x4c, 0x4c, 0x4c, 0x8c, 0x4c, 0x4c,
591
    0x4c, 0x8c, 0x4c, 0x4c, 0x4c, 0x8c, 0x8c, 0x8c,
592
    0x82, 0x82, 0x82, 0x82, 0x82, 0x8c, 0x4c, 0x8c,
593
    0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x4c, 0x4c, 0x8c,
594
    0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x40, 0x40, 0x4c,
595
    0x4c, 0x4c, 0x8c, 0x8c, 0x8c, 0x8c, 0x4c, 0x40,
596
    0x40, 0x40, 0x40, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,
597
    0x4c, 0x40, 0x40, 0x40, 0x40, 0x8c, 0x8c, 0x8c,
598
    0x8c, 0x40, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c,
599
    0x40, 0x8c, 0x41, 0x02, 0x41, 0x41, 0x41, 0x41,
600
    0x41, 0x41, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
601
    0x40, 0x40,
602
};
603
static const uint32_t s_joinRules[2][16] = {
604
    {
605
        0x03cfffcf, 0x0fffffff, 0x03cfffcf, 0x03cfff4f,
606
        0x0000000c, 0x03c0c3cf, 0x03cf0fcf, 0x03cf3fcf,
607
        0x03cf0fcf, 0x03cf3fcf, 0x030fffcf, 0x03cfffcf,
608
        0x03cfffcf, 0x00cfffcf, 0x00000000, 0x00000000,
609
    },
610
    {
611
        0x03cfffcf, 0x0fffffff, 0x03cfffcf, 0x03cfffcf,
612
        0x0000000c, 0x03c0c3cf, 0x03cf0fcf, 0x03cf3fcf,
613
        0x03cf0fcf, 0x03cf3fcf, 0x030fffcf, 0x03cfffcf,
614
        0x03cfffcf, 0x00cfffcf, 0x00000000, 0x00000000,
615
    },
616
};
617
static int ucdLookup(const char32_t cp)
618
22.7k
{
619
22.7k
    const uint16_t s0 = s_stage0[cp >> 11];
620
22.7k
    const uint16_t s1 = s_stage1[s0 + ((cp >> 6) & 31)];
621
22.7k
    const uint16_t s2 = s_stage2[s1 + ((cp >> 3) & 7)];
622
22.7k
    const uint8_t s3 = s_stage3[s2 + ((cp >> 0) & 7)];
623
22.7k
    return s3;
624
22.7k
}
625
static int ucdGraphemeJoins(const int state, const int lead, const int trail)
626
10.9k
{
627
10.9k
    const int l = lead & 15;
628
10.9k
    const int t = trail & 15;
629
10.9k
    return (s_joinRules[state][l] >> (t * 2)) & 3;
630
10.9k
}
631
static bool ucdGraphemeDone(const int state)
632
10.9k
{
633
10.9k
    return state == 3;
634
10.9k
}
635
static int ucdToCharacterWidth(const int val)
636
11.8k
{
637
11.8k
    return val >> 6;
638
11.8k
}
639
// clang-format on
640
// End of generated code
641
642
/*
643
 * This file is part of mpv.
644
 *
645
 * mpv is free software; you can redistribute it and/or
646
 * modify it under the terms of the GNU Lesser General Public
647
 * License as published by the Free Software Foundation; either
648
 * version 2.1 of the License, or (at your option) any later version.
649
 *
650
 * mpv is distributed in the hope that it will be useful,
651
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
652
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
653
 * GNU Lesser General Public License for more details.
654
 *
655
 * You should have received a copy of the GNU Lesser General Public
656
 * License along with mpv.  If not, see <http://www.gnu.org/licenses/>.
657
 */
658
659
#include "common/common.h"
660
661
int term_disp_width(bstr str, int max_width, const unsigned char **cut_pos)
662
149k
{
663
149k
    static const int ambiguous_width = 1;
664
665
149k
    int width = 0;
666
667
149k
    const unsigned char *prev_pos = str.start;
668
15.2M
    while (str.len) {
669
15.1M
        int current_width = 0;
670
671
15.1M
        if (bstr_eatstart0(&str, "\033[")) {
672
591k
            while (str.len && !((*str.start >= '@' && *str.start <= '~') || *str.start == 'm'))
673
587k
                str = bstr_cut(str, 1);
674
3.69k
            str = bstr_cut(str, 1);
675
3.69k
            goto next;
676
3.69k
        }
677
678
15.1M
        prev_pos = str.start;
679
15.1M
        int cp = bstr_decode_utf8(str, &str);
680
681
        // Stop processing on any invalid input
682
15.1M
        if (cp < 0)
683
16.0k
            return 0;
684
685
15.1M
        if (cp == '\r') {
686
608
            width = 0;
687
608
            goto next;
688
608
        }
689
690
15.1M
        if (cp == '\t') {
691
            // Assume tabstop width is 8
692
2.16k
            current_width = 8 - width % 8;
693
2.16k
            goto next;
694
2.16k
        }
695
696
15.1M
        if (cp < 0x20)
697
142k
            goto next;
698
699
14.9M
        if (cp <= 0x7E) {
700
14.9M
            current_width = 1;
701
14.9M
            goto next;
702
14.9M
        }
703
704
11.1k
        int state = 0;
705
706
11.8k
        while (true) {
707
11.8k
            int lead = ucdLookup(cp);
708
11.8k
            int w = ucdToCharacterWidth(lead);
709
11.8k
            if (w == 3)
710
1.56k
                w = ambiguous_width;
711
712
            // U+FE0F Variation Selector-16 is used to turn unqualified Emojis into qualified ones.
713
            // By convention, this turns them from being ambiguous width (= narrow) into wide ones.
714
            // We achieve this here by explicitly giving this codepoint a wide width.
715
            // Later down below we'll clamp width back to <= 2.
716
11.8k
            if (cp == 0xFE0F)
717
224
                w = 2;
718
719
11.8k
            current_width += w;
720
721
11.8k
            if (!str.len)
722
0
                break;
723
724
            // Fetch next codepoint in grapheme cluster
725
11.8k
            bstr cluster_end;
726
11.8k
            cp = bstr_decode_utf8(str, &cluster_end);
727
            // Stop processing on any invalid input
728
11.8k
            if (cp < 0)
729
970
                return 0;
730
10.9k
            int trail = ucdLookup(cp);
731
732
10.9k
            state = ucdGraphemeJoins(state, lead, trail);
733
10.9k
            if (ucdGraphemeDone(state))
734
10.2k
                break;
735
736
684
            str = cluster_end;
737
684
        }
738
739
10.2k
        current_width = MPMIN(current_width, 2);
740
15.1M
next:
741
15.1M
        if (width + current_width > max_width) {
742
0
            mp_assert(prev_pos < str.start + str.len);
743
0
            *cut_pos = prev_pos;
744
0
            break;
745
0
        }
746
15.1M
        width += current_width;
747
15.1M
        if (width == max_width) {
748
0
            if (str.len)
749
0
                *cut_pos = str.start;
750
0
            break;
751
0
        }
752
15.1M
    }
753
754
132k
    return width;
755
149k
}