From ed51e0bfa6269df197773e03f14bd13f4a373331 Mon Sep 17 00:00:00 2001 From: John Naylor Date: Thu, 15 Oct 2020 13:20:41 -0400 Subject: [PATCH v2 2/2] Speed up unicode recomposition. Similar to decomposition, use a perfect hash function for speed. The performance increase is much higher in this casebecause the former implementation used linear search. This makes normalizing to NFC and NFKC 50-75x faster in the backend, while adding only 6kB to the binary. While this is small, keep out of the frontend since its use is not performance critical. --- .../unicode/generate-unicode_norm_table.pl | 104 ++ src/common/unicode_norm.c | 32 +- src/include/common/unicode_norm_table.h | 1219 +++++++++++++++++ 3 files changed, 1353 insertions(+), 2 deletions(-) diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl index 05eec2bf21..fda0198639 100644 --- a/src/common/unicode/generate-unicode_norm_table.pl +++ b/src/common/unicode/generate-unicode_norm_table.pl @@ -104,6 +104,7 @@ typedef struct typedef int (*cp_hash_func) (const void *key); /* Information for lookups with perfect hash functions */ + typedef struct { const pg_unicode_decomposition *decomps; @@ -111,6 +112,13 @@ typedef struct int num_decomps; } pg_unicode_decompinfo; +typedef struct +{ + const uint16 *inverse_lookup; + cp_hash_func hash; + int num_recomps; +} pg_unicode_recompinfo; + #define DECOMP_NO_COMPOSE 0x80 /* don't use for re-composition */ #define DECOMP_INLINE 0x40 /* decomposition is stored inline in * dec_index */ @@ -129,6 +137,8 @@ HEADER my $decomp_index = 0; my $decomp_string = ""; my @dec_cp_packed; +my $main_index = 0; +my @rec_info; my $last_code = $characters[-1]->{code}; foreach my $char (@characters) @@ -190,6 +200,18 @@ foreach my $char (@characters) } } } + + # Save info for recomposeable codepoints. + # XXX This must match the DECOMPOSITION_NO_COMPOSE C macro above! + # See the inverse lookup in recompose_code() found in + # common/unicode_norm.c. + if (!($flags =~ /DECOMP_COMPAT/ || $flags =~ /DECOMP_NO_COMPOSE/)) + { + push @rec_info, {code => $code, + main_index => $main_index, + first => $first_decomp, + second => $decomp_elts[0]}; + } } if ($decomp_size == 0) @@ -228,6 +250,8 @@ foreach my $char (@characters) print $OUTPUT "\t/* $comment */" if ($comment ne ""); print $OUTPUT "\n"; + + $main_index++; } print $OUTPUT "\n};\n\n"; @@ -259,4 +283,84 @@ static const pg_unicode_decompinfo UnicodeDecompInfo = }; HEADER +# Find the lowest codepoint that decomposes to each recomposeable +# code pair and create a mapping to it. +my $recomp_string = ""; +my @rec_cp_packed; +my %seenit; +foreach my $rec (sort recomp_sort @rec_info) +{ + # The hashkey is a 64 bit integer containing the bytes from + # both codepoints. + my $hashkey = (hex($rec->{first}) << 32) | hex($rec->{second}); + next if $seenit{$hashkey}; + + # Save the hash key bytes as a string in network order + push @rec_cp_packed, pack('Q>', $hashkey); + + # Append inverse lookup element + $recomp_string .= sprintf "\t/* %s + %s -> %s */ %s,\n", + $rec->{first}, + $rec->{second}, + $rec->{code}, + $rec->{main_index}; + + $seenit{$hashkey} = 1; +} + +# Remove trailing comma and newline +substr($recomp_string, -2) = ""; + +# Emit the inverse lookup array containing indexes into UnicodeDecompMain +my $num_recomps = scalar @rec_cp_packed; +print $OUTPUT < 8); +print $OUTPUT "\n/* Perfect hash function for recomposition */\n"; +print $OUTPUT "static $rec_func\n"; + +# Emit the structure that wraps the hash lookup information into +# one variable. +print $OUTPUT <{first}); + my $b1 = hex($b->{first}); + + my $a2 = hex($a->{second}); + my $b2 = hex($b->{second}); + + # First sort by first code point + return -1 if $a1 < $b1; + return 1 if $a1 > $b1; + + # Then the second + return -1 if $a2 < $b2; + return 1 if $a2 > $b2; + + # Finally by index into UnicodeDecompMain + return -1 if $a->{main_index} < $b->{main_index}; + return 1 if $a->{main_index} > $b->{main_index}; + + die "found duplicate entries"; +} diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c index ee12aa6789..0b0d6b51b9 100644 --- a/src/common/unicode_norm.c +++ b/src/common/unicode_norm.c @@ -226,7 +226,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result) } else { - int i; + const pg_unicode_decomposition *entry; /* * Do an inverse lookup of the decomposition tables to see if anything @@ -234,9 +234,36 @@ recompose_code(uint32 start, uint32 code, uint32 *result) * sub-table of size two, because the start character has already been * recomposed partially. */ +#ifndef FRONTEND + + int h, inv_lookup_index; + uint64 hashkey; + pg_unicode_recompinfo recompinfo = UnicodeRecompInfo; + + hashkey = pg_hton64(((uint64) start << 32) | (uint64) code); + h = recompinfo.hash(&hashkey); + + /* An out-of-range result implies no match */ + if (h < 0 || h >= recompinfo.num_recomps) + return false; + + inv_lookup_index = recompinfo.inverse_lookup[h]; + entry = &UnicodeDecompMain[inv_lookup_index]; + + if (start == UnicodeDecomp_codepoints[entry->dec_index] && + code == UnicodeDecomp_codepoints[entry->dec_index + 1]) + { + *result = entry->codepoint; + return true; + } + +#else + + int i; + for (i = 0; i < lengthof(UnicodeDecompMain); i++) { - const pg_unicode_decomposition *entry = &UnicodeDecompMain[i]; + entry = &UnicodeDecompMain[i]; if (DECOMPOSITION_SIZE(entry) != 2) continue; @@ -251,6 +278,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result) return true; } } +#endif } return false; diff --git a/src/include/common/unicode_norm_table.h b/src/include/common/unicode_norm_table.h index 25cf16f47e..aff5581d05 100644 --- a/src/include/common/unicode_norm_table.h +++ b/src/include/common/unicode_norm_table.h @@ -29,6 +29,7 @@ typedef struct typedef int (*cp_hash_func) (const void *key); /* Information for lookups with perfect hash functions */ + typedef struct { const pg_unicode_decomposition *decomps; @@ -36,6 +37,13 @@ typedef struct int num_decomps; } pg_unicode_decompinfo; +typedef struct +{ + const uint16 *inverse_lookup; + cp_hash_func hash; + int num_recomps; +} pg_unicode_recompinfo; + #define DECOMP_NO_COMPOSE 0x80 /* don't use for re-composition */ #define DECOMP_INLINE 0x40 /* decomposition is stored inline in * dec_index */ @@ -10628,3 +10636,1214 @@ static const pg_unicode_decompinfo UnicodeDecompInfo = Decomp_hash_func, 6604 }; +/* inverse lookup array */ +static const uint16 RecompInverseLookup[941] = +{ + /* 003C + 0338 -> 226E */ 1823, + /* 003D + 0338 -> 2260 */ 1820, + /* 003E + 0338 -> 226F */ 1824, + /* 0041 + 0300 -> 00C0 */ 14, + /* 0041 + 0301 -> 00C1 */ 15, + /* 0041 + 0302 -> 00C2 */ 16, + /* 0041 + 0303 -> 00C3 */ 17, + /* 0041 + 0304 -> 0100 */ 67, + /* 0041 + 0306 -> 0102 */ 69, + /* 0041 + 0307 -> 0226 */ 270, + /* 0041 + 0308 -> 00C4 */ 18, + /* 0041 + 0309 -> 1EA2 */ 1278, + /* 0041 + 030A -> 00C5 */ 19, + /* 0041 + 030C -> 01CD */ 194, + /* 0041 + 030F -> 0200 */ 240, + /* 0041 + 0311 -> 0202 */ 242, + /* 0041 + 0323 -> 1EA0 */ 1276, + /* 0041 + 0325 -> 1E00 */ 1120, + /* 0041 + 0328 -> 0104 */ 71, + /* 0042 + 0307 -> 1E02 */ 1122, + /* 0042 + 0323 -> 1E04 */ 1124, + /* 0042 + 0331 -> 1E06 */ 1126, + /* 0043 + 0301 -> 0106 */ 73, + /* 0043 + 0302 -> 0108 */ 75, + /* 0043 + 0307 -> 010A */ 77, + /* 0043 + 030C -> 010C */ 79, + /* 0043 + 0327 -> 00C7 */ 20, + /* 0044 + 0307 -> 1E0A */ 1130, + /* 0044 + 030C -> 010E */ 81, + /* 0044 + 0323 -> 1E0C */ 1132, + /* 0044 + 0327 -> 1E10 */ 1136, + /* 0044 + 032D -> 1E12 */ 1138, + /* 0044 + 0331 -> 1E0E */ 1134, + /* 0045 + 0300 -> 00C8 */ 21, + /* 0045 + 0301 -> 00C9 */ 22, + /* 0045 + 0302 -> 00CA */ 23, + /* 0045 + 0303 -> 1EBC */ 1304, + /* 0045 + 0304 -> 0112 */ 83, + /* 0045 + 0306 -> 0114 */ 85, + /* 0045 + 0307 -> 0116 */ 87, + /* 0045 + 0308 -> 00CB */ 24, + /* 0045 + 0309 -> 1EBA */ 1302, + /* 0045 + 030C -> 011A */ 91, + /* 0045 + 030F -> 0204 */ 244, + /* 0045 + 0311 -> 0206 */ 246, + /* 0045 + 0323 -> 1EB8 */ 1300, + /* 0045 + 0327 -> 0228 */ 272, + /* 0045 + 0328 -> 0118 */ 89, + /* 0045 + 032D -> 1E18 */ 1144, + /* 0045 + 0330 -> 1E1A */ 1146, + /* 0046 + 0307 -> 1E1E */ 1150, + /* 0047 + 0301 -> 01F4 */ 230, + /* 0047 + 0302 -> 011C */ 93, + /* 0047 + 0304 -> 1E20 */ 1152, + /* 0047 + 0306 -> 011E */ 95, + /* 0047 + 0307 -> 0120 */ 97, + /* 0047 + 030C -> 01E6 */ 216, + /* 0047 + 0327 -> 0122 */ 99, + /* 0048 + 0302 -> 0124 */ 101, + /* 0048 + 0307 -> 1E22 */ 1154, + /* 0048 + 0308 -> 1E26 */ 1158, + /* 0048 + 030C -> 021E */ 268, + /* 0048 + 0323 -> 1E24 */ 1156, + /* 0048 + 0327 -> 1E28 */ 1160, + /* 0048 + 032E -> 1E2A */ 1162, + /* 0049 + 0300 -> 00CC */ 25, + /* 0049 + 0301 -> 00CD */ 26, + /* 0049 + 0302 -> 00CE */ 27, + /* 0049 + 0303 -> 0128 */ 103, + /* 0049 + 0304 -> 012A */ 105, + /* 0049 + 0306 -> 012C */ 107, + /* 0049 + 0307 -> 0130 */ 111, + /* 0049 + 0308 -> 00CF */ 28, + /* 0049 + 0309 -> 1EC8 */ 1316, + /* 0049 + 030C -> 01CF */ 196, + /* 0049 + 030F -> 0208 */ 248, + /* 0049 + 0311 -> 020A */ 250, + /* 0049 + 0323 -> 1ECA */ 1318, + /* 0049 + 0328 -> 012E */ 109, + /* 0049 + 0330 -> 1E2C */ 1164, + /* 004A + 0302 -> 0134 */ 114, + /* 004B + 0301 -> 1E30 */ 1168, + /* 004B + 030C -> 01E8 */ 218, + /* 004B + 0323 -> 1E32 */ 1170, + /* 004B + 0327 -> 0136 */ 116, + /* 004B + 0331 -> 1E34 */ 1172, + /* 004C + 0301 -> 0139 */ 118, + /* 004C + 030C -> 013D */ 122, + /* 004C + 0323 -> 1E36 */ 1174, + /* 004C + 0327 -> 013B */ 120, + /* 004C + 032D -> 1E3C */ 1180, + /* 004C + 0331 -> 1E3A */ 1178, + /* 004D + 0301 -> 1E3E */ 1182, + /* 004D + 0307 -> 1E40 */ 1184, + /* 004D + 0323 -> 1E42 */ 1186, + /* 004E + 0300 -> 01F8 */ 232, + /* 004E + 0301 -> 0143 */ 126, + /* 004E + 0303 -> 00D1 */ 29, + /* 004E + 0307 -> 1E44 */ 1188, + /* 004E + 030C -> 0147 */ 130, + /* 004E + 0323 -> 1E46 */ 1190, + /* 004E + 0327 -> 0145 */ 128, + /* 004E + 032D -> 1E4A */ 1194, + /* 004E + 0331 -> 1E48 */ 1192, + /* 004F + 0300 -> 00D2 */ 30, + /* 004F + 0301 -> 00D3 */ 31, + /* 004F + 0302 -> 00D4 */ 32, + /* 004F + 0303 -> 00D5 */ 33, + /* 004F + 0304 -> 014C */ 133, + /* 004F + 0306 -> 014E */ 135, + /* 004F + 0307 -> 022E */ 278, + /* 004F + 0308 -> 00D6 */ 34, + /* 004F + 0309 -> 1ECE */ 1322, + /* 004F + 030B -> 0150 */ 137, + /* 004F + 030C -> 01D1 */ 198, + /* 004F + 030F -> 020C */ 252, + /* 004F + 0311 -> 020E */ 254, + /* 004F + 031B -> 01A0 */ 181, + /* 004F + 0323 -> 1ECC */ 1320, + /* 004F + 0328 -> 01EA */ 220, + /* 0050 + 0301 -> 1E54 */ 1204, + /* 0050 + 0307 -> 1E56 */ 1206, + /* 0052 + 0301 -> 0154 */ 139, + /* 0052 + 0307 -> 1E58 */ 1208, + /* 0052 + 030C -> 0158 */ 143, + /* 0052 + 030F -> 0210 */ 256, + /* 0052 + 0311 -> 0212 */ 258, + /* 0052 + 0323 -> 1E5A */ 1210, + /* 0052 + 0327 -> 0156 */ 141, + /* 0052 + 0331 -> 1E5E */ 1214, + /* 0053 + 0301 -> 015A */ 145, + /* 0053 + 0302 -> 015C */ 147, + /* 0053 + 0307 -> 1E60 */ 1216, + /* 0053 + 030C -> 0160 */ 151, + /* 0053 + 0323 -> 1E62 */ 1218, + /* 0053 + 0326 -> 0218 */ 264, + /* 0053 + 0327 -> 015E */ 149, + /* 0054 + 0307 -> 1E6A */ 1226, + /* 0054 + 030C -> 0164 */ 155, + /* 0054 + 0323 -> 1E6C */ 1228, + /* 0054 + 0326 -> 021A */ 266, + /* 0054 + 0327 -> 0162 */ 153, + /* 0054 + 032D -> 1E70 */ 1232, + /* 0054 + 0331 -> 1E6E */ 1230, + /* 0055 + 0300 -> 00D9 */ 35, + /* 0055 + 0301 -> 00DA */ 36, + /* 0055 + 0302 -> 00DB */ 37, + /* 0055 + 0303 -> 0168 */ 157, + /* 0055 + 0304 -> 016A */ 159, + /* 0055 + 0306 -> 016C */ 161, + /* 0055 + 0308 -> 00DC */ 38, + /* 0055 + 0309 -> 1EE6 */ 1346, + /* 0055 + 030A -> 016E */ 163, + /* 0055 + 030B -> 0170 */ 165, + /* 0055 + 030C -> 01D3 */ 200, + /* 0055 + 030F -> 0214 */ 260, + /* 0055 + 0311 -> 0216 */ 262, + /* 0055 + 031B -> 01AF */ 183, + /* 0055 + 0323 -> 1EE4 */ 1344, + /* 0055 + 0324 -> 1E72 */ 1234, + /* 0055 + 0328 -> 0172 */ 167, + /* 0055 + 032D -> 1E76 */ 1238, + /* 0055 + 0330 -> 1E74 */ 1236, + /* 0056 + 0303 -> 1E7C */ 1244, + /* 0056 + 0323 -> 1E7E */ 1246, + /* 0057 + 0300 -> 1E80 */ 1248, + /* 0057 + 0301 -> 1E82 */ 1250, + /* 0057 + 0302 -> 0174 */ 169, + /* 0057 + 0307 -> 1E86 */ 1254, + /* 0057 + 0308 -> 1E84 */ 1252, + /* 0057 + 0323 -> 1E88 */ 1256, + /* 0058 + 0307 -> 1E8A */ 1258, + /* 0058 + 0308 -> 1E8C */ 1260, + /* 0059 + 0300 -> 1EF2 */ 1358, + /* 0059 + 0301 -> 00DD */ 39, + /* 0059 + 0302 -> 0176 */ 171, + /* 0059 + 0303 -> 1EF8 */ 1364, + /* 0059 + 0304 -> 0232 */ 282, + /* 0059 + 0307 -> 1E8E */ 1262, + /* 0059 + 0308 -> 0178 */ 173, + /* 0059 + 0309 -> 1EF6 */ 1362, + /* 0059 + 0323 -> 1EF4 */ 1360, + /* 005A + 0301 -> 0179 */ 174, + /* 005A + 0302 -> 1E90 */ 1264, + /* 005A + 0307 -> 017B */ 176, + /* 005A + 030C -> 017D */ 178, + /* 005A + 0323 -> 1E92 */ 1266, + /* 005A + 0331 -> 1E94 */ 1268, + /* 0061 + 0300 -> 00E0 */ 40, + /* 0061 + 0301 -> 00E1 */ 41, + /* 0061 + 0302 -> 00E2 */ 42, + /* 0061 + 0303 -> 00E3 */ 43, + /* 0061 + 0304 -> 0101 */ 68, + /* 0061 + 0306 -> 0103 */ 70, + /* 0061 + 0307 -> 0227 */ 271, + /* 0061 + 0308 -> 00E4 */ 44, + /* 0061 + 0309 -> 1EA3 */ 1279, + /* 0061 + 030A -> 00E5 */ 45, + /* 0061 + 030C -> 01CE */ 195, + /* 0061 + 030F -> 0201 */ 241, + /* 0061 + 0311 -> 0203 */ 243, + /* 0061 + 0323 -> 1EA1 */ 1277, + /* 0061 + 0325 -> 1E01 */ 1121, + /* 0061 + 0328 -> 0105 */ 72, + /* 0062 + 0307 -> 1E03 */ 1123, + /* 0062 + 0323 -> 1E05 */ 1125, + /* 0062 + 0331 -> 1E07 */ 1127, + /* 0063 + 0301 -> 0107 */ 74, + /* 0063 + 0302 -> 0109 */ 76, + /* 0063 + 0307 -> 010B */ 78, + /* 0063 + 030C -> 010D */ 80, + /* 0063 + 0327 -> 00E7 */ 46, + /* 0064 + 0307 -> 1E0B */ 1131, + /* 0064 + 030C -> 010F */ 82, + /* 0064 + 0323 -> 1E0D */ 1133, + /* 0064 + 0327 -> 1E11 */ 1137, + /* 0064 + 032D -> 1E13 */ 1139, + /* 0064 + 0331 -> 1E0F */ 1135, + /* 0065 + 0300 -> 00E8 */ 47, + /* 0065 + 0301 -> 00E9 */ 48, + /* 0065 + 0302 -> 00EA */ 49, + /* 0065 + 0303 -> 1EBD */ 1305, + /* 0065 + 0304 -> 0113 */ 84, + /* 0065 + 0306 -> 0115 */ 86, + /* 0065 + 0307 -> 0117 */ 88, + /* 0065 + 0308 -> 00EB */ 50, + /* 0065 + 0309 -> 1EBB */ 1303, + /* 0065 + 030C -> 011B */ 92, + /* 0065 + 030F -> 0205 */ 245, + /* 0065 + 0311 -> 0207 */ 247, + /* 0065 + 0323 -> 1EB9 */ 1301, + /* 0065 + 0327 -> 0229 */ 273, + /* 0065 + 0328 -> 0119 */ 90, + /* 0065 + 032D -> 1E19 */ 1145, + /* 0065 + 0330 -> 1E1B */ 1147, + /* 0066 + 0307 -> 1E1F */ 1151, + /* 0067 + 0301 -> 01F5 */ 231, + /* 0067 + 0302 -> 011D */ 94, + /* 0067 + 0304 -> 1E21 */ 1153, + /* 0067 + 0306 -> 011F */ 96, + /* 0067 + 0307 -> 0121 */ 98, + /* 0067 + 030C -> 01E7 */ 217, + /* 0067 + 0327 -> 0123 */ 100, + /* 0068 + 0302 -> 0125 */ 102, + /* 0068 + 0307 -> 1E23 */ 1155, + /* 0068 + 0308 -> 1E27 */ 1159, + /* 0068 + 030C -> 021F */ 269, + /* 0068 + 0323 -> 1E25 */ 1157, + /* 0068 + 0327 -> 1E29 */ 1161, + /* 0068 + 032E -> 1E2B */ 1163, + /* 0068 + 0331 -> 1E96 */ 1270, + /* 0069 + 0300 -> 00EC */ 51, + /* 0069 + 0301 -> 00ED */ 52, + /* 0069 + 0302 -> 00EE */ 53, + /* 0069 + 0303 -> 0129 */ 104, + /* 0069 + 0304 -> 012B */ 106, + /* 0069 + 0306 -> 012D */ 108, + /* 0069 + 0308 -> 00EF */ 54, + /* 0069 + 0309 -> 1EC9 */ 1317, + /* 0069 + 030C -> 01D0 */ 197, + /* 0069 + 030F -> 0209 */ 249, + /* 0069 + 0311 -> 020B */ 251, + /* 0069 + 0323 -> 1ECB */ 1319, + /* 0069 + 0328 -> 012F */ 110, + /* 0069 + 0330 -> 1E2D */ 1165, + /* 006A + 0302 -> 0135 */ 115, + /* 006A + 030C -> 01F0 */ 226, + /* 006B + 0301 -> 1E31 */ 1169, + /* 006B + 030C -> 01E9 */ 219, + /* 006B + 0323 -> 1E33 */ 1171, + /* 006B + 0327 -> 0137 */ 117, + /* 006B + 0331 -> 1E35 */ 1173, + /* 006C + 0301 -> 013A */ 119, + /* 006C + 030C -> 013E */ 123, + /* 006C + 0323 -> 1E37 */ 1175, + /* 006C + 0327 -> 013C */ 121, + /* 006C + 032D -> 1E3D */ 1181, + /* 006C + 0331 -> 1E3B */ 1179, + /* 006D + 0301 -> 1E3F */ 1183, + /* 006D + 0307 -> 1E41 */ 1185, + /* 006D + 0323 -> 1E43 */ 1187, + /* 006E + 0300 -> 01F9 */ 233, + /* 006E + 0301 -> 0144 */ 127, + /* 006E + 0303 -> 00F1 */ 55, + /* 006E + 0307 -> 1E45 */ 1189, + /* 006E + 030C -> 0148 */ 131, + /* 006E + 0323 -> 1E47 */ 1191, + /* 006E + 0327 -> 0146 */ 129, + /* 006E + 032D -> 1E4B */ 1195, + /* 006E + 0331 -> 1E49 */ 1193, + /* 006F + 0300 -> 00F2 */ 56, + /* 006F + 0301 -> 00F3 */ 57, + /* 006F + 0302 -> 00F4 */ 58, + /* 006F + 0303 -> 00F5 */ 59, + /* 006F + 0304 -> 014D */ 134, + /* 006F + 0306 -> 014F */ 136, + /* 006F + 0307 -> 022F */ 279, + /* 006F + 0308 -> 00F6 */ 60, + /* 006F + 0309 -> 1ECF */ 1323, + /* 006F + 030B -> 0151 */ 138, + /* 006F + 030C -> 01D2 */ 199, + /* 006F + 030F -> 020D */ 253, + /* 006F + 0311 -> 020F */ 255, + /* 006F + 031B -> 01A1 */ 182, + /* 006F + 0323 -> 1ECD */ 1321, + /* 006F + 0328 -> 01EB */ 221, + /* 0070 + 0301 -> 1E55 */ 1205, + /* 0070 + 0307 -> 1E57 */ 1207, + /* 0072 + 0301 -> 0155 */ 140, + /* 0072 + 0307 -> 1E59 */ 1209, + /* 0072 + 030C -> 0159 */ 144, + /* 0072 + 030F -> 0211 */ 257, + /* 0072 + 0311 -> 0213 */ 259, + /* 0072 + 0323 -> 1E5B */ 1211, + /* 0072 + 0327 -> 0157 */ 142, + /* 0072 + 0331 -> 1E5F */ 1215, + /* 0073 + 0301 -> 015B */ 146, + /* 0073 + 0302 -> 015D */ 148, + /* 0073 + 0307 -> 1E61 */ 1217, + /* 0073 + 030C -> 0161 */ 152, + /* 0073 + 0323 -> 1E63 */ 1219, + /* 0073 + 0326 -> 0219 */ 265, + /* 0073 + 0327 -> 015F */ 150, + /* 0074 + 0307 -> 1E6B */ 1227, + /* 0074 + 0308 -> 1E97 */ 1271, + /* 0074 + 030C -> 0165 */ 156, + /* 0074 + 0323 -> 1E6D */ 1229, + /* 0074 + 0326 -> 021B */ 267, + /* 0074 + 0327 -> 0163 */ 154, + /* 0074 + 032D -> 1E71 */ 1233, + /* 0074 + 0331 -> 1E6F */ 1231, + /* 0075 + 0300 -> 00F9 */ 61, + /* 0075 + 0301 -> 00FA */ 62, + /* 0075 + 0302 -> 00FB */ 63, + /* 0075 + 0303 -> 0169 */ 158, + /* 0075 + 0304 -> 016B */ 160, + /* 0075 + 0306 -> 016D */ 162, + /* 0075 + 0308 -> 00FC */ 64, + /* 0075 + 0309 -> 1EE7 */ 1347, + /* 0075 + 030A -> 016F */ 164, + /* 0075 + 030B -> 0171 */ 166, + /* 0075 + 030C -> 01D4 */ 201, + /* 0075 + 030F -> 0215 */ 261, + /* 0075 + 0311 -> 0217 */ 263, + /* 0075 + 031B -> 01B0 */ 184, + /* 0075 + 0323 -> 1EE5 */ 1345, + /* 0075 + 0324 -> 1E73 */ 1235, + /* 0075 + 0328 -> 0173 */ 168, + /* 0075 + 032D -> 1E77 */ 1239, + /* 0075 + 0330 -> 1E75 */ 1237, + /* 0076 + 0303 -> 1E7D */ 1245, + /* 0076 + 0323 -> 1E7F */ 1247, + /* 0077 + 0300 -> 1E81 */ 1249, + /* 0077 + 0301 -> 1E83 */ 1251, + /* 0077 + 0302 -> 0175 */ 170, + /* 0077 + 0307 -> 1E87 */ 1255, + /* 0077 + 0308 -> 1E85 */ 1253, + /* 0077 + 030A -> 1E98 */ 1272, + /* 0077 + 0323 -> 1E89 */ 1257, + /* 0078 + 0307 -> 1E8B */ 1259, + /* 0078 + 0308 -> 1E8D */ 1261, + /* 0079 + 0300 -> 1EF3 */ 1359, + /* 0079 + 0301 -> 00FD */ 65, + /* 0079 + 0302 -> 0177 */ 172, + /* 0079 + 0303 -> 1EF9 */ 1365, + /* 0079 + 0304 -> 0233 */ 283, + /* 0079 + 0307 -> 1E8F */ 1263, + /* 0079 + 0308 -> 00FF */ 66, + /* 0079 + 0309 -> 1EF7 */ 1363, + /* 0079 + 030A -> 1E99 */ 1273, + /* 0079 + 0323 -> 1EF5 */ 1361, + /* 007A + 0301 -> 017A */ 175, + /* 007A + 0302 -> 1E91 */ 1265, + /* 007A + 0307 -> 017C */ 177, + /* 007A + 030C -> 017E */ 179, + /* 007A + 0323 -> 1E93 */ 1267, + /* 007A + 0331 -> 1E95 */ 1269, + /* 00A8 + 0300 -> 1FED */ 1584, + /* 00A8 + 0301 -> 0385 */ 419, + /* 00A8 + 0342 -> 1FC1 */ 1544, + /* 00C2 + 0300 -> 1EA6 */ 1282, + /* 00C2 + 0301 -> 1EA4 */ 1280, + /* 00C2 + 0303 -> 1EAA */ 1286, + /* 00C2 + 0309 -> 1EA8 */ 1284, + /* 00C4 + 0304 -> 01DE */ 210, + /* 00C5 + 0301 -> 01FA */ 234, + /* 00C6 + 0301 -> 01FC */ 236, + /* 00C6 + 0304 -> 01E2 */ 214, + /* 00C7 + 0301 -> 1E08 */ 1128, + /* 00CA + 0300 -> 1EC0 */ 1308, + /* 00CA + 0301 -> 1EBE */ 1306, + /* 00CA + 0303 -> 1EC4 */ 1312, + /* 00CA + 0309 -> 1EC2 */ 1310, + /* 00CF + 0301 -> 1E2E */ 1166, + /* 00D4 + 0300 -> 1ED2 */ 1326, + /* 00D4 + 0301 -> 1ED0 */ 1324, + /* 00D4 + 0303 -> 1ED6 */ 1330, + /* 00D4 + 0309 -> 1ED4 */ 1328, + /* 00D5 + 0301 -> 1E4C */ 1196, + /* 00D5 + 0304 -> 022C */ 276, + /* 00D5 + 0308 -> 1E4E */ 1198, + /* 00D6 + 0304 -> 022A */ 274, + /* 00D8 + 0301 -> 01FE */ 238, + /* 00DC + 0300 -> 01DB */ 208, + /* 00DC + 0301 -> 01D7 */ 204, + /* 00DC + 0304 -> 01D5 */ 202, + /* 00DC + 030C -> 01D9 */ 206, + /* 00E2 + 0300 -> 1EA7 */ 1283, + /* 00E2 + 0301 -> 1EA5 */ 1281, + /* 00E2 + 0303 -> 1EAB */ 1287, + /* 00E2 + 0309 -> 1EA9 */ 1285, + /* 00E4 + 0304 -> 01DF */ 211, + /* 00E5 + 0301 -> 01FB */ 235, + /* 00E6 + 0301 -> 01FD */ 237, + /* 00E6 + 0304 -> 01E3 */ 215, + /* 00E7 + 0301 -> 1E09 */ 1129, + /* 00EA + 0300 -> 1EC1 */ 1309, + /* 00EA + 0301 -> 1EBF */ 1307, + /* 00EA + 0303 -> 1EC5 */ 1313, + /* 00EA + 0309 -> 1EC3 */ 1311, + /* 00EF + 0301 -> 1E2F */ 1167, + /* 00F4 + 0300 -> 1ED3 */ 1327, + /* 00F4 + 0301 -> 1ED1 */ 1325, + /* 00F4 + 0303 -> 1ED7 */ 1331, + /* 00F4 + 0309 -> 1ED5 */ 1329, + /* 00F5 + 0301 -> 1E4D */ 1197, + /* 00F5 + 0304 -> 022D */ 277, + /* 00F5 + 0308 -> 1E4F */ 1199, + /* 00F6 + 0304 -> 022B */ 275, + /* 00F8 + 0301 -> 01FF */ 239, + /* 00FC + 0300 -> 01DC */ 209, + /* 00FC + 0301 -> 01D8 */ 205, + /* 00FC + 0304 -> 01D6 */ 203, + /* 00FC + 030C -> 01DA */ 207, + /* 0102 + 0300 -> 1EB0 */ 1292, + /* 0102 + 0301 -> 1EAE */ 1290, + /* 0102 + 0303 -> 1EB4 */ 1296, + /* 0102 + 0309 -> 1EB2 */ 1294, + /* 0103 + 0300 -> 1EB1 */ 1293, + /* 0103 + 0301 -> 1EAF */ 1291, + /* 0103 + 0303 -> 1EB5 */ 1297, + /* 0103 + 0309 -> 1EB3 */ 1295, + /* 0112 + 0300 -> 1E14 */ 1140, + /* 0112 + 0301 -> 1E16 */ 1142, + /* 0113 + 0300 -> 1E15 */ 1141, + /* 0113 + 0301 -> 1E17 */ 1143, + /* 014C + 0300 -> 1E50 */ 1200, + /* 014C + 0301 -> 1E52 */ 1202, + /* 014D + 0300 -> 1E51 */ 1201, + /* 014D + 0301 -> 1E53 */ 1203, + /* 015A + 0307 -> 1E64 */ 1220, + /* 015B + 0307 -> 1E65 */ 1221, + /* 0160 + 0307 -> 1E66 */ 1222, + /* 0161 + 0307 -> 1E67 */ 1223, + /* 0168 + 0301 -> 1E78 */ 1240, + /* 0169 + 0301 -> 1E79 */ 1241, + /* 016A + 0308 -> 1E7A */ 1242, + /* 016B + 0308 -> 1E7B */ 1243, + /* 017F + 0307 -> 1E9B */ 1275, + /* 01A0 + 0300 -> 1EDC */ 1336, + /* 01A0 + 0301 -> 1EDA */ 1334, + /* 01A0 + 0303 -> 1EE0 */ 1340, + /* 01A0 + 0309 -> 1EDE */ 1338, + /* 01A0 + 0323 -> 1EE2 */ 1342, + /* 01A1 + 0300 -> 1EDD */ 1337, + /* 01A1 + 0301 -> 1EDB */ 1335, + /* 01A1 + 0303 -> 1EE1 */ 1341, + /* 01A1 + 0309 -> 1EDF */ 1339, + /* 01A1 + 0323 -> 1EE3 */ 1343, + /* 01AF + 0300 -> 1EEA */ 1350, + /* 01AF + 0301 -> 1EE8 */ 1348, + /* 01AF + 0303 -> 1EEE */ 1354, + /* 01AF + 0309 -> 1EEC */ 1352, + /* 01AF + 0323 -> 1EF0 */ 1356, + /* 01B0 + 0300 -> 1EEB */ 1351, + /* 01B0 + 0301 -> 1EE9 */ 1349, + /* 01B0 + 0303 -> 1EEF */ 1355, + /* 01B0 + 0309 -> 1EED */ 1353, + /* 01B0 + 0323 -> 1EF1 */ 1357, + /* 01B7 + 030C -> 01EE */ 224, + /* 01EA + 0304 -> 01EC */ 222, + /* 01EB + 0304 -> 01ED */ 223, + /* 0226 + 0304 -> 01E0 */ 212, + /* 0227 + 0304 -> 01E1 */ 213, + /* 0228 + 0306 -> 1E1C */ 1148, + /* 0229 + 0306 -> 1E1D */ 1149, + /* 022E + 0304 -> 0230 */ 280, + /* 022F + 0304 -> 0231 */ 281, + /* 0292 + 030C -> 01EF */ 225, + /* 0391 + 0300 -> 1FBA */ 1537, + /* 0391 + 0301 -> 0386 */ 420, + /* 0391 + 0304 -> 1FB9 */ 1536, + /* 0391 + 0306 -> 1FB8 */ 1535, + /* 0391 + 0313 -> 1F08 */ 1374, + /* 0391 + 0314 -> 1F09 */ 1375, + /* 0391 + 0345 -> 1FBC */ 1539, + /* 0395 + 0300 -> 1FC8 */ 1550, + /* 0395 + 0301 -> 0388 */ 422, + /* 0395 + 0313 -> 1F18 */ 1388, + /* 0395 + 0314 -> 1F19 */ 1389, + /* 0397 + 0300 -> 1FCA */ 1552, + /* 0397 + 0301 -> 0389 */ 423, + /* 0397 + 0313 -> 1F28 */ 1402, + /* 0397 + 0314 -> 1F29 */ 1403, + /* 0397 + 0345 -> 1FCC */ 1554, + /* 0399 + 0300 -> 1FDA */ 1566, + /* 0399 + 0301 -> 038A */ 424, + /* 0399 + 0304 -> 1FD9 */ 1565, + /* 0399 + 0306 -> 1FD8 */ 1564, + /* 0399 + 0308 -> 03AA */ 429, + /* 0399 + 0313 -> 1F38 */ 1418, + /* 0399 + 0314 -> 1F39 */ 1419, + /* 039F + 0300 -> 1FF8 */ 1592, + /* 039F + 0301 -> 038C */ 425, + /* 039F + 0313 -> 1F48 */ 1432, + /* 039F + 0314 -> 1F49 */ 1433, + /* 03A1 + 0314 -> 1FEC */ 1583, + /* 03A5 + 0300 -> 1FEA */ 1581, + /* 03A5 + 0301 -> 038E */ 426, + /* 03A5 + 0304 -> 1FE9 */ 1580, + /* 03A5 + 0306 -> 1FE8 */ 1579, + /* 03A5 + 0308 -> 03AB */ 430, + /* 03A5 + 0314 -> 1F59 */ 1446, + /* 03A9 + 0300 -> 1FFA */ 1594, + /* 03A9 + 0301 -> 038F */ 427, + /* 03A9 + 0313 -> 1F68 */ 1458, + /* 03A9 + 0314 -> 1F69 */ 1459, + /* 03A9 + 0345 -> 1FFC */ 1596, + /* 03AC + 0345 -> 1FB4 */ 1532, + /* 03AE + 0345 -> 1FC4 */ 1547, + /* 03B1 + 0300 -> 1F70 */ 1466, + /* 03B1 + 0301 -> 03AC */ 431, + /* 03B1 + 0304 -> 1FB1 */ 1529, + /* 03B1 + 0306 -> 1FB0 */ 1528, + /* 03B1 + 0313 -> 1F00 */ 1366, + /* 03B1 + 0314 -> 1F01 */ 1367, + /* 03B1 + 0342 -> 1FB6 */ 1533, + /* 03B1 + 0345 -> 1FB3 */ 1531, + /* 03B5 + 0300 -> 1F72 */ 1468, + /* 03B5 + 0301 -> 03AD */ 432, + /* 03B5 + 0313 -> 1F10 */ 1382, + /* 03B5 + 0314 -> 1F11 */ 1383, + /* 03B7 + 0300 -> 1F74 */ 1470, + /* 03B7 + 0301 -> 03AE */ 433, + /* 03B7 + 0313 -> 1F20 */ 1394, + /* 03B7 + 0314 -> 1F21 */ 1395, + /* 03B7 + 0342 -> 1FC6 */ 1548, + /* 03B7 + 0345 -> 1FC3 */ 1546, + /* 03B9 + 0300 -> 1F76 */ 1472, + /* 03B9 + 0301 -> 03AF */ 434, + /* 03B9 + 0304 -> 1FD1 */ 1559, + /* 03B9 + 0306 -> 1FD0 */ 1558, + /* 03B9 + 0308 -> 03CA */ 436, + /* 03B9 + 0313 -> 1F30 */ 1410, + /* 03B9 + 0314 -> 1F31 */ 1411, + /* 03B9 + 0342 -> 1FD6 */ 1562, + /* 03BF + 0300 -> 1F78 */ 1474, + /* 03BF + 0301 -> 03CC */ 438, + /* 03BF + 0313 -> 1F40 */ 1426, + /* 03BF + 0314 -> 1F41 */ 1427, + /* 03C1 + 0313 -> 1FE4 */ 1575, + /* 03C1 + 0314 -> 1FE5 */ 1576, + /* 03C5 + 0300 -> 1F7A */ 1476, + /* 03C5 + 0301 -> 03CD */ 439, + /* 03C5 + 0304 -> 1FE1 */ 1572, + /* 03C5 + 0306 -> 1FE0 */ 1571, + /* 03C5 + 0308 -> 03CB */ 437, + /* 03C5 + 0313 -> 1F50 */ 1438, + /* 03C5 + 0314 -> 1F51 */ 1439, + /* 03C5 + 0342 -> 1FE6 */ 1577, + /* 03C9 + 0300 -> 1F7C */ 1478, + /* 03C9 + 0301 -> 03CE */ 440, + /* 03C9 + 0313 -> 1F60 */ 1450, + /* 03C9 + 0314 -> 1F61 */ 1451, + /* 03C9 + 0342 -> 1FF6 */ 1590, + /* 03C9 + 0345 -> 1FF3 */ 1588, + /* 03CA + 0300 -> 1FD2 */ 1560, + /* 03CA + 0301 -> 0390 */ 428, + /* 03CA + 0342 -> 1FD7 */ 1563, + /* 03CB + 0300 -> 1FE2 */ 1573, + /* 03CB + 0301 -> 03B0 */ 435, + /* 03CB + 0342 -> 1FE7 */ 1578, + /* 03CE + 0345 -> 1FF4 */ 1589, + /* 03D2 + 0301 -> 03D3 */ 444, + /* 03D2 + 0308 -> 03D4 */ 445, + /* 0406 + 0308 -> 0407 */ 457, + /* 0410 + 0306 -> 04D0 */ 479, + /* 0410 + 0308 -> 04D2 */ 481, + /* 0413 + 0301 -> 0403 */ 456, + /* 0415 + 0300 -> 0400 */ 454, + /* 0415 + 0306 -> 04D6 */ 483, + /* 0415 + 0308 -> 0401 */ 455, + /* 0416 + 0306 -> 04C1 */ 477, + /* 0416 + 0308 -> 04DC */ 487, + /* 0417 + 0308 -> 04DE */ 489, + /* 0418 + 0300 -> 040D */ 459, + /* 0418 + 0304 -> 04E2 */ 491, + /* 0418 + 0306 -> 0419 */ 461, + /* 0418 + 0308 -> 04E4 */ 493, + /* 041A + 0301 -> 040C */ 458, + /* 041E + 0308 -> 04E6 */ 495, + /* 0423 + 0304 -> 04EE */ 501, + /* 0423 + 0306 -> 040E */ 460, + /* 0423 + 0308 -> 04F0 */ 503, + /* 0423 + 030B -> 04F2 */ 505, + /* 0427 + 0308 -> 04F4 */ 507, + /* 042B + 0308 -> 04F8 */ 509, + /* 042D + 0308 -> 04EC */ 499, + /* 0430 + 0306 -> 04D1 */ 480, + /* 0430 + 0308 -> 04D3 */ 482, + /* 0433 + 0301 -> 0453 */ 465, + /* 0435 + 0300 -> 0450 */ 463, + /* 0435 + 0306 -> 04D7 */ 484, + /* 0435 + 0308 -> 0451 */ 464, + /* 0436 + 0306 -> 04C2 */ 478, + /* 0436 + 0308 -> 04DD */ 488, + /* 0437 + 0308 -> 04DF */ 490, + /* 0438 + 0300 -> 045D */ 468, + /* 0438 + 0304 -> 04E3 */ 492, + /* 0438 + 0306 -> 0439 */ 462, + /* 0438 + 0308 -> 04E5 */ 494, + /* 043A + 0301 -> 045C */ 467, + /* 043E + 0308 -> 04E7 */ 496, + /* 0443 + 0304 -> 04EF */ 502, + /* 0443 + 0306 -> 045E */ 469, + /* 0443 + 0308 -> 04F1 */ 504, + /* 0443 + 030B -> 04F3 */ 506, + /* 0447 + 0308 -> 04F5 */ 508, + /* 044B + 0308 -> 04F9 */ 510, + /* 044D + 0308 -> 04ED */ 500, + /* 0456 + 0308 -> 0457 */ 466, + /* 0474 + 030F -> 0476 */ 470, + /* 0475 + 030F -> 0477 */ 471, + /* 04D8 + 0308 -> 04DA */ 485, + /* 04D9 + 0308 -> 04DB */ 486, + /* 04E8 + 0308 -> 04EA */ 497, + /* 04E9 + 0308 -> 04EB */ 498, + /* 0627 + 0653 -> 0622 */ 574, + /* 0627 + 0654 -> 0623 */ 575, + /* 0627 + 0655 -> 0625 */ 577, + /* 0648 + 0654 -> 0624 */ 576, + /* 064A + 0654 -> 0626 */ 578, + /* 06C1 + 0654 -> 06C2 */ 606, + /* 06D2 + 0654 -> 06D3 */ 607, + /* 06D5 + 0654 -> 06C0 */ 605, + /* 0928 + 093C -> 0929 */ 733, + /* 0930 + 093C -> 0931 */ 734, + /* 0933 + 093C -> 0934 */ 735, + /* 09C7 + 09BE -> 09CB */ 751, + /* 09C7 + 09D7 -> 09CC */ 752, + /* 0B47 + 0B3E -> 0B4B */ 770, + /* 0B47 + 0B56 -> 0B48 */ 769, + /* 0B47 + 0B57 -> 0B4C */ 771, + /* 0B92 + 0BD7 -> 0B94 */ 775, + /* 0BC6 + 0BBE -> 0BCA */ 776, + /* 0BC6 + 0BD7 -> 0BCC */ 778, + /* 0BC7 + 0BBE -> 0BCB */ 777, + /* 0C46 + 0C56 -> 0C48 */ 780, + /* 0CBF + 0CD5 -> 0CC0 */ 785, + /* 0CC6 + 0CC2 -> 0CCA */ 788, + /* 0CC6 + 0CD5 -> 0CC7 */ 786, + /* 0CC6 + 0CD6 -> 0CC8 */ 787, + /* 0CCA + 0CD5 -> 0CCB */ 789, + /* 0D46 + 0D3E -> 0D4A */ 793, + /* 0D46 + 0D57 -> 0D4C */ 795, + /* 0D47 + 0D3E -> 0D4B */ 794, + /* 0DD9 + 0DCA -> 0DDA */ 798, + /* 0DD9 + 0DCF -> 0DDC */ 799, + /* 0DD9 + 0DDF -> 0DDE */ 801, + /* 0DDC + 0DCA -> 0DDD */ 800, + /* 1025 + 102E -> 1026 */ 859, + /* 1B05 + 1B35 -> 1B06 */ 904, + /* 1B07 + 1B35 -> 1B08 */ 905, + /* 1B09 + 1B35 -> 1B0A */ 906, + /* 1B0B + 1B35 -> 1B0C */ 907, + /* 1B0D + 1B35 -> 1B0E */ 908, + /* 1B11 + 1B35 -> 1B12 */ 909, + /* 1B3A + 1B35 -> 1B3B */ 911, + /* 1B3C + 1B35 -> 1B3D */ 912, + /* 1B3E + 1B35 -> 1B40 */ 913, + /* 1B3F + 1B35 -> 1B41 */ 914, + /* 1B42 + 1B35 -> 1B43 */ 915, + /* 1E36 + 0304 -> 1E38 */ 1176, + /* 1E37 + 0304 -> 1E39 */ 1177, + /* 1E5A + 0304 -> 1E5C */ 1212, + /* 1E5B + 0304 -> 1E5D */ 1213, + /* 1E62 + 0307 -> 1E68 */ 1224, + /* 1E63 + 0307 -> 1E69 */ 1225, + /* 1EA0 + 0302 -> 1EAC */ 1288, + /* 1EA0 + 0306 -> 1EB6 */ 1298, + /* 1EA1 + 0302 -> 1EAD */ 1289, + /* 1EA1 + 0306 -> 1EB7 */ 1299, + /* 1EB8 + 0302 -> 1EC6 */ 1314, + /* 1EB9 + 0302 -> 1EC7 */ 1315, + /* 1ECC + 0302 -> 1ED8 */ 1332, + /* 1ECD + 0302 -> 1ED9 */ 1333, + /* 1F00 + 0300 -> 1F02 */ 1368, + /* 1F00 + 0301 -> 1F04 */ 1370, + /* 1F00 + 0342 -> 1F06 */ 1372, + /* 1F00 + 0345 -> 1F80 */ 1480, + /* 1F01 + 0300 -> 1F03 */ 1369, + /* 1F01 + 0301 -> 1F05 */ 1371, + /* 1F01 + 0342 -> 1F07 */ 1373, + /* 1F01 + 0345 -> 1F81 */ 1481, + /* 1F02 + 0345 -> 1F82 */ 1482, + /* 1F03 + 0345 -> 1F83 */ 1483, + /* 1F04 + 0345 -> 1F84 */ 1484, + /* 1F05 + 0345 -> 1F85 */ 1485, + /* 1F06 + 0345 -> 1F86 */ 1486, + /* 1F07 + 0345 -> 1F87 */ 1487, + /* 1F08 + 0300 -> 1F0A */ 1376, + /* 1F08 + 0301 -> 1F0C */ 1378, + /* 1F08 + 0342 -> 1F0E */ 1380, + /* 1F08 + 0345 -> 1F88 */ 1488, + /* 1F09 + 0300 -> 1F0B */ 1377, + /* 1F09 + 0301 -> 1F0D */ 1379, + /* 1F09 + 0342 -> 1F0F */ 1381, + /* 1F09 + 0345 -> 1F89 */ 1489, + /* 1F0A + 0345 -> 1F8A */ 1490, + /* 1F0B + 0345 -> 1F8B */ 1491, + /* 1F0C + 0345 -> 1F8C */ 1492, + /* 1F0D + 0345 -> 1F8D */ 1493, + /* 1F0E + 0345 -> 1F8E */ 1494, + /* 1F0F + 0345 -> 1F8F */ 1495, + /* 1F10 + 0300 -> 1F12 */ 1384, + /* 1F10 + 0301 -> 1F14 */ 1386, + /* 1F11 + 0300 -> 1F13 */ 1385, + /* 1F11 + 0301 -> 1F15 */ 1387, + /* 1F18 + 0300 -> 1F1A */ 1390, + /* 1F18 + 0301 -> 1F1C */ 1392, + /* 1F19 + 0300 -> 1F1B */ 1391, + /* 1F19 + 0301 -> 1F1D */ 1393, + /* 1F20 + 0300 -> 1F22 */ 1396, + /* 1F20 + 0301 -> 1F24 */ 1398, + /* 1F20 + 0342 -> 1F26 */ 1400, + /* 1F20 + 0345 -> 1F90 */ 1496, + /* 1F21 + 0300 -> 1F23 */ 1397, + /* 1F21 + 0301 -> 1F25 */ 1399, + /* 1F21 + 0342 -> 1F27 */ 1401, + /* 1F21 + 0345 -> 1F91 */ 1497, + /* 1F22 + 0345 -> 1F92 */ 1498, + /* 1F23 + 0345 -> 1F93 */ 1499, + /* 1F24 + 0345 -> 1F94 */ 1500, + /* 1F25 + 0345 -> 1F95 */ 1501, + /* 1F26 + 0345 -> 1F96 */ 1502, + /* 1F27 + 0345 -> 1F97 */ 1503, + /* 1F28 + 0300 -> 1F2A */ 1404, + /* 1F28 + 0301 -> 1F2C */ 1406, + /* 1F28 + 0342 -> 1F2E */ 1408, + /* 1F28 + 0345 -> 1F98 */ 1504, + /* 1F29 + 0300 -> 1F2B */ 1405, + /* 1F29 + 0301 -> 1F2D */ 1407, + /* 1F29 + 0342 -> 1F2F */ 1409, + /* 1F29 + 0345 -> 1F99 */ 1505, + /* 1F2A + 0345 -> 1F9A */ 1506, + /* 1F2B + 0345 -> 1F9B */ 1507, + /* 1F2C + 0345 -> 1F9C */ 1508, + /* 1F2D + 0345 -> 1F9D */ 1509, + /* 1F2E + 0345 -> 1F9E */ 1510, + /* 1F2F + 0345 -> 1F9F */ 1511, + /* 1F30 + 0300 -> 1F32 */ 1412, + /* 1F30 + 0301 -> 1F34 */ 1414, + /* 1F30 + 0342 -> 1F36 */ 1416, + /* 1F31 + 0300 -> 1F33 */ 1413, + /* 1F31 + 0301 -> 1F35 */ 1415, + /* 1F31 + 0342 -> 1F37 */ 1417, + /* 1F38 + 0300 -> 1F3A */ 1420, + /* 1F38 + 0301 -> 1F3C */ 1422, + /* 1F38 + 0342 -> 1F3E */ 1424, + /* 1F39 + 0300 -> 1F3B */ 1421, + /* 1F39 + 0301 -> 1F3D */ 1423, + /* 1F39 + 0342 -> 1F3F */ 1425, + /* 1F40 + 0300 -> 1F42 */ 1428, + /* 1F40 + 0301 -> 1F44 */ 1430, + /* 1F41 + 0300 -> 1F43 */ 1429, + /* 1F41 + 0301 -> 1F45 */ 1431, + /* 1F48 + 0300 -> 1F4A */ 1434, + /* 1F48 + 0301 -> 1F4C */ 1436, + /* 1F49 + 0300 -> 1F4B */ 1435, + /* 1F49 + 0301 -> 1F4D */ 1437, + /* 1F50 + 0300 -> 1F52 */ 1440, + /* 1F50 + 0301 -> 1F54 */ 1442, + /* 1F50 + 0342 -> 1F56 */ 1444, + /* 1F51 + 0300 -> 1F53 */ 1441, + /* 1F51 + 0301 -> 1F55 */ 1443, + /* 1F51 + 0342 -> 1F57 */ 1445, + /* 1F59 + 0300 -> 1F5B */ 1447, + /* 1F59 + 0301 -> 1F5D */ 1448, + /* 1F59 + 0342 -> 1F5F */ 1449, + /* 1F60 + 0300 -> 1F62 */ 1452, + /* 1F60 + 0301 -> 1F64 */ 1454, + /* 1F60 + 0342 -> 1F66 */ 1456, + /* 1F60 + 0345 -> 1FA0 */ 1512, + /* 1F61 + 0300 -> 1F63 */ 1453, + /* 1F61 + 0301 -> 1F65 */ 1455, + /* 1F61 + 0342 -> 1F67 */ 1457, + /* 1F61 + 0345 -> 1FA1 */ 1513, + /* 1F62 + 0345 -> 1FA2 */ 1514, + /* 1F63 + 0345 -> 1FA3 */ 1515, + /* 1F64 + 0345 -> 1FA4 */ 1516, + /* 1F65 + 0345 -> 1FA5 */ 1517, + /* 1F66 + 0345 -> 1FA6 */ 1518, + /* 1F67 + 0345 -> 1FA7 */ 1519, + /* 1F68 + 0300 -> 1F6A */ 1460, + /* 1F68 + 0301 -> 1F6C */ 1462, + /* 1F68 + 0342 -> 1F6E */ 1464, + /* 1F68 + 0345 -> 1FA8 */ 1520, + /* 1F69 + 0300 -> 1F6B */ 1461, + /* 1F69 + 0301 -> 1F6D */ 1463, + /* 1F69 + 0342 -> 1F6F */ 1465, + /* 1F69 + 0345 -> 1FA9 */ 1521, + /* 1F6A + 0345 -> 1FAA */ 1522, + /* 1F6B + 0345 -> 1FAB */ 1523, + /* 1F6C + 0345 -> 1FAC */ 1524, + /* 1F6D + 0345 -> 1FAD */ 1525, + /* 1F6E + 0345 -> 1FAE */ 1526, + /* 1F6F + 0345 -> 1FAF */ 1527, + /* 1F70 + 0345 -> 1FB2 */ 1530, + /* 1F74 + 0345 -> 1FC2 */ 1545, + /* 1F7C + 0345 -> 1FF2 */ 1587, + /* 1FB6 + 0345 -> 1FB7 */ 1534, + /* 1FBF + 0300 -> 1FCD */ 1555, + /* 1FBF + 0301 -> 1FCE */ 1556, + /* 1FBF + 0342 -> 1FCF */ 1557, + /* 1FC6 + 0345 -> 1FC7 */ 1549, + /* 1FF6 + 0345 -> 1FF7 */ 1591, + /* 1FFE + 0300 -> 1FDD */ 1568, + /* 1FFE + 0301 -> 1FDE */ 1569, + /* 1FFE + 0342 -> 1FDF */ 1570, + /* 2190 + 0338 -> 219A */ 1801, + /* 2192 + 0338 -> 219B */ 1802, + /* 2194 + 0338 -> 21AE */ 1803, + /* 21D0 + 0338 -> 21CD */ 1804, + /* 21D2 + 0338 -> 21CF */ 1806, + /* 21D4 + 0338 -> 21CE */ 1805, + /* 2203 + 0338 -> 2204 */ 1807, + /* 2208 + 0338 -> 2209 */ 1808, + /* 220B + 0338 -> 220C */ 1809, + /* 2223 + 0338 -> 2224 */ 1810, + /* 2225 + 0338 -> 2226 */ 1811, + /* 223C + 0338 -> 2241 */ 1816, + /* 2243 + 0338 -> 2244 */ 1817, + /* 2245 + 0338 -> 2247 */ 1818, + /* 2248 + 0338 -> 2249 */ 1819, + /* 224D + 0338 -> 226D */ 1822, + /* 2261 + 0338 -> 2262 */ 1821, + /* 2264 + 0338 -> 2270 */ 1825, + /* 2265 + 0338 -> 2271 */ 1826, + /* 2272 + 0338 -> 2274 */ 1827, + /* 2273 + 0338 -> 2275 */ 1828, + /* 2276 + 0338 -> 2278 */ 1829, + /* 2277 + 0338 -> 2279 */ 1830, + /* 227A + 0338 -> 2280 */ 1831, + /* 227B + 0338 -> 2281 */ 1832, + /* 227C + 0338 -> 22E0 */ 1841, + /* 227D + 0338 -> 22E1 */ 1842, + /* 2282 + 0338 -> 2284 */ 1833, + /* 2283 + 0338 -> 2285 */ 1834, + /* 2286 + 0338 -> 2288 */ 1835, + /* 2287 + 0338 -> 2289 */ 1836, + /* 2291 + 0338 -> 22E2 */ 1843, + /* 2292 + 0338 -> 22E3 */ 1844, + /* 22A2 + 0338 -> 22AC */ 1837, + /* 22A8 + 0338 -> 22AD */ 1838, + /* 22A9 + 0338 -> 22AE */ 1839, + /* 22AB + 0338 -> 22AF */ 1840, + /* 22B2 + 0338 -> 22EA */ 1845, + /* 22B3 + 0338 -> 22EB */ 1846, + /* 22B4 + 0338 -> 22EC */ 1847, + /* 22B5 + 0338 -> 22ED */ 1848, + /* 3046 + 3099 -> 3094 */ 2286, + /* 304B + 3099 -> 304C */ 2261, + /* 304D + 3099 -> 304E */ 2262, + /* 304F + 3099 -> 3050 */ 2263, + /* 3051 + 3099 -> 3052 */ 2264, + /* 3053 + 3099 -> 3054 */ 2265, + /* 3055 + 3099 -> 3056 */ 2266, + /* 3057 + 3099 -> 3058 */ 2267, + /* 3059 + 3099 -> 305A */ 2268, + /* 305B + 3099 -> 305C */ 2269, + /* 305D + 3099 -> 305E */ 2270, + /* 305F + 3099 -> 3060 */ 2271, + /* 3061 + 3099 -> 3062 */ 2272, + /* 3064 + 3099 -> 3065 */ 2273, + /* 3066 + 3099 -> 3067 */ 2274, + /* 3068 + 3099 -> 3069 */ 2275, + /* 306F + 3099 -> 3070 */ 2276, + /* 306F + 309A -> 3071 */ 2277, + /* 3072 + 3099 -> 3073 */ 2278, + /* 3072 + 309A -> 3074 */ 2279, + /* 3075 + 3099 -> 3076 */ 2280, + /* 3075 + 309A -> 3077 */ 2281, + /* 3078 + 3099 -> 3079 */ 2282, + /* 3078 + 309A -> 307A */ 2283, + /* 307B + 3099 -> 307C */ 2284, + /* 307B + 309A -> 307D */ 2285, + /* 309D + 3099 -> 309E */ 2291, + /* 30A6 + 3099 -> 30F4 */ 2318, + /* 30AB + 3099 -> 30AC */ 2293, + /* 30AD + 3099 -> 30AE */ 2294, + /* 30AF + 3099 -> 30B0 */ 2295, + /* 30B1 + 3099 -> 30B2 */ 2296, + /* 30B3 + 3099 -> 30B4 */ 2297, + /* 30B5 + 3099 -> 30B6 */ 2298, + /* 30B7 + 3099 -> 30B8 */ 2299, + /* 30B9 + 3099 -> 30BA */ 2300, + /* 30BB + 3099 -> 30BC */ 2301, + /* 30BD + 3099 -> 30BE */ 2302, + /* 30BF + 3099 -> 30C0 */ 2303, + /* 30C1 + 3099 -> 30C2 */ 2304, + /* 30C4 + 3099 -> 30C5 */ 2305, + /* 30C6 + 3099 -> 30C7 */ 2306, + /* 30C8 + 3099 -> 30C9 */ 2307, + /* 30CF + 3099 -> 30D0 */ 2308, + /* 30CF + 309A -> 30D1 */ 2309, + /* 30D2 + 3099 -> 30D3 */ 2310, + /* 30D2 + 309A -> 30D4 */ 2311, + /* 30D5 + 3099 -> 30D6 */ 2312, + /* 30D5 + 309A -> 30D7 */ 2313, + /* 30D8 + 3099 -> 30D9 */ 2314, + /* 30D8 + 309A -> 30DA */ 2315, + /* 30DB + 3099 -> 30DC */ 2316, + /* 30DB + 309A -> 30DD */ 2317, + /* 30EF + 3099 -> 30F7 */ 2319, + /* 30F0 + 3099 -> 30F8 */ 2320, + /* 30F1 + 3099 -> 30F9 */ 2321, + /* 30F2 + 3099 -> 30FA */ 2322, + /* 30FD + 3099 -> 30FE */ 2323, + /* 11099 + 110BA -> 1109A */ 4588, + /* 1109B + 110BA -> 1109C */ 4589, + /* 110A5 + 110BA -> 110AB */ 4590, + /* 11131 + 11127 -> 1112E */ 4596, + /* 11132 + 11127 -> 1112F */ 4597, + /* 11347 + 1133E -> 1134B */ 4609, + /* 11347 + 11357 -> 1134C */ 4610, + /* 114B9 + 114B0 -> 114BC */ 4628, + /* 114B9 + 114BA -> 114BB */ 4627, + /* 114B9 + 114BD -> 114BE */ 4629, + /* 115B8 + 115AF -> 115BA */ 4632, + /* 115B9 + 115AF -> 115BB */ 4633, + /* 11935 + 11930 -> 11938 */ 4642 +}; + +/* Perfect hash function for recomposition */ +static int +Recomp_hash_func(const void *key) +{ + static const int16 h[1883] = { + 772, 773, 621, 32767, 32767, 387, 653, 196, + 32767, 32767, 855, 463, -19, 651, 32767, 32767, + 32767, 364, 32767, 32767, -108, 32767, 32767, 32767, + 32767, 0, -568, 32767, 32767, 32767, 0, 0, + 0, -103, 364, 0, 210, 732, 0, 0, + -506, 0, 0, 0, 32767, 32767, 0, 32767, + 407, -140, 32767, 409, 32767, 772, 0, 86, + 842, 934, 32767, 32767, -499, -355, 32767, 32767, + 532, 138, 174, -243, 860, 1870, 742, 32767, + 32767, 339, 32767, 1290, 0, 32767, 32767, 0, + -449, -1386, 1633, 560, 561, 32767, 1219, 1004, + 139, -804, 32767, -179, 141, 579, 1586, 32767, + 32767, 32767, 142, 199, 32767, 32767, 143, 0, + 32767, 32767, 314, 896, 32767, 32767, 428, 129, + 286, -58, 0, 68, 32767, 0, 244, -566, + 32767, 32767, 32767, 246, 32767, 32767, 0, 32767, + 32767, 271, -108, 928, 32767, 715, 32767, 32767, + -211, -497, 32767, 0, 1055, 1339, 32767, 0, + 32767, 32767, -968, -144, 32767, 32767, 248, 32767, + -161, 32767, 32767, 282, 32767, -372, 0, 2, + -137, 1116, 32767, 687, 32767, 459, 913, 0, + 461, 879, -816, 443, 32767, 32767, 462, 1089, + 32767, 1054, 0, 314, 447, -26, 480, 32767, + 64, 0, 0, 112, 32767, 66, 0, 646, + 603, 22, -292, 0, 710, 475, 32767, 24, + -781, 32767, 32767, 32767, 281, 307, 32767, 1289, + 32767, 0, 1064, -149, 454, 118, 32767, 32767, + 0, 32767, -126, 0, 32767, 32767, 858, 32767, + 32767, 32767, 1029, 886, 665, 209, 0, 26, + 359, 0, 0, -108, -508, -603, 894, 906, + 32767, 32767, 14, 0, 0, 534, 984, 876, + 32767, -93, 110, -367, 167, 843, 32767, 32767, + -947, -290, 169, 0, 0, 32767, -42, 564, + 0, -927, 32767, 817, 32767, 32767, 32767, 110, + 0, 32767, 32767, -38, 32767, 32767, -101, 694, + -142, 190, 191, 1288, 32767, -687, 194, -579, + 534, -452, 0, -72, 536, 765, 823, 266, + -259, 684, 767, 32767, 654, 32767, 32767, 64, + 920, 32767, 32767, 32767, 0, 1653, 0, 0, + 32767, 32767, -452, -222, 855, 0, 32767, -1153, + 127, 490, 449, 863, 32767, -144, 32767, -379, + 545, 32767, 32767, 32767, 530, 32767, 32767, 1331, + 611, -612, 332, 545, -73, 0, 604, 201, + 32767, -279, 338, 836, 340, 408, 32767, -60, + -358, 32767, 343, 69, 707, 0, -129, 582, + 32767, 0, 32767, 96, 392, 490, 639, 157, + -4, 406, 32767, 32767, -571, 1077, 546, 32767, + 551, 0, 0, 0, 32767, 32767, 348, 32767, + 498, -181, 0, -433, 1057, 260, 0, 32767, + 32767, 397, 32767, 816, -130, 32767, 624, 0, + 0, 32767, 32767, 32767, 485, 0, 32767, 32767, + 32767, 32767, 32767, 0, 32767, 32767, 32767, 1222, + -230, 32767, 797, -538, 32767, 974, 32767, 32767, + 831, 70, -658, 145, 0, 147, 0, 32767, + 1295, 32767, 0, 0, 895, 0, 0, -385, + 491, -287, 32767, -587, 32767, 32767, 32767, 813, + -471, -13, 32767, 32767, 32767, 0, 203, 411, + 470, 0, -546, -179, 146, 0, 0, 32767, + -468, 32767, 0, 0, 32767, 32767, 32767, 211, + 32767, 32767, 0, 32767, 0, 52, 32767, 0, + 32767, 0, 692, 990, 32767, 32767, 32767, 56, + -507, 784, 951, 0, 32767, 0, 697, 32767, + 187, 0, 32767, 32767, 430, 1209, 682, 32767, + 130, 0, -25, 0, -1006, 0, 32767, 214, + 433, 22, 0, -1119, 32767, 285, 32767, 32767, + 32767, 216, 32767, 32767, 32767, 217, 527, 32767, + 32767, 32767, 829, 485, 419, 717, 620, 731, + 32767, 470, 0, -145, -620, 1162, -644, 848, + 287, -632, 32767, 32767, 32767, 32767, 381, 32767, + 510, 511, -554, -2, 32767, 0, 0, 698, + 32767, 32767, 436, 1154, 32767, 463, 32767, 32767, + 627, 517, 32767, 32767, 854, 579, 723, 396, + 110, -42, 354, 32767, 664, 32767, 32767, 0, + 0, 32767, 65, -163, 67, 140, 69, 341, + 70, 71, 402, 73, 623, 544, 624, 417, + -1375, 648, 32767, -26, 904, 0, 548, 0, + 0, 32767, 32767, 855, 32767, 488, -524, 599, + 130, 131, 32767, 32767, 542, -1110, -324, -462, + 32767, -405, -440, 0, 0, 629, 850, 0, + 741, 257, 258, 32767, 32767, 0, 32767, 923, + 0, 32767, 0, 32767, 1559, 32767, 32767, 32767, + 671, 32767, 134, 32767, 32767, -336, -104, 576, + 577, 829, 32767, 32767, 762, 902, 32767, 0, + 32767, 0, 1506, 887, 32767, 636, 601, 2465, + 426, 0, 236, 317, 427, 968, 32767, -975, + -559, -343, 341, 32767, 937, 241, 0, 32767, + 32767, 547, 32767, 32767, 32767, 32767, 32767, 789, + 0, 32767, 32767, 32767, 0, 0, 0, 32767, + -192, 859, 1185, 1153, 69, 32767, 32767, 32767, + -539, 32767, 32767, 0, 32767, 32767, 32767, 32767, + 640, 578, 32767, 32767, -766, 32767, 32767, 32767, + 32767, 1050, -572, 32767, 32767, 32767, 32767, 1268, + 32767, 32767, 32767, 754, 32767, 32767, 1640, 179, + 804, 32767, 32767, 32767, 32767, 0, 684, 943, + 1006, 32767, 32767, 652, 0, 32767, 1041, 32767, + 718, 791, 32767, 274, 697, 32767, 32767, 0, + 32767, 32767, 32767, 0, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 735, + 0, 32767, 32767, 32767, 275, 358, 688, 32767, + 32767, 32767, 548, -87, 770, 32767, -42, 0, + 551, 32767, 691, 222, 32767, 32767, 32767, 32767, + 0, 1273, 403, -121, 806, 553, 554, 163, + 32767, 32767, 892, 825, 32767, 32767, -490, 32767, + 32767, 32767, 32767, 32767, -109, 744, 910, 32767, + 91, 32767, 32767, 0, 0, 32767, 32767, 32767, + 1521, 50, 701, 32767, 32767, 32767, 32767, 164, + 658, 32767, 288, 0, 32767, 0, 51, 0, + 32767, 32767, 32767, 32767, 555, 1547, 32767, 32767, + 595, 585, 429, 32767, -80, 32767, 1258, 0, + 540, 486, -434, 865, 0, 192, 0, 884, + 0, 0, 0, 175, 555, 0, 32767, 32767, + 0, 32767, -566, 866, 591, 32767, 32767, 32767, + 32767, 32767, 496, 495, -215, 32767, 849, -772, + 32767, 32767, 502, 178, 483, 32767, 912, 793, + 794, 0, 32767, 32767, 32767, -556, 499, 838, + 32767, 32767, -506, 331, 0, 0, -1096, 512, + 880, 0, 774, -338, 649, 32767, 270, 32767, + 32767, -624, 328, 459, 32767, 32767, 32767, 32767, + 329, -201, -835, 813, -879, 560, 0, -212, + -114, 35, -494, 37, 523, 653, 751, -653, + -743, 32767, 1356, 818, 32767, 32767, 856, 0, + 44, 902, 0, 0, 0, 0, 32767, -26, + 526, 795, 456, 32767, 104, -209, -341, 133, + -372, 0, 45, 110, 111, 0, 511, 47, + 114, 32767, 32767, 93, 48, 116, -1031, -279, + 32767, 192, 0, 32767, 453, 415, 0, -190, + 32767, 471, 240, 175, 29, 665, 684, 0, + -11, -95, -344, 32767, 245, 148, 0, 530, + 0, 1185, -615, -712, 693, 784, 32767, 0, + -776, 32767, 32767, -813, 0, 0, 0, 207, + 208, 32767, 674, 32767, 742, -289, 249, 32767, + 520, 929, -50, 781, 0, -778, 32767, 0, + 302, 32767, 720, -465, 0, 32767, 32767, 32767, + 0, 0, 32767, 833, 328, 806, 32767, -403, + 0, 32767, -77, 32767, 0, 441, 930, 32767, + 643, 0, 32767, 1938, 0, 1334, 381, 32767, + 216, 32767, 32767, 0, 32767, 484, 383, 0, + 242, 395, 0, 32767, 32767, 32767, -781, 355, + 356, 32767, 292, 706, 32767, 32767, 32767, 32767, + 32767, -410, 32767, 32767, 782, 32767, 189, 32767, + 32767, 943, 0, -212, 407, 335, 0, 135, + 32767, 616, 0, -497, 0, -67, 853, 32767, + 700, 32767, 0, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 0, 459, -48, 32767, 58, 0, + -856, 1017, 32767, 59, 916, -731, 32767, 940, + -855, 347, 650, 0, 678, 32767, 0, 32767, + 32767, 530, 32767, 0, -80, 32767, -730, 32767, + 1214, 799, 58, 651, 841, 0, 0, -589, + -1530, -478, 651, 652, 93, 576, -1215, 32767, + 125, 32767, 1279, 32767, 32767, 0, 32767, 0, + -367, 416, -1236, 32767, 418, 32767, 815, 558, + 559, 781, 419, 32767, 739, 32767, 0, 32767, + 128, 570, 1349, -298, -66, 0, 147, -488, + 32767, 590, 189, 274, 524, 32767, 1082, -209, + 32767, 423, 32767, 32767, 975, 573, 32767, 424, + 32767, 32767, 1241, 32767, 32767, 32767, 32767, 32767, + 612, 391, 32767, 0, -803, 1004, -561, 32767, + 32767, 735, 870, 32767, 0, 32767, 32767, -123, + 99, 210, 600, 1294, 109, 1053, 32767, 307, + 834, 32767, 0, 1651, 32767, 644, 32767, 32767, + 0, 32767, -801, 385, 379, 32767, -368, 32767, + 32767, 830, 0, 32767, 32767, 739, 371, 372, + -275, 32767, 32767, 331, -780, 32767, 0, 1229, + -1462, 913, 266, 827, 125, 32767, 32767, 32767, + 393, 32767, 631, -33, -883, -661, -204, 6, + -19, 257, 8, 9, 118, 519, 615, -541, + -893, 0, 32767, 0, 1156, 15, 900, 32767, + 32767, 32767, 32767, 32767, 32767, 1022, 376, 0, + 32767, 32767, -972, 676, 840, -661, 631, 58, + 0, 17, 32767, 0, -799, 82, 0, 32767, + 32767, 680, 32767, 905, 0, 0, 32767, 32767, + 0, 0, 32767, 0, 828, 386, 802, 0, + 146, 0, 148, 32767, -1146, 0, 150, 151, + -743, 153, 154, 32767, 32767, 442, 32767, 743, + 0, 0, 746, 0, 32767, 32767, 32767, 98, + 32767, 157, 0, 696, 0, 32767, 32767, -294, + 32767, 158, 159, 32767, 0, 32767, 160, 32767, + 933, 32767, 32767, -50, 759, 824, 162, 672, + 32767, 356, 0, 356, 32767, 32767, 0, 0, + 656, 692, 253, 254, -374, 102, 256, 32767, + 0, 0, 32767, 32767, 259, 32767, 63, 260, + 510, 261, 32767, 0, 32767, 1061, 32767, 521, + 32767, 32767, 32767, 32767, 32767, 32767, 316, 317, + 846, 0, 32767, -500, 318, 0, 32767, 32767, + 263, 0, 790, 872, 32767, 32767, 32767, 2171, + 264, 32767, 32767, 32767, 32767, 486, 334, 465, + 32767, 466, 32767, 444, 606, 32767, 0, 445, + 320, -317, 0, 520, 322, 718, 32767, 32767, + 32767, 0, 1013, 32767, 32767, 32767, 32767, 32767, + 32767, 611, 32767, 0, 0, 32767, 32767, -120, + 156, 613, 0, 0, 32767, -68, 32767, 622, + 32767, 32767, 32767, 32767, 32767, 455, 32767, 32767, + 32767, 403, 533, 0, -161, 405, 95, 96, + 32767, 97, 32767, 0, 29, 0, 32767, 32767, + 30, 32767, 99, 32767, 32767, 0, 161, 32767, + 97, 0, 32, 32767, 32767, 0, 0, 315, + 32767, 32767, 414, 966, 0, 585, 32767, 32767, + -616, -256, 171, 172, 666, 101, 562, 563, + 32767, 95, 0, 0, 1492, 390, -251, 103, + 32767, 0, 32767, 188, 1487, 32767, 0, 0, + 586, 668, -126, 0, 0, 32767, 32767, 204, + 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 32767, 656, 32767, 32767, + 599, 0, 222, 32767, 0, 1368, -412, 435, + 32767, 936, 32767, -17, 32767, 832, 32767, 437, + 0, -518, 787, 32767, 864, -449, 0, 636, + 713, 206, 592, 572, 0, 483, -139, 32767, + 32767, 180, 818, 32767, 32767, 1304, 0, 32767, + 274, 0, 0, 0, 0, 705, 32767, 32767, + 32767, 0, -272, 0, 502, 503, 319, 0, + 32767, 0, 13, 32767, 32767, 0, 32767, 270, + 737, 0, 32767, 32767, 32767, 901, 32767, 616, + 180, 32767, 721, 353, 32767, 0, 32767, 32767, + -199, 0, 280, 788, 32767, 940, 32767, 51, + 0, 400, 53, 0, 54, -637, 0, -453, + 0, 0, 0, 380, 0, 32767, 504, 0, + 2049, 0, -964, 32767, 0, 32767, 32767, 32767, + 32767, 32767, 32767, 798, 32767, 32767, 32767, 0, + 538, 488, 0, 32767, -528, 57, 819, 32767, + 32767, 1244, 0, 488, 739, 908, 32767, 32767, + 0, 32767, 32767, 0, 55, 533, 0, 32767, + 814, 0, 32767, 458, 0, 32767, 32767, 32767, + 32767, 32767, 32767, 32767, 776, 777, 920, 0, + 0, 755, 32767, 0, 32767, 32767, 0, 32767, + 55, -954, 0, 372, 166, 218, 165, 857, + 221, 675, 0, 223, 224, -155, 226, 32767, + 1851, 227, 32767, 32767, 1192, 0, 229, 0, + -72, 0, 865, 0, 0, -330, 0, 683, + 32767, -550, -196, 725, -573, 293, 102, 32767, + -589, 296, 297, 298, 231, -256, 300, 32767, + 32767, 301, 233, 868, 32767, 234, 0, 811, + 1187, 32767, 32767, 0, 32767, 518, 0, 361, + 362, 466, 0, 365, 32767, -179, 366, 367, + 874, 369, 305, 0, 32767, 0, 32767, 0, + 32767, 2000, 1215, 451, 652, 0, 0, 799, + 32767, 32767, 32767, + }; + + const unsigned char *k = (const unsigned char *) key; + size_t keylen = 8; + uint32 a = 0; + uint32 b = 0; + + while (keylen--) + { + unsigned char c = *k++; + + a = a * 257 + c; + b = b * 17 + c; + } + return h[a % 1883] + h[b % 1883]; +} + +/* Hash lookup information for recomposition */ +static const pg_unicode_recompinfo UnicodeRecompInfo = +{ + RecompInverseLookup, + Recomp_hash_func, + 941 +}; -- 2.22.0