speed up unicode decomposition and recomposition

Started by John Naylorabout 5 years ago28 messages
#1John Naylor
john.naylor@enterprisedb.com
1 attachment(s)

Having committed the optimization for unicode normalization quick check,
Michael Paquier suggested I might do the same for decomposition as well. I
wrote:

I'll
do some performance testing soon. Note that a 25kB increase in size could
be present in frontend binaries as well in this case. While looking at
decomposition, I noticed that recomposition does a linear search through
all 6600+ entries, although it seems only about 800 are valid for that.
That could be optimized as well now, since with hashing we have more
flexibility in the ordering and can put the recomp-valid entries in front.
I'm not yet sure if it's worth the additional complexity. I'll take a look
and start a new thread.

The attached patch uses a perfect hash for codepoint decomposition, and for
recomposing reduces the linear search from 6604 entries to 942.

The performance is very nice, and if I'd known better I would have done
this first, since the decomp array is as big as the two quick check arrays
put together:

Normalize, decomp only

select count(normalize(t, NFD)) from (
select md5(i::text) as t from
generate_series(1,100000) as i
) s;

master patchÏ
887ms 231ms

select count(normalize(t, NFD)) from (
select repeat(U&'\00E4\00C5\0958\00F4\1EBF\3300\1FE2\3316\2465\322D', i % 3
+ 1) as t from
generate_series(1,100000) as i
) s;

master patch
1110ms 208ms

Normalize, decomp+recomp (note: 100x less data)

select count(normalize(t, NFC)) from (
select md5(i::text) as t from
generate_series(1,1000) as i
) s;

master patch
194ms 50.6ms

select count(normalize(t, NFC)) from (
select repeat(U&'\00E4\00C5\0958\00F4\1EBF\3300\1FE2\3316\2465\322D', i % 3
+ 1) as t from
generate_series(1,1000) as i
) s;

master patch
137ms 39.4ms

Quick check is another 2x faster on top of previous gains, since it tests
canonical class via the decomposition array:

-- all chars are quickcheck YES
select count(*) from (
select md5(i::text) as t from
generate_series(1,100000) as i
) s
where t is NFC normalized;

master patch
296ms 131ms

Some other considerations:
- As I alluded above, this adds ~26kB to libpq because of SASLPrep. Since
the decomp array was reordered to optimize linear search, it can no longer
be used for binary search. It's possible to build two arrays, one for
frontend and one for backend, but that's additional complexity. We could
also force frontend to do a linear search all the time, but that seems
foolish. I haven't checked if it's possible to exclude the hash from
backend's libpq.
- I could split out the two approaches into separate patches, but it'd be
rather messy.

I'll add a CF entry for this.

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

Attachments:

v1-0001-Optimize-unicode-decomposition-and-recomposition.patchapplication/octet-stream; name=v1-0001-Optimize-unicode-decomposition-and-recomposition.patchDownload
From bc65c8aaaeffe392c9fb55c2228becebcf0cf93e Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Wed, 14 Oct 2020 12:38:44 -0400
Subject: [PATCH v1] Optimize unicode decomposition and recomposition

Use a perfect hash to look up a codepoint in the decomposition
array. Since the order of the array is less important now, this
allows us to move all recomposeable codepoints to the front. Linear
search now only scans 1/6 of the array, speeding up recomposition
accordingly. Normalization is about 4x faster, and testing for
normalized strings is about 2x faster.
---
 .../unicode/generate-unicode_norm_table.pl    |   96 +-
 src/common/unicode_norm.c                     |   82 +-
 src/include/common/unicode_norm_table.h       | 3638 ++++++++++++-----
 src/tools/pgindent/exclude_file_patterns      |    3 +-
 4 files changed, 2796 insertions(+), 1023 deletions(-)

diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 7ce15e1a03..ffa47b3638 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -10,6 +10,10 @@
 use strict;
 use warnings;
 
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
 my $output_file = "unicode_norm_table.h";
 
 my $FH;
@@ -96,6 +100,17 @@ typedef struct
 								 * decomposition itself if DECOMP_INLINE */
 } pg_unicode_decomposition;
 
+/* Typedef for hash function on quick check table */
+typedef int (*decomp_hash_func) (const void *key);
+
+/* Information for decomposition lookup with perfect hash function */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	decomp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
 #define DECOMP_NO_COMPOSE	0x80	/* don't use for re-composition */
 #define DECOMP_INLINE		0x40	/* decomposition is stored inline in
 									 * dec_index */
@@ -114,13 +129,18 @@ HEADER
 my $decomp_index  = 0;
 my $decomp_string = "";
 
-my $last_code = $characters[-1]->{code};
+# First iterate through the codes in order to derive some values
+# and build the output string.
 foreach my $char (@characters)
 {
 	my $code   = $char->{code};
 	my $class  = $char->{class};
 	my $decomp = $char->{decomp};
 
+	# Give all entries a default sort order. Later, we will mark entries
+	# needed for recomposition with an earlier sort order
+	$char->{sortorder} = 0;
+
 	# The character decomposition mapping field in UnicodeData.txt is a list
 	# of unicode codepoints, separated by space. But it can be prefixed with
 	# so-called compatibility formatting tag, like "<compat>", or "<font>".
@@ -157,25 +177,33 @@ foreach my $char (@characters)
 			&& $character_hash{$first_decomp}->{class} != 0)
 		{
 			$flags .= " | DECOMP_NO_COMPOSE";
-			$comment = "non-starter decomposition";
+			$char->{comment} = "non-starter decomposition";
 		}
 		else
 		{
 			foreach my $lcode (@composition_exclusion_codes)
 			{
-				if ($lcode eq $char->{code})
+				if ($lcode eq $code)
 				{
 					$flags .= " | DECOMP_NO_COMPOSE";
-					$comment = "in exclusion list";
+					$char->{comment} = "in exclusion list";
 					last;
 				}
 			}
 		}
+
+		# Set sortorder for some entries of decomp size 2 so that they
+		# come before the rest.
+		# XXX This must match the DECOMPOSITION_NO_COMPOSE C macro above!
+		# See the inverse lookup in recompose_code() found in
+		# common/unicode_norm.c.
+		$char->{sortorder} = -1
+		  if ($flags !~ /DECOMP_COMPAT/ && $flags !~ /DECOMP_NO_COMPOSE/)
 	}
 
 	if ($decomp_size == 0)
 	{
-		print $OUTPUT "\t{0x$code, $class, 0$flags, 0}";
+		$char->{output} = sprintf "\t{0x$code, $class, 0$flags, 0}";
 	}
 	elsif ($decomp_size == 1 && length($first_decomp) <= 4)
 	{
@@ -183,11 +211,11 @@ foreach my $char (@characters)
 		# The decomposition consists of a single codepoint, and it fits
 		# in a uint16, so we can store it "inline" in the main table.
 		$flags .= " | DECOMP_INLINE";
-		print $OUTPUT "\t{0x$code, $class, 1$flags, 0x$first_decomp}";
+		$char->{output} = sprintf "\t{0x$code, $class, 1$flags, 0x$first_decomp}";
 	}
 	else
 	{
-		print $OUTPUT
+		$char->{output} = sprintf
 		  "\t{0x$code, $class, $decomp_size$flags, $decomp_index}";
 
 		# Now save the decompositions into a dedicated area that will
@@ -203,21 +231,18 @@ foreach my $char (@characters)
 
 		$decomp_index = $decomp_index + $decomp_size;
 	}
+}
 
-	# Print a comma after all items except the last one.
-	print $OUTPUT "," unless ($code eq $last_code);
-	if ($comment ne "")
-	{
+my @code_packed;
+foreach my $char (sort recomp_sort @characters)
+{
+	# Save the code point bytes as a string in network order.
+	push @code_packed, pack('N', hex($char->{code}));
 
-		# If the line is wide already, indent the comment with one tab,
-		# otherwise with two. This is to make the output match the way
-		# pgindent would mangle it. (This is quite hacky. To do this
-		# properly, we should actually track how long the line is so far,
-		# but this works for now.)
-		print $OUTPUT "\t" if ($decomp_index < 10);
+	print $OUTPUT $char->{output};
 
-		print $OUTPUT "\t/* $comment */" if ($comment ne "");
-	}
+	print $OUTPUT ",";
+	print $OUTPUT "\t/* $char->{comment} */" if ($char->{comment});
 	print $OUTPUT "\n";
 }
 print $OUTPUT "\n};\n\n";
@@ -231,4 +256,37 @@ $decomp_string
 };
 HEADER
 
+# Emit the definition of the perfect hash function.
+my $funcname = 'DecompMain_hash_func';
+my $f        = PerfectHash::generate_hash_function(\@code_packed, $funcname,
+	fixed_key_length => 4);
+print $OUTPUT "\n/* Perfect hash function for decomposition */\n";
+print $OUTPUT "static $f\n";
+
+# Emit the structure that wraps the hash lookup information into
+# one variable.
+print $OUTPUT <<HEADER;
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo =
+{
+	UnicodeDecompMain,
+	$funcname,
+	$num_characters
+};
+HEADER
+
 close $OUTPUT;
+
+# Sort by specially-marked sort order, then by code point.
+sub recomp_sort
+{
+	my $anum = hex($a->{code});
+	my $bnum = hex($a->{code});
+
+	return -1 if ($a->{sortorder} < $b->{sortorder});
+	return 1 if ($a->{sortorder} > $b->{sortorder});
+
+	return -1 if $anum < $bnum;
+	return 0 if $anum == $bnum;
+	return 1 if $anum > $bnum;
+}
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 4bb6a0f587..99bfab177d 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -44,29 +44,37 @@
 #define NCOUNT		VCOUNT * TCOUNT
 #define SCOUNT		LCOUNT * NCOUNT
 
-/* comparison routine for bsearch() of decomposition lookup table. */
-static int
-conv_compare(const void *p1, const void *p2)
-{
-	uint32		v1,
-				v2;
-
-	v1 = *(const uint32 *) p1;
-	v2 = ((const pg_unicode_decomposition *) p2)->codepoint;
-	return (v1 > v2) ? 1 : ((v1 == v2) ? 0 : -1);
-}
 
 /*
  * Get the entry corresponding to code in the decomposition lookup table.
  */
-static pg_unicode_decomposition *
+static const pg_unicode_decomposition *
 get_code_entry(pg_wchar code)
 {
-	return bsearch(&(code),
-				   UnicodeDecompMain,
-				   lengthof(UnicodeDecompMain),
-				   sizeof(pg_unicode_decomposition),
-				   conv_compare);
+	int			h;
+	uint32		hashkey;
+	pg_unicode_decompinfo decompinfo = UnicodeDecompInfo;
+
+	/*
+	 * Compute the hash function. The hash key is the codepoint with the bytes
+	 * in network order.
+	 */
+	hashkey = pg_hton32(code);
+	h = decompinfo.hash(&hashkey);
+
+	/* An out-of-range result implies no match */
+	if (h < 0 || h >= decompinfo.num_decomps)
+		return NULL;
+
+	/*
+	 * Since it's a perfect hash, we need only match to the specific codepoint
+	 * it identifies.
+	 */
+	if (code != decompinfo.decomps[h].codepoint)
+		return NULL;
+
+	/* Success! */
+	return &decompinfo.decomps[h];
 }
 
 /*
@@ -77,7 +85,7 @@ get_code_entry(pg_wchar code)
  * is only valid until next call to this function!
  */
 static const pg_wchar *
-get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
+get_code_decomposition(const pg_unicode_decomposition *entry, int *dec_size)
 {
 	static pg_wchar x;
 
@@ -104,7 +112,7 @@ get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
 static int
 get_decomposed_size(pg_wchar code, bool compat)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			size = 0;
 	int			i;
 	const uint32 *decomp;
@@ -197,17 +205,31 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 		 * Do an inverse lookup of the decomposition tables to see if anything
 		 * matches. The comparison just needs to be a perfect match on the
 		 * sub-table of size two, because the start character has already been
-		 * recomposed partially.
+		 * recomposed partially. The array UnicodeDecompMain should have all
+		 * recomposeable codepoints at the front as a performance optimization.
+		 * See common/generate-unicode_norm_table.pl.
 		 */
 		for (i = 0; i < lengthof(UnicodeDecompMain); i++)
 		{
 			const pg_unicode_decomposition *entry = &UnicodeDecompMain[i];
 
-			if (DECOMPOSITION_SIZE(entry) != 2)
-				continue;
-
-			if (DECOMPOSITION_NO_COMPOSE(entry))
-				continue;
+			if (DECOMPOSITION_SIZE(entry) != 2 ||
+				DECOMPOSITION_NO_COMPOSE(entry))
+			{
+#ifdef USE_ASSERT_CHECKING
+				/*
+				 * Verify that there are no recomposeable codepoints
+				 * from this point forwards.
+				 */
+				for (int j = i; j < lengthof(UnicodeDecompMain); j++)
+				{
+					entry = &UnicodeDecompMain[j];
+					Assert(DECOMPOSITION_SIZE(entry) != 2 ||
+						   DECOMPOSITION_NO_COMPOSE(entry));
+				}
+#endif
+				break;
+			}
 
 			if (start == UnicodeDecomp_codepoints[entry->dec_index] &&
 				code == UnicodeDecomp_codepoints[entry->dec_index + 1])
@@ -231,7 +253,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 static void
 decompose_code(pg_wchar code, bool compat, pg_wchar **result, int *current)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			i;
 	const uint32 *decomp;
 	int			dec_size;
@@ -358,8 +380,8 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 		pg_wchar	prev = decomp_chars[count - 1];
 		pg_wchar	next = decomp_chars[count];
 		pg_wchar	tmp;
-		pg_unicode_decomposition *prevEntry = get_code_entry(prev);
-		pg_unicode_decomposition *nextEntry = get_code_entry(next);
+		const pg_unicode_decomposition *prevEntry = get_code_entry(prev);
+		const pg_unicode_decomposition *nextEntry = get_code_entry(next);
 
 		/*
 		 * If no entries are found, the character used is either an Hangul
@@ -417,7 +439,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 	for (count = 1; count < decomp_size; count++)
 	{
 		pg_wchar	ch = decomp_chars[count];
-		pg_unicode_decomposition *ch_entry = get_code_entry(ch);
+		const pg_unicode_decomposition *ch_entry = get_code_entry(ch);
 		int			ch_class = (ch_entry == NULL) ? 0 : ch_entry->comb_class;
 		pg_wchar	composite;
 
@@ -458,7 +480,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 static uint8
 get_canonical_class(pg_wchar ch)
 {
-	pg_unicode_decomposition *entry = get_code_entry(ch);
+	const pg_unicode_decomposition *entry = get_code_entry(ch);
 
 	if (!entry)
 		return 0;
diff --git a/src/include/common/unicode_norm_table.h b/src/include/common/unicode_norm_table.h
index 96d43b893c..ad5792dbb7 100644
--- a/src/include/common/unicode_norm_table.h
+++ b/src/include/common/unicode_norm_table.h
@@ -25,6 +25,17 @@ typedef struct
 								 * decomposition itself if DECOMP_INLINE */
 } pg_unicode_decomposition;
 
+/* Typedef for hash function on quick check table */
+typedef int (*decomp_hash_func) (const void *key);
+
+/* Information for decomposition lookup with perfect hash function */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	decomp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
 #define DECOMP_NO_COMPOSE	0x80	/* don't use for re-composition */
 #define DECOMP_INLINE		0x40	/* decomposition is stored inline in
 									 * dec_index */
@@ -38,20 +49,6 @@ typedef struct
 /* Table of Unicode codepoints and their decompositions */
 static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 {
-	{0x00A0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0020},
-	{0x00A8, 0, 2 | DECOMP_COMPAT, 0},
-	{0x00AA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0061},
-	{0x00AF, 0, 2 | DECOMP_COMPAT, 2},
-	{0x00B2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0032},
-	{0x00B3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0033},
-	{0x00B4, 0, 2 | DECOMP_COMPAT, 4},
-	{0x00B5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03BC},
-	{0x00B8, 0, 2 | DECOMP_COMPAT, 6},
-	{0x00B9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0031},
-	{0x00BA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006F},
-	{0x00BC, 0, 3 | DECOMP_COMPAT, 8},
-	{0x00BD, 0, 3 | DECOMP_COMPAT, 11},
-	{0x00BE, 0, 3 | DECOMP_COMPAT, 14},
 	{0x00C0, 0, 2, 17},
 	{0x00C1, 0, 2, 19},
 	{0x00C2, 0, 2, 21},
@@ -150,8 +147,6 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x012E, 0, 2, 207},
 	{0x012F, 0, 2, 209},
 	{0x0130, 0, 2, 211},
-	{0x0132, 0, 2 | DECOMP_COMPAT, 213},
-	{0x0133, 0, 2 | DECOMP_COMPAT, 215},
 	{0x0134, 0, 2, 217},
 	{0x0135, 0, 2, 219},
 	{0x0136, 0, 2, 221},
@@ -162,15 +157,12 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x013C, 0, 2, 231},
 	{0x013D, 0, 2, 233},
 	{0x013E, 0, 2, 235},
-	{0x013F, 0, 2 | DECOMP_COMPAT, 237},
-	{0x0140, 0, 2 | DECOMP_COMPAT, 239},
 	{0x0143, 0, 2, 241},
 	{0x0144, 0, 2, 243},
 	{0x0145, 0, 2, 245},
 	{0x0146, 0, 2, 247},
 	{0x0147, 0, 2, 249},
 	{0x0148, 0, 2, 251},
-	{0x0149, 0, 2 | DECOMP_COMPAT, 253},
 	{0x014C, 0, 2, 255},
 	{0x014D, 0, 2, 257},
 	{0x014E, 0, 2, 259},
@@ -218,20 +210,10 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x017C, 0, 2, 343},
 	{0x017D, 0, 2, 345},
 	{0x017E, 0, 2, 347},
-	{0x017F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0073},
 	{0x01A0, 0, 2, 349},
 	{0x01A1, 0, 2, 351},
 	{0x01AF, 0, 2, 353},
 	{0x01B0, 0, 2, 355},
-	{0x01C4, 0, 2 | DECOMP_COMPAT, 357},
-	{0x01C5, 0, 2 | DECOMP_COMPAT, 359},
-	{0x01C6, 0, 2 | DECOMP_COMPAT, 361},
-	{0x01C7, 0, 2 | DECOMP_COMPAT, 363},
-	{0x01C8, 0, 2 | DECOMP_COMPAT, 365},
-	{0x01C9, 0, 2 | DECOMP_COMPAT, 367},
-	{0x01CA, 0, 2 | DECOMP_COMPAT, 369},
-	{0x01CB, 0, 2 | DECOMP_COMPAT, 371},
-	{0x01CC, 0, 2 | DECOMP_COMPAT, 373},
 	{0x01CD, 0, 2, 375},
 	{0x01CE, 0, 2, 377},
 	{0x01CF, 0, 2, 379},
@@ -265,9 +247,6 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x01EE, 0, 2, 435},
 	{0x01EF, 0, 2, 437},
 	{0x01F0, 0, 2, 439},
-	{0x01F1, 0, 2 | DECOMP_COMPAT, 441},
-	{0x01F2, 0, 2 | DECOMP_COMPAT, 443},
-	{0x01F3, 0, 2 | DECOMP_COMPAT, 445},
 	{0x01F4, 0, 2, 447},
 	{0x01F5, 0, 2, 449},
 	{0x01F8, 0, 2, 451},
@@ -322,144 +301,8 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x0231, 0, 2, 549},
 	{0x0232, 0, 2, 551},
 	{0x0233, 0, 2, 553},
-	{0x02B0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0068},
-	{0x02B1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0266},
-	{0x02B2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006A},
-	{0x02B3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0072},
-	{0x02B4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0279},
-	{0x02B5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x027B},
-	{0x02B6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0281},
-	{0x02B7, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0077},
-	{0x02B8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0079},
-	{0x02D8, 0, 2 | DECOMP_COMPAT, 555},
-	{0x02D9, 0, 2 | DECOMP_COMPAT, 557},
-	{0x02DA, 0, 2 | DECOMP_COMPAT, 559},
-	{0x02DB, 0, 2 | DECOMP_COMPAT, 561},
-	{0x02DC, 0, 2 | DECOMP_COMPAT, 563},
-	{0x02DD, 0, 2 | DECOMP_COMPAT, 565},
-	{0x02E0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0263},
-	{0x02E1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006C},
-	{0x02E2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0073},
-	{0x02E3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0078},
-	{0x02E4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0295},
-	{0x0300, 230, 0, 0},
-	{0x0301, 230, 0, 0},
-	{0x0302, 230, 0, 0},
-	{0x0303, 230, 0, 0},
-	{0x0304, 230, 0, 0},
-	{0x0305, 230, 0, 0},
-	{0x0306, 230, 0, 0},
-	{0x0307, 230, 0, 0},
-	{0x0308, 230, 0, 0},
-	{0x0309, 230, 0, 0},
-	{0x030A, 230, 0, 0},
-	{0x030B, 230, 0, 0},
-	{0x030C, 230, 0, 0},
-	{0x030D, 230, 0, 0},
-	{0x030E, 230, 0, 0},
-	{0x030F, 230, 0, 0},
-	{0x0310, 230, 0, 0},
-	{0x0311, 230, 0, 0},
-	{0x0312, 230, 0, 0},
-	{0x0313, 230, 0, 0},
-	{0x0314, 230, 0, 0},
-	{0x0315, 232, 0, 0},
-	{0x0316, 220, 0, 0},
-	{0x0317, 220, 0, 0},
-	{0x0318, 220, 0, 0},
-	{0x0319, 220, 0, 0},
-	{0x031A, 232, 0, 0},
-	{0x031B, 216, 0, 0},
-	{0x031C, 220, 0, 0},
-	{0x031D, 220, 0, 0},
-	{0x031E, 220, 0, 0},
-	{0x031F, 220, 0, 0},
-	{0x0320, 220, 0, 0},
-	{0x0321, 202, 0, 0},
-	{0x0322, 202, 0, 0},
-	{0x0323, 220, 0, 0},
-	{0x0324, 220, 0, 0},
-	{0x0325, 220, 0, 0},
-	{0x0326, 220, 0, 0},
-	{0x0327, 202, 0, 0},
-	{0x0328, 202, 0, 0},
-	{0x0329, 220, 0, 0},
-	{0x032A, 220, 0, 0},
-	{0x032B, 220, 0, 0},
-	{0x032C, 220, 0, 0},
-	{0x032D, 220, 0, 0},
-	{0x032E, 220, 0, 0},
-	{0x032F, 220, 0, 0},
-	{0x0330, 220, 0, 0},
-	{0x0331, 220, 0, 0},
-	{0x0332, 220, 0, 0},
-	{0x0333, 220, 0, 0},
-	{0x0334, 1, 0, 0},
-	{0x0335, 1, 0, 0},
-	{0x0336, 1, 0, 0},
-	{0x0337, 1, 0, 0},
-	{0x0338, 1, 0, 0},
-	{0x0339, 220, 0, 0},
-	{0x033A, 220, 0, 0},
-	{0x033B, 220, 0, 0},
-	{0x033C, 220, 0, 0},
-	{0x033D, 230, 0, 0},
-	{0x033E, 230, 0, 0},
-	{0x033F, 230, 0, 0},
-	{0x0340, 230, 1 | DECOMP_INLINE, 0x0300},
-	{0x0341, 230, 1 | DECOMP_INLINE, 0x0301},
-	{0x0342, 230, 0, 0},
-	{0x0343, 230, 1 | DECOMP_INLINE, 0x0313},
-	{0x0344, 230, 2 | DECOMP_NO_COMPOSE, 567},	/* non-starter decomposition */
-	{0x0345, 240, 0, 0},
-	{0x0346, 230, 0, 0},
-	{0x0347, 220, 0, 0},
-	{0x0348, 220, 0, 0},
-	{0x0349, 220, 0, 0},
-	{0x034A, 230, 0, 0},
-	{0x034B, 230, 0, 0},
-	{0x034C, 230, 0, 0},
-	{0x034D, 220, 0, 0},
-	{0x034E, 220, 0, 0},
-	{0x0350, 230, 0, 0},
-	{0x0351, 230, 0, 0},
-	{0x0352, 230, 0, 0},
-	{0x0353, 220, 0, 0},
-	{0x0354, 220, 0, 0},
-	{0x0355, 220, 0, 0},
-	{0x0356, 220, 0, 0},
-	{0x0357, 230, 0, 0},
-	{0x0358, 232, 0, 0},
-	{0x0359, 220, 0, 0},
-	{0x035A, 220, 0, 0},
-	{0x035B, 230, 0, 0},
-	{0x035C, 233, 0, 0},
-	{0x035D, 234, 0, 0},
-	{0x035E, 234, 0, 0},
-	{0x035F, 233, 0, 0},
-	{0x0360, 234, 0, 0},
-	{0x0361, 234, 0, 0},
-	{0x0362, 233, 0, 0},
-	{0x0363, 230, 0, 0},
-	{0x0364, 230, 0, 0},
-	{0x0365, 230, 0, 0},
-	{0x0366, 230, 0, 0},
-	{0x0367, 230, 0, 0},
-	{0x0368, 230, 0, 0},
-	{0x0369, 230, 0, 0},
-	{0x036A, 230, 0, 0},
-	{0x036B, 230, 0, 0},
-	{0x036C, 230, 0, 0},
-	{0x036D, 230, 0, 0},
-	{0x036E, 230, 0, 0},
-	{0x036F, 230, 0, 0},
-	{0x0374, 0, 1 | DECOMP_INLINE, 0x02B9},
-	{0x037A, 0, 2 | DECOMP_COMPAT, 569},
-	{0x037E, 0, 1 | DECOMP_INLINE, 0x003B},
-	{0x0384, 0, 2 | DECOMP_COMPAT, 571},
 	{0x0385, 0, 2, 573},
 	{0x0386, 0, 2, 575},
-	{0x0387, 0, 1 | DECOMP_INLINE, 0x00B7},
 	{0x0388, 0, 2, 577},
 	{0x0389, 0, 2, 579},
 	{0x038A, 0, 2, 581},
@@ -479,19 +322,8 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x03CC, 0, 2, 609},
 	{0x03CD, 0, 2, 611},
 	{0x03CE, 0, 2, 613},
-	{0x03D0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B2},
-	{0x03D1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B8},
-	{0x03D2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03A5},
 	{0x03D3, 0, 2, 615},
 	{0x03D4, 0, 2, 617},
-	{0x03D5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C6},
-	{0x03D6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C0},
-	{0x03F0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03BA},
-	{0x03F1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C1},
-	{0x03F2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C2},
-	{0x03F4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0398},
-	{0x03F5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B5},
-	{0x03F9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03A3},
 	{0x0400, 0, 2, 619},
 	{0x0401, 0, 2, 621},
 	{0x0403, 0, 2, 623},
@@ -510,11 +342,6 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x045E, 0, 2, 649},
 	{0x0476, 0, 2, 651},
 	{0x0477, 0, 2, 653},
-	{0x0483, 230, 0, 0},
-	{0x0484, 230, 0, 0},
-	{0x0485, 230, 0, 0},
-	{0x0486, 230, 0, 0},
-	{0x0487, 230, 0, 0},
 	{0x04C1, 0, 2, 655},
 	{0x04C2, 0, 2, 657},
 	{0x04D0, 0, 2, 659},
@@ -549,615 +376,51 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x04F5, 0, 2, 717},
 	{0x04F8, 0, 2, 719},
 	{0x04F9, 0, 2, 721},
-	{0x0587, 0, 2 | DECOMP_COMPAT, 723},
-	{0x0591, 220, 0, 0},
-	{0x0592, 230, 0, 0},
-	{0x0593, 230, 0, 0},
-	{0x0594, 230, 0, 0},
-	{0x0595, 230, 0, 0},
-	{0x0596, 220, 0, 0},
-	{0x0597, 230, 0, 0},
-	{0x0598, 230, 0, 0},
-	{0x0599, 230, 0, 0},
-	{0x059A, 222, 0, 0},
-	{0x059B, 220, 0, 0},
-	{0x059C, 230, 0, 0},
-	{0x059D, 230, 0, 0},
-	{0x059E, 230, 0, 0},
-	{0x059F, 230, 0, 0},
-	{0x05A0, 230, 0, 0},
-	{0x05A1, 230, 0, 0},
-	{0x05A2, 220, 0, 0},
-	{0x05A3, 220, 0, 0},
-	{0x05A4, 220, 0, 0},
-	{0x05A5, 220, 0, 0},
-	{0x05A6, 220, 0, 0},
-	{0x05A7, 220, 0, 0},
-	{0x05A8, 230, 0, 0},
-	{0x05A9, 230, 0, 0},
-	{0x05AA, 220, 0, 0},
-	{0x05AB, 230, 0, 0},
-	{0x05AC, 230, 0, 0},
-	{0x05AD, 222, 0, 0},
-	{0x05AE, 228, 0, 0},
-	{0x05AF, 230, 0, 0},
-	{0x05B0, 10, 0, 0},
-	{0x05B1, 11, 0, 0},
-	{0x05B2, 12, 0, 0},
-	{0x05B3, 13, 0, 0},
-	{0x05B4, 14, 0, 0},
-	{0x05B5, 15, 0, 0},
-	{0x05B6, 16, 0, 0},
-	{0x05B7, 17, 0, 0},
-	{0x05B8, 18, 0, 0},
-	{0x05B9, 19, 0, 0},
-	{0x05BA, 19, 0, 0},
-	{0x05BB, 20, 0, 0},
-	{0x05BC, 21, 0, 0},
-	{0x05BD, 22, 0, 0},
-	{0x05BF, 23, 0, 0},
-	{0x05C1, 24, 0, 0},
-	{0x05C2, 25, 0, 0},
-	{0x05C4, 230, 0, 0},
-	{0x05C5, 220, 0, 0},
-	{0x05C7, 18, 0, 0},
-	{0x0610, 230, 0, 0},
-	{0x0611, 230, 0, 0},
-	{0x0612, 230, 0, 0},
-	{0x0613, 230, 0, 0},
-	{0x0614, 230, 0, 0},
-	{0x0615, 230, 0, 0},
-	{0x0616, 230, 0, 0},
-	{0x0617, 230, 0, 0},
-	{0x0618, 30, 0, 0},
-	{0x0619, 31, 0, 0},
-	{0x061A, 32, 0, 0},
 	{0x0622, 0, 2, 725},
 	{0x0623, 0, 2, 727},
 	{0x0624, 0, 2, 729},
 	{0x0625, 0, 2, 731},
 	{0x0626, 0, 2, 733},
-	{0x064B, 27, 0, 0},
-	{0x064C, 28, 0, 0},
-	{0x064D, 29, 0, 0},
-	{0x064E, 30, 0, 0},
-	{0x064F, 31, 0, 0},
-	{0x0650, 32, 0, 0},
-	{0x0651, 33, 0, 0},
-	{0x0652, 34, 0, 0},
-	{0x0653, 230, 0, 0},
-	{0x0654, 230, 0, 0},
-	{0x0655, 220, 0, 0},
-	{0x0656, 220, 0, 0},
-	{0x0657, 230, 0, 0},
-	{0x0658, 230, 0, 0},
-	{0x0659, 230, 0, 0},
-	{0x065A, 230, 0, 0},
-	{0x065B, 230, 0, 0},
-	{0x065C, 220, 0, 0},
-	{0x065D, 230, 0, 0},
-	{0x065E, 230, 0, 0},
-	{0x065F, 220, 0, 0},
-	{0x0670, 35, 0, 0},
-	{0x0675, 0, 2 | DECOMP_COMPAT, 735},
-	{0x0676, 0, 2 | DECOMP_COMPAT, 737},
-	{0x0677, 0, 2 | DECOMP_COMPAT, 739},
-	{0x0678, 0, 2 | DECOMP_COMPAT, 741},
 	{0x06C0, 0, 2, 743},
 	{0x06C2, 0, 2, 745},
 	{0x06D3, 0, 2, 747},
-	{0x06D6, 230, 0, 0},
-	{0x06D7, 230, 0, 0},
-	{0x06D8, 230, 0, 0},
-	{0x06D9, 230, 0, 0},
-	{0x06DA, 230, 0, 0},
-	{0x06DB, 230, 0, 0},
-	{0x06DC, 230, 0, 0},
-	{0x06DF, 230, 0, 0},
-	{0x06E0, 230, 0, 0},
-	{0x06E1, 230, 0, 0},
-	{0x06E2, 230, 0, 0},
-	{0x06E3, 220, 0, 0},
-	{0x06E4, 230, 0, 0},
-	{0x06E7, 230, 0, 0},
-	{0x06E8, 230, 0, 0},
-	{0x06EA, 220, 0, 0},
-	{0x06EB, 230, 0, 0},
-	{0x06EC, 230, 0, 0},
-	{0x06ED, 220, 0, 0},
-	{0x0711, 36, 0, 0},
-	{0x0730, 230, 0, 0},
-	{0x0731, 220, 0, 0},
-	{0x0732, 230, 0, 0},
-	{0x0733, 230, 0, 0},
-	{0x0734, 220, 0, 0},
-	{0x0735, 230, 0, 0},
-	{0x0736, 230, 0, 0},
-	{0x0737, 220, 0, 0},
-	{0x0738, 220, 0, 0},
-	{0x0739, 220, 0, 0},
-	{0x073A, 230, 0, 0},
-	{0x073B, 220, 0, 0},
-	{0x073C, 220, 0, 0},
-	{0x073D, 230, 0, 0},
-	{0x073E, 220, 0, 0},
-	{0x073F, 230, 0, 0},
-	{0x0740, 230, 0, 0},
-	{0x0741, 230, 0, 0},
-	{0x0742, 220, 0, 0},
-	{0x0743, 230, 0, 0},
-	{0x0744, 220, 0, 0},
-	{0x0745, 230, 0, 0},
-	{0x0746, 220, 0, 0},
-	{0x0747, 230, 0, 0},
-	{0x0748, 220, 0, 0},
-	{0x0749, 230, 0, 0},
-	{0x074A, 230, 0, 0},
-	{0x07EB, 230, 0, 0},
-	{0x07EC, 230, 0, 0},
-	{0x07ED, 230, 0, 0},
-	{0x07EE, 230, 0, 0},
-	{0x07EF, 230, 0, 0},
-	{0x07F0, 230, 0, 0},
-	{0x07F1, 230, 0, 0},
-	{0x07F2, 220, 0, 0},
-	{0x07F3, 230, 0, 0},
-	{0x07FD, 220, 0, 0},
-	{0x0816, 230, 0, 0},
-	{0x0817, 230, 0, 0},
-	{0x0818, 230, 0, 0},
-	{0x0819, 230, 0, 0},
-	{0x081B, 230, 0, 0},
-	{0x081C, 230, 0, 0},
-	{0x081D, 230, 0, 0},
-	{0x081E, 230, 0, 0},
-	{0x081F, 230, 0, 0},
-	{0x0820, 230, 0, 0},
-	{0x0821, 230, 0, 0},
-	{0x0822, 230, 0, 0},
-	{0x0823, 230, 0, 0},
-	{0x0825, 230, 0, 0},
-	{0x0826, 230, 0, 0},
-	{0x0827, 230, 0, 0},
-	{0x0829, 230, 0, 0},
-	{0x082A, 230, 0, 0},
-	{0x082B, 230, 0, 0},
-	{0x082C, 230, 0, 0},
-	{0x082D, 230, 0, 0},
-	{0x0859, 220, 0, 0},
-	{0x085A, 220, 0, 0},
-	{0x085B, 220, 0, 0},
-	{0x08D3, 220, 0, 0},
-	{0x08D4, 230, 0, 0},
-	{0x08D5, 230, 0, 0},
-	{0x08D6, 230, 0, 0},
-	{0x08D7, 230, 0, 0},
-	{0x08D8, 230, 0, 0},
-	{0x08D9, 230, 0, 0},
-	{0x08DA, 230, 0, 0},
-	{0x08DB, 230, 0, 0},
-	{0x08DC, 230, 0, 0},
-	{0x08DD, 230, 0, 0},
-	{0x08DE, 230, 0, 0},
-	{0x08DF, 230, 0, 0},
-	{0x08E0, 230, 0, 0},
-	{0x08E1, 230, 0, 0},
-	{0x08E3, 220, 0, 0},
-	{0x08E4, 230, 0, 0},
-	{0x08E5, 230, 0, 0},
-	{0x08E6, 220, 0, 0},
-	{0x08E7, 230, 0, 0},
-	{0x08E8, 230, 0, 0},
-	{0x08E9, 220, 0, 0},
-	{0x08EA, 230, 0, 0},
-	{0x08EB, 230, 0, 0},
-	{0x08EC, 230, 0, 0},
-	{0x08ED, 220, 0, 0},
-	{0x08EE, 220, 0, 0},
-	{0x08EF, 220, 0, 0},
-	{0x08F0, 27, 0, 0},
-	{0x08F1, 28, 0, 0},
-	{0x08F2, 29, 0, 0},
-	{0x08F3, 230, 0, 0},
-	{0x08F4, 230, 0, 0},
-	{0x08F5, 230, 0, 0},
-	{0x08F6, 220, 0, 0},
-	{0x08F7, 230, 0, 0},
-	{0x08F8, 230, 0, 0},
-	{0x08F9, 220, 0, 0},
-	{0x08FA, 220, 0, 0},
-	{0x08FB, 230, 0, 0},
-	{0x08FC, 230, 0, 0},
-	{0x08FD, 230, 0, 0},
-	{0x08FE, 230, 0, 0},
-	{0x08FF, 230, 0, 0},
 	{0x0929, 0, 2, 749},
 	{0x0931, 0, 2, 751},
 	{0x0934, 0, 2, 753},
-	{0x093C, 7, 0, 0},
-	{0x094D, 9, 0, 0},
-	{0x0951, 230, 0, 0},
-	{0x0952, 220, 0, 0},
-	{0x0953, 230, 0, 0},
-	{0x0954, 230, 0, 0},
-	{0x0958, 0, 2 | DECOMP_NO_COMPOSE, 755},	/* in exclusion list */
-	{0x0959, 0, 2 | DECOMP_NO_COMPOSE, 757},	/* in exclusion list */
-	{0x095A, 0, 2 | DECOMP_NO_COMPOSE, 759},	/* in exclusion list */
-	{0x095B, 0, 2 | DECOMP_NO_COMPOSE, 761},	/* in exclusion list */
-	{0x095C, 0, 2 | DECOMP_NO_COMPOSE, 763},	/* in exclusion list */
-	{0x095D, 0, 2 | DECOMP_NO_COMPOSE, 765},	/* in exclusion list */
-	{0x095E, 0, 2 | DECOMP_NO_COMPOSE, 767},	/* in exclusion list */
-	{0x095F, 0, 2 | DECOMP_NO_COMPOSE, 769},	/* in exclusion list */
-	{0x09BC, 7, 0, 0},
 	{0x09CB, 0, 2, 771},
 	{0x09CC, 0, 2, 773},
-	{0x09CD, 9, 0, 0},
-	{0x09DC, 0, 2 | DECOMP_NO_COMPOSE, 775},	/* in exclusion list */
-	{0x09DD, 0, 2 | DECOMP_NO_COMPOSE, 777},	/* in exclusion list */
-	{0x09DF, 0, 2 | DECOMP_NO_COMPOSE, 779},	/* in exclusion list */
-	{0x09FE, 230, 0, 0},
-	{0x0A33, 0, 2 | DECOMP_NO_COMPOSE, 781},	/* in exclusion list */
-	{0x0A36, 0, 2 | DECOMP_NO_COMPOSE, 783},	/* in exclusion list */
-	{0x0A3C, 7, 0, 0},
-	{0x0A4D, 9, 0, 0},
-	{0x0A59, 0, 2 | DECOMP_NO_COMPOSE, 785},	/* in exclusion list */
-	{0x0A5A, 0, 2 | DECOMP_NO_COMPOSE, 787},	/* in exclusion list */
-	{0x0A5B, 0, 2 | DECOMP_NO_COMPOSE, 789},	/* in exclusion list */
-	{0x0A5E, 0, 2 | DECOMP_NO_COMPOSE, 791},	/* in exclusion list */
-	{0x0ABC, 7, 0, 0},
-	{0x0ACD, 9, 0, 0},
-	{0x0B3C, 7, 0, 0},
 	{0x0B48, 0, 2, 793},
 	{0x0B4B, 0, 2, 795},
 	{0x0B4C, 0, 2, 797},
-	{0x0B4D, 9, 0, 0},
-	{0x0B5C, 0, 2 | DECOMP_NO_COMPOSE, 799},	/* in exclusion list */
-	{0x0B5D, 0, 2 | DECOMP_NO_COMPOSE, 801},	/* in exclusion list */
 	{0x0B94, 0, 2, 803},
 	{0x0BCA, 0, 2, 805},
 	{0x0BCB, 0, 2, 807},
 	{0x0BCC, 0, 2, 809},
-	{0x0BCD, 9, 0, 0},
 	{0x0C48, 0, 2, 811},
-	{0x0C4D, 9, 0, 0},
-	{0x0C55, 84, 0, 0},
-	{0x0C56, 91, 0, 0},
-	{0x0CBC, 7, 0, 0},
 	{0x0CC0, 0, 2, 813},
 	{0x0CC7, 0, 2, 815},
 	{0x0CC8, 0, 2, 817},
 	{0x0CCA, 0, 2, 819},
 	{0x0CCB, 0, 2, 821},
-	{0x0CCD, 9, 0, 0},
-	{0x0D3B, 9, 0, 0},
-	{0x0D3C, 9, 0, 0},
 	{0x0D4A, 0, 2, 823},
 	{0x0D4B, 0, 2, 825},
 	{0x0D4C, 0, 2, 827},
-	{0x0D4D, 9, 0, 0},
-	{0x0DCA, 9, 0, 0},
 	{0x0DDA, 0, 2, 829},
 	{0x0DDC, 0, 2, 831},
 	{0x0DDD, 0, 2, 833},
 	{0x0DDE, 0, 2, 835},
-	{0x0E33, 0, 2 | DECOMP_COMPAT, 837},
-	{0x0E38, 103, 0, 0},
-	{0x0E39, 103, 0, 0},
-	{0x0E3A, 9, 0, 0},
-	{0x0E48, 107, 0, 0},
-	{0x0E49, 107, 0, 0},
-	{0x0E4A, 107, 0, 0},
-	{0x0E4B, 107, 0, 0},
-	{0x0EB3, 0, 2 | DECOMP_COMPAT, 839},
-	{0x0EB8, 118, 0, 0},
-	{0x0EB9, 118, 0, 0},
-	{0x0EBA, 9, 0, 0},
-	{0x0EC8, 122, 0, 0},
-	{0x0EC9, 122, 0, 0},
-	{0x0ECA, 122, 0, 0},
-	{0x0ECB, 122, 0, 0},
-	{0x0EDC, 0, 2 | DECOMP_COMPAT, 841},
-	{0x0EDD, 0, 2 | DECOMP_COMPAT, 843},
-	{0x0F0C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0F0B},
-	{0x0F18, 220, 0, 0},
-	{0x0F19, 220, 0, 0},
-	{0x0F35, 220, 0, 0},
-	{0x0F37, 220, 0, 0},
-	{0x0F39, 216, 0, 0},
-	{0x0F43, 0, 2 | DECOMP_NO_COMPOSE, 845},	/* in exclusion list */
-	{0x0F4D, 0, 2 | DECOMP_NO_COMPOSE, 847},	/* in exclusion list */
-	{0x0F52, 0, 2 | DECOMP_NO_COMPOSE, 849},	/* in exclusion list */
-	{0x0F57, 0, 2 | DECOMP_NO_COMPOSE, 851},	/* in exclusion list */
-	{0x0F5C, 0, 2 | DECOMP_NO_COMPOSE, 853},	/* in exclusion list */
-	{0x0F69, 0, 2 | DECOMP_NO_COMPOSE, 855},	/* in exclusion list */
-	{0x0F71, 129, 0, 0},
-	{0x0F72, 130, 0, 0},
-	{0x0F73, 0, 2 | DECOMP_NO_COMPOSE, 857},	/* non-starter decomposition */
-	{0x0F74, 132, 0, 0},
-	{0x0F75, 0, 2 | DECOMP_NO_COMPOSE, 859},	/* non-starter decomposition */
-	{0x0F76, 0, 2 | DECOMP_NO_COMPOSE, 861},	/* in exclusion list */
-	{0x0F77, 0, 2 | DECOMP_COMPAT, 863},
-	{0x0F78, 0, 2 | DECOMP_NO_COMPOSE, 865},	/* in exclusion list */
-	{0x0F79, 0, 2 | DECOMP_COMPAT, 867},
-	{0x0F7A, 130, 0, 0},
-	{0x0F7B, 130, 0, 0},
-	{0x0F7C, 130, 0, 0},
-	{0x0F7D, 130, 0, 0},
-	{0x0F80, 130, 0, 0},
-	{0x0F81, 0, 2 | DECOMP_NO_COMPOSE, 869},	/* non-starter decomposition */
-	{0x0F82, 230, 0, 0},
-	{0x0F83, 230, 0, 0},
-	{0x0F84, 9, 0, 0},
-	{0x0F86, 230, 0, 0},
-	{0x0F87, 230, 0, 0},
-	{0x0F93, 0, 2 | DECOMP_NO_COMPOSE, 871},	/* in exclusion list */
-	{0x0F9D, 0, 2 | DECOMP_NO_COMPOSE, 873},	/* in exclusion list */
-	{0x0FA2, 0, 2 | DECOMP_NO_COMPOSE, 875},	/* in exclusion list */
-	{0x0FA7, 0, 2 | DECOMP_NO_COMPOSE, 877},	/* in exclusion list */
-	{0x0FAC, 0, 2 | DECOMP_NO_COMPOSE, 879},	/* in exclusion list */
-	{0x0FB9, 0, 2 | DECOMP_NO_COMPOSE, 881},	/* in exclusion list */
-	{0x0FC6, 220, 0, 0},
 	{0x1026, 0, 2, 883},
-	{0x1037, 7, 0, 0},
-	{0x1039, 9, 0, 0},
-	{0x103A, 9, 0, 0},
-	{0x108D, 220, 0, 0},
-	{0x10FC, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x10DC},
-	{0x135D, 230, 0, 0},
-	{0x135E, 230, 0, 0},
-	{0x135F, 230, 0, 0},
-	{0x1714, 9, 0, 0},
-	{0x1734, 9, 0, 0},
-	{0x17D2, 9, 0, 0},
-	{0x17DD, 230, 0, 0},
-	{0x18A9, 228, 0, 0},
-	{0x1939, 222, 0, 0},
-	{0x193A, 230, 0, 0},
-	{0x193B, 220, 0, 0},
-	{0x1A17, 230, 0, 0},
-	{0x1A18, 220, 0, 0},
-	{0x1A60, 9, 0, 0},
-	{0x1A75, 230, 0, 0},
-	{0x1A76, 230, 0, 0},
-	{0x1A77, 230, 0, 0},
-	{0x1A78, 230, 0, 0},
-	{0x1A79, 230, 0, 0},
-	{0x1A7A, 230, 0, 0},
-	{0x1A7B, 230, 0, 0},
-	{0x1A7C, 230, 0, 0},
-	{0x1A7F, 220, 0, 0},
-	{0x1AB0, 230, 0, 0},
-	{0x1AB1, 230, 0, 0},
-	{0x1AB2, 230, 0, 0},
-	{0x1AB3, 230, 0, 0},
-	{0x1AB4, 230, 0, 0},
-	{0x1AB5, 220, 0, 0},
-	{0x1AB6, 220, 0, 0},
-	{0x1AB7, 220, 0, 0},
-	{0x1AB8, 220, 0, 0},
-	{0x1AB9, 220, 0, 0},
-	{0x1ABA, 220, 0, 0},
-	{0x1ABB, 230, 0, 0},
-	{0x1ABC, 230, 0, 0},
-	{0x1ABD, 220, 0, 0},
-	{0x1ABF, 220, 0, 0},
-	{0x1AC0, 220, 0, 0},
 	{0x1B06, 0, 2, 885},
 	{0x1B08, 0, 2, 887},
 	{0x1B0A, 0, 2, 889},
 	{0x1B0C, 0, 2, 891},
 	{0x1B0E, 0, 2, 893},
 	{0x1B12, 0, 2, 895},
-	{0x1B34, 7, 0, 0},
 	{0x1B3B, 0, 2, 897},
 	{0x1B3D, 0, 2, 899},
 	{0x1B40, 0, 2, 901},
 	{0x1B41, 0, 2, 903},
 	{0x1B43, 0, 2, 905},
-	{0x1B44, 9, 0, 0},
-	{0x1B6B, 230, 0, 0},
-	{0x1B6C, 220, 0, 0},
-	{0x1B6D, 230, 0, 0},
-	{0x1B6E, 230, 0, 0},
-	{0x1B6F, 230, 0, 0},
-	{0x1B70, 230, 0, 0},
-	{0x1B71, 230, 0, 0},
-	{0x1B72, 230, 0, 0},
-	{0x1B73, 230, 0, 0},
-	{0x1BAA, 9, 0, 0},
-	{0x1BAB, 9, 0, 0},
-	{0x1BE6, 7, 0, 0},
-	{0x1BF2, 9, 0, 0},
-	{0x1BF3, 9, 0, 0},
-	{0x1C37, 7, 0, 0},
-	{0x1CD0, 230, 0, 0},
-	{0x1CD1, 230, 0, 0},
-	{0x1CD2, 230, 0, 0},
-	{0x1CD4, 1, 0, 0},
-	{0x1CD5, 220, 0, 0},
-	{0x1CD6, 220, 0, 0},
-	{0x1CD7, 220, 0, 0},
-	{0x1CD8, 220, 0, 0},
-	{0x1CD9, 220, 0, 0},
-	{0x1CDA, 230, 0, 0},
-	{0x1CDB, 230, 0, 0},
-	{0x1CDC, 220, 0, 0},
-	{0x1CDD, 220, 0, 0},
-	{0x1CDE, 220, 0, 0},
-	{0x1CDF, 220, 0, 0},
-	{0x1CE0, 230, 0, 0},
-	{0x1CE2, 1, 0, 0},
-	{0x1CE3, 1, 0, 0},
-	{0x1CE4, 1, 0, 0},
-	{0x1CE5, 1, 0, 0},
-	{0x1CE6, 1, 0, 0},
-	{0x1CE7, 1, 0, 0},
-	{0x1CE8, 1, 0, 0},
-	{0x1CED, 220, 0, 0},
-	{0x1CF4, 230, 0, 0},
-	{0x1CF8, 230, 0, 0},
-	{0x1CF9, 230, 0, 0},
-	{0x1D2C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0041},
-	{0x1D2D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x00C6},
-	{0x1D2E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0042},
-	{0x1D30, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0044},
-	{0x1D31, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0045},
-	{0x1D32, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x018E},
-	{0x1D33, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0047},
-	{0x1D34, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0048},
-	{0x1D35, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0049},
-	{0x1D36, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004A},
-	{0x1D37, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004B},
-	{0x1D38, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004C},
-	{0x1D39, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004D},
-	{0x1D3A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004E},
-	{0x1D3C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004F},
-	{0x1D3D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0222},
-	{0x1D3E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0050},
-	{0x1D3F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0052},
-	{0x1D40, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0054},
-	{0x1D41, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0055},
-	{0x1D42, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0057},
-	{0x1D43, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0061},
-	{0x1D44, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0250},
-	{0x1D45, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0251},
-	{0x1D46, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D02},
-	{0x1D47, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0062},
-	{0x1D48, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0064},
-	{0x1D49, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0065},
-	{0x1D4A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0259},
-	{0x1D4B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x025B},
-	{0x1D4C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x025C},
-	{0x1D4D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0067},
-	{0x1D4F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006B},
-	{0x1D50, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006D},
-	{0x1D51, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x014B},
-	{0x1D52, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006F},
-	{0x1D53, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0254},
-	{0x1D54, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D16},
-	{0x1D55, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D17},
-	{0x1D56, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0070},
-	{0x1D57, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0074},
-	{0x1D58, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0075},
-	{0x1D59, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D1D},
-	{0x1D5A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x026F},
-	{0x1D5B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0076},
-	{0x1D5C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D25},
-	{0x1D5D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B2},
-	{0x1D5E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B3},
-	{0x1D5F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B4},
-	{0x1D60, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C6},
-	{0x1D61, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C7},
-	{0x1D62, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0069},
-	{0x1D63, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0072},
-	{0x1D64, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0075},
-	{0x1D65, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0076},
-	{0x1D66, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B2},
-	{0x1D67, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B3},
-	{0x1D68, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C1},
-	{0x1D69, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C6},
-	{0x1D6A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C7},
-	{0x1D78, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x043D},
-	{0x1D9B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0252},
-	{0x1D9C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0063},
-	{0x1D9D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0255},
-	{0x1D9E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x00F0},
-	{0x1D9F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x025C},
-	{0x1DA0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0066},
-	{0x1DA1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x025F},
-	{0x1DA2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0261},
-	{0x1DA3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0265},
-	{0x1DA4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0268},
-	{0x1DA5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0269},
-	{0x1DA6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x026A},
-	{0x1DA7, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D7B},
-	{0x1DA8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x029D},
-	{0x1DA9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x026D},
-	{0x1DAA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D85},
-	{0x1DAB, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x029F},
-	{0x1DAC, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0271},
-	{0x1DAD, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0270},
-	{0x1DAE, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0272},
-	{0x1DAF, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0273},
-	{0x1DB0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0274},
-	{0x1DB1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0275},
-	{0x1DB2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0278},
-	{0x1DB3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0282},
-	{0x1DB4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0283},
-	{0x1DB5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x01AB},
-	{0x1DB6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0289},
-	{0x1DB7, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x028A},
-	{0x1DB8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D1C},
-	{0x1DB9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x028B},
-	{0x1DBA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x028C},
-	{0x1DBB, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x007A},
-	{0x1DBC, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0290},
-	{0x1DBD, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0291},
-	{0x1DBE, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0292},
-	{0x1DBF, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B8},
-	{0x1DC0, 230, 0, 0},
-	{0x1DC1, 230, 0, 0},
-	{0x1DC2, 220, 0, 0},
-	{0x1DC3, 230, 0, 0},
-	{0x1DC4, 230, 0, 0},
-	{0x1DC5, 230, 0, 0},
-	{0x1DC6, 230, 0, 0},
-	{0x1DC7, 230, 0, 0},
-	{0x1DC8, 230, 0, 0},
-	{0x1DC9, 230, 0, 0},
-	{0x1DCA, 220, 0, 0},
-	{0x1DCB, 230, 0, 0},
-	{0x1DCC, 230, 0, 0},
-	{0x1DCD, 234, 0, 0},
-	{0x1DCE, 214, 0, 0},
-	{0x1DCF, 220, 0, 0},
-	{0x1DD0, 202, 0, 0},
-	{0x1DD1, 230, 0, 0},
-	{0x1DD2, 230, 0, 0},
-	{0x1DD3, 230, 0, 0},
-	{0x1DD4, 230, 0, 0},
-	{0x1DD5, 230, 0, 0},
-	{0x1DD6, 230, 0, 0},
-	{0x1DD7, 230, 0, 0},
-	{0x1DD8, 230, 0, 0},
-	{0x1DD9, 230, 0, 0},
-	{0x1DDA, 230, 0, 0},
-	{0x1DDB, 230, 0, 0},
-	{0x1DDC, 230, 0, 0},
-	{0x1DDD, 230, 0, 0},
-	{0x1DDE, 230, 0, 0},
-	{0x1DDF, 230, 0, 0},
-	{0x1DE0, 230, 0, 0},
-	{0x1DE1, 230, 0, 0},
-	{0x1DE2, 230, 0, 0},
-	{0x1DE3, 230, 0, 0},
-	{0x1DE4, 230, 0, 0},
-	{0x1DE5, 230, 0, 0},
-	{0x1DE6, 230, 0, 0},
-	{0x1DE7, 230, 0, 0},
-	{0x1DE8, 230, 0, 0},
-	{0x1DE9, 230, 0, 0},
-	{0x1DEA, 230, 0, 0},
-	{0x1DEB, 230, 0, 0},
-	{0x1DEC, 230, 0, 0},
-	{0x1DED, 230, 0, 0},
-	{0x1DEE, 230, 0, 0},
-	{0x1DEF, 230, 0, 0},
-	{0x1DF0, 230, 0, 0},
-	{0x1DF1, 230, 0, 0},
-	{0x1DF2, 230, 0, 0},
-	{0x1DF3, 230, 0, 0},
-	{0x1DF4, 230, 0, 0},
-	{0x1DF5, 230, 0, 0},
-	{0x1DF6, 232, 0, 0},
-	{0x1DF7, 228, 0, 0},
-	{0x1DF8, 228, 0, 0},
-	{0x1DF9, 220, 0, 0},
-	{0x1DFB, 230, 0, 0},
-	{0x1DFC, 233, 0, 0},
-	{0x1DFD, 220, 0, 0},
-	{0x1DFE, 230, 0, 0},
-	{0x1DFF, 220, 0, 0},
 	{0x1E00, 0, 2, 907},
 	{0x1E01, 0, 2, 909},
 	{0x1E02, 0, 2, 911},
@@ -1312,7 +575,6 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x1E97, 0, 2, 1209},
 	{0x1E98, 0, 2, 1211},
 	{0x1E99, 0, 2, 1213},
-	{0x1E9A, 0, 2 | DECOMP_COMPAT, 1215},
 	{0x1E9B, 0, 2, 1217},
 	{0x1EA0, 0, 2, 1219},
 	{0x1EA1, 0, 2, 1221},
@@ -1505,136 +767,1000 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x1F6E, 0, 2, 1595},
 	{0x1F6F, 0, 2, 1597},
 	{0x1F70, 0, 2, 1599},
+	{0x1F72, 0, 2, 1601},
+	{0x1F74, 0, 2, 1603},
+	{0x1F76, 0, 2, 1605},
+	{0x1F78, 0, 2, 1607},
+	{0x1F7A, 0, 2, 1609},
+	{0x1F7C, 0, 2, 1611},
+	{0x1F80, 0, 2, 1613},
+	{0x1F81, 0, 2, 1615},
+	{0x1F82, 0, 2, 1617},
+	{0x1F83, 0, 2, 1619},
+	{0x1F84, 0, 2, 1621},
+	{0x1F85, 0, 2, 1623},
+	{0x1F86, 0, 2, 1625},
+	{0x1F87, 0, 2, 1627},
+	{0x1F88, 0, 2, 1629},
+	{0x1F89, 0, 2, 1631},
+	{0x1F8A, 0, 2, 1633},
+	{0x1F8B, 0, 2, 1635},
+	{0x1F8C, 0, 2, 1637},
+	{0x1F8D, 0, 2, 1639},
+	{0x1F8E, 0, 2, 1641},
+	{0x1F8F, 0, 2, 1643},
+	{0x1F90, 0, 2, 1645},
+	{0x1F91, 0, 2, 1647},
+	{0x1F92, 0, 2, 1649},
+	{0x1F93, 0, 2, 1651},
+	{0x1F94, 0, 2, 1653},
+	{0x1F95, 0, 2, 1655},
+	{0x1F96, 0, 2, 1657},
+	{0x1F97, 0, 2, 1659},
+	{0x1F98, 0, 2, 1661},
+	{0x1F99, 0, 2, 1663},
+	{0x1F9A, 0, 2, 1665},
+	{0x1F9B, 0, 2, 1667},
+	{0x1F9C, 0, 2, 1669},
+	{0x1F9D, 0, 2, 1671},
+	{0x1F9E, 0, 2, 1673},
+	{0x1F9F, 0, 2, 1675},
+	{0x1FA0, 0, 2, 1677},
+	{0x1FA1, 0, 2, 1679},
+	{0x1FA2, 0, 2, 1681},
+	{0x1FA3, 0, 2, 1683},
+	{0x1FA4, 0, 2, 1685},
+	{0x1FA5, 0, 2, 1687},
+	{0x1FA6, 0, 2, 1689},
+	{0x1FA7, 0, 2, 1691},
+	{0x1FA8, 0, 2, 1693},
+	{0x1FA9, 0, 2, 1695},
+	{0x1FAA, 0, 2, 1697},
+	{0x1FAB, 0, 2, 1699},
+	{0x1FAC, 0, 2, 1701},
+	{0x1FAD, 0, 2, 1703},
+	{0x1FAE, 0, 2, 1705},
+	{0x1FAF, 0, 2, 1707},
+	{0x1FB0, 0, 2, 1709},
+	{0x1FB1, 0, 2, 1711},
+	{0x1FB2, 0, 2, 1713},
+	{0x1FB3, 0, 2, 1715},
+	{0x1FB4, 0, 2, 1717},
+	{0x1FB6, 0, 2, 1719},
+	{0x1FB7, 0, 2, 1721},
+	{0x1FB8, 0, 2, 1723},
+	{0x1FB9, 0, 2, 1725},
+	{0x1FBA, 0, 2, 1727},
+	{0x1FBC, 0, 2, 1729},
+	{0x1FC1, 0, 2, 1737},
+	{0x1FC2, 0, 2, 1739},
+	{0x1FC3, 0, 2, 1741},
+	{0x1FC4, 0, 2, 1743},
+	{0x1FC6, 0, 2, 1745},
+	{0x1FC7, 0, 2, 1747},
+	{0x1FC8, 0, 2, 1749},
+	{0x1FCA, 0, 2, 1751},
+	{0x1FCC, 0, 2, 1753},
+	{0x1FCD, 0, 2, 1755},
+	{0x1FCE, 0, 2, 1757},
+	{0x1FCF, 0, 2, 1759},
+	{0x1FD0, 0, 2, 1761},
+	{0x1FD1, 0, 2, 1763},
+	{0x1FD2, 0, 2, 1765},
+	{0x1FD6, 0, 2, 1767},
+	{0x1FD7, 0, 2, 1769},
+	{0x1FD8, 0, 2, 1771},
+	{0x1FD9, 0, 2, 1773},
+	{0x1FDA, 0, 2, 1775},
+	{0x1FDD, 0, 2, 1777},
+	{0x1FDE, 0, 2, 1779},
+	{0x1FDF, 0, 2, 1781},
+	{0x1FE0, 0, 2, 1783},
+	{0x1FE1, 0, 2, 1785},
+	{0x1FE2, 0, 2, 1787},
+	{0x1FE4, 0, 2, 1789},
+	{0x1FE5, 0, 2, 1791},
+	{0x1FE6, 0, 2, 1793},
+	{0x1FE7, 0, 2, 1795},
+	{0x1FE8, 0, 2, 1797},
+	{0x1FE9, 0, 2, 1799},
+	{0x1FEA, 0, 2, 1801},
+	{0x1FEC, 0, 2, 1803},
+	{0x1FED, 0, 2, 1805},
+	{0x1FF2, 0, 2, 1807},
+	{0x1FF3, 0, 2, 1809},
+	{0x1FF4, 0, 2, 1811},
+	{0x1FF6, 0, 2, 1813},
+	{0x1FF7, 0, 2, 1815},
+	{0x1FF8, 0, 2, 1817},
+	{0x1FFA, 0, 2, 1819},
+	{0x1FFC, 0, 2, 1821},
+	{0x219A, 0, 2, 1983},
+	{0x219B, 0, 2, 1985},
+	{0x21AE, 0, 2, 1987},
+	{0x21CD, 0, 2, 1989},
+	{0x21CE, 0, 2, 1991},
+	{0x21CF, 0, 2, 1993},
+	{0x2204, 0, 2, 1995},
+	{0x2209, 0, 2, 1997},
+	{0x220C, 0, 2, 1999},
+	{0x2224, 0, 2, 2001},
+	{0x2226, 0, 2, 2003},
+	{0x2241, 0, 2, 2015},
+	{0x2244, 0, 2, 2017},
+	{0x2247, 0, 2, 2019},
+	{0x2249, 0, 2, 2021},
+	{0x2260, 0, 2, 2023},
+	{0x2262, 0, 2, 2025},
+	{0x226D, 0, 2, 2027},
+	{0x226E, 0, 2, 2029},
+	{0x226F, 0, 2, 2031},
+	{0x2270, 0, 2, 2033},
+	{0x2271, 0, 2, 2035},
+	{0x2274, 0, 2, 2037},
+	{0x2275, 0, 2, 2039},
+	{0x2278, 0, 2, 2041},
+	{0x2279, 0, 2, 2043},
+	{0x2280, 0, 2, 2045},
+	{0x2281, 0, 2, 2047},
+	{0x2284, 0, 2, 2049},
+	{0x2285, 0, 2, 2051},
+	{0x2288, 0, 2, 2053},
+	{0x2289, 0, 2, 2055},
+	{0x22AC, 0, 2, 2057},
+	{0x22AD, 0, 2, 2059},
+	{0x22AE, 0, 2, 2061},
+	{0x22AF, 0, 2, 2063},
+	{0x22E0, 0, 2, 2065},
+	{0x22E1, 0, 2, 2067},
+	{0x22E2, 0, 2, 2069},
+	{0x22E3, 0, 2, 2071},
+	{0x22EA, 0, 2, 2073},
+	{0x22EB, 0, 2, 2075},
+	{0x22EC, 0, 2, 2077},
+	{0x22ED, 0, 2, 2079},
+	{0x304C, 0, 2, 2317},
+	{0x304E, 0, 2, 2319},
+	{0x3050, 0, 2, 2321},
+	{0x3052, 0, 2, 2323},
+	{0x3054, 0, 2, 2325},
+	{0x3056, 0, 2, 2327},
+	{0x3058, 0, 2, 2329},
+	{0x305A, 0, 2, 2331},
+	{0x305C, 0, 2, 2333},
+	{0x305E, 0, 2, 2335},
+	{0x3060, 0, 2, 2337},
+	{0x3062, 0, 2, 2339},
+	{0x3065, 0, 2, 2341},
+	{0x3067, 0, 2, 2343},
+	{0x3069, 0, 2, 2345},
+	{0x3070, 0, 2, 2347},
+	{0x3071, 0, 2, 2349},
+	{0x3073, 0, 2, 2351},
+	{0x3074, 0, 2, 2353},
+	{0x3076, 0, 2, 2355},
+	{0x3077, 0, 2, 2357},
+	{0x3079, 0, 2, 2359},
+	{0x307A, 0, 2, 2361},
+	{0x307C, 0, 2, 2363},
+	{0x307D, 0, 2, 2365},
+	{0x3094, 0, 2, 2367},
+	{0x309E, 0, 2, 2373},
+	{0x30AC, 0, 2, 2377},
+	{0x30AE, 0, 2, 2379},
+	{0x30B0, 0, 2, 2381},
+	{0x30B2, 0, 2, 2383},
+	{0x30B4, 0, 2, 2385},
+	{0x30B6, 0, 2, 2387},
+	{0x30B8, 0, 2, 2389},
+	{0x30BA, 0, 2, 2391},
+	{0x30BC, 0, 2, 2393},
+	{0x30BE, 0, 2, 2395},
+	{0x30C0, 0, 2, 2397},
+	{0x30C2, 0, 2, 2399},
+	{0x30C5, 0, 2, 2401},
+	{0x30C7, 0, 2, 2403},
+	{0x30C9, 0, 2, 2405},
+	{0x30D0, 0, 2, 2407},
+	{0x30D1, 0, 2, 2409},
+	{0x30D3, 0, 2, 2411},
+	{0x30D4, 0, 2, 2413},
+	{0x30D6, 0, 2, 2415},
+	{0x30D7, 0, 2, 2417},
+	{0x30D9, 0, 2, 2419},
+	{0x30DA, 0, 2, 2421},
+	{0x30DC, 0, 2, 2423},
+	{0x30DD, 0, 2, 2425},
+	{0x30F4, 0, 2, 2427},
+	{0x30F7, 0, 2, 2429},
+	{0x30F8, 0, 2, 2431},
+	{0x30F9, 0, 2, 2433},
+	{0x30FA, 0, 2, 2435},
+	{0x30FE, 0, 2, 2437},
+	{0x1109A, 0, 2, 4776},
+	{0x1109C, 0, 2, 4778},
+	{0x110AB, 0, 2, 4780},
+	{0x1112E, 0, 2, 4782},
+	{0x1112F, 0, 2, 4784},
+	{0x1134B, 0, 2, 4786},
+	{0x1134C, 0, 2, 4788},
+	{0x114BB, 0, 2, 4790},
+	{0x114BC, 0, 2, 4792},
+	{0x114BE, 0, 2, 4794},
+	{0x115BA, 0, 2, 4796},
+	{0x115BB, 0, 2, 4798},
+	{0x11938, 0, 2, 4800},
+	{0x00A0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0020},
+	{0x00A8, 0, 2 | DECOMP_COMPAT, 0},
+	{0x00AA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0061},
+	{0x00AF, 0, 2 | DECOMP_COMPAT, 2},
+	{0x00B2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0032},
+	{0x00B3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0033},
+	{0x00B4, 0, 2 | DECOMP_COMPAT, 4},
+	{0x00B5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03BC},
+	{0x00B8, 0, 2 | DECOMP_COMPAT, 6},
+	{0x00B9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0031},
+	{0x00BA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006F},
+	{0x00BC, 0, 3 | DECOMP_COMPAT, 8},
+	{0x00BD, 0, 3 | DECOMP_COMPAT, 11},
+	{0x00BE, 0, 3 | DECOMP_COMPAT, 14},
+	{0x0132, 0, 2 | DECOMP_COMPAT, 213},
+	{0x0133, 0, 2 | DECOMP_COMPAT, 215},
+	{0x013F, 0, 2 | DECOMP_COMPAT, 237},
+	{0x0140, 0, 2 | DECOMP_COMPAT, 239},
+	{0x0149, 0, 2 | DECOMP_COMPAT, 253},
+	{0x017F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0073},
+	{0x01C4, 0, 2 | DECOMP_COMPAT, 357},
+	{0x01C5, 0, 2 | DECOMP_COMPAT, 359},
+	{0x01C6, 0, 2 | DECOMP_COMPAT, 361},
+	{0x01C7, 0, 2 | DECOMP_COMPAT, 363},
+	{0x01C8, 0, 2 | DECOMP_COMPAT, 365},
+	{0x01C9, 0, 2 | DECOMP_COMPAT, 367},
+	{0x01CA, 0, 2 | DECOMP_COMPAT, 369},
+	{0x01CB, 0, 2 | DECOMP_COMPAT, 371},
+	{0x01CC, 0, 2 | DECOMP_COMPAT, 373},
+	{0x01F1, 0, 2 | DECOMP_COMPAT, 441},
+	{0x01F2, 0, 2 | DECOMP_COMPAT, 443},
+	{0x01F3, 0, 2 | DECOMP_COMPAT, 445},
+	{0x02B0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0068},
+	{0x02B1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0266},
+	{0x02B2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006A},
+	{0x02B3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0072},
+	{0x02B4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0279},
+	{0x02B5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x027B},
+	{0x02B6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0281},
+	{0x02B7, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0077},
+	{0x02B8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0079},
+	{0x02D8, 0, 2 | DECOMP_COMPAT, 555},
+	{0x02D9, 0, 2 | DECOMP_COMPAT, 557},
+	{0x02DA, 0, 2 | DECOMP_COMPAT, 559},
+	{0x02DB, 0, 2 | DECOMP_COMPAT, 561},
+	{0x02DC, 0, 2 | DECOMP_COMPAT, 563},
+	{0x02DD, 0, 2 | DECOMP_COMPAT, 565},
+	{0x02E0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0263},
+	{0x02E1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006C},
+	{0x02E2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0073},
+	{0x02E3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0078},
+	{0x02E4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0295},
+	{0x0300, 230, 0, 0},
+	{0x0301, 230, 0, 0},
+	{0x0302, 230, 0, 0},
+	{0x0303, 230, 0, 0},
+	{0x0304, 230, 0, 0},
+	{0x0305, 230, 0, 0},
+	{0x0306, 230, 0, 0},
+	{0x0307, 230, 0, 0},
+	{0x0308, 230, 0, 0},
+	{0x0309, 230, 0, 0},
+	{0x030A, 230, 0, 0},
+	{0x030B, 230, 0, 0},
+	{0x030C, 230, 0, 0},
+	{0x030D, 230, 0, 0},
+	{0x030E, 230, 0, 0},
+	{0x030F, 230, 0, 0},
+	{0x0310, 230, 0, 0},
+	{0x0311, 230, 0, 0},
+	{0x0312, 230, 0, 0},
+	{0x0313, 230, 0, 0},
+	{0x0314, 230, 0, 0},
+	{0x0315, 232, 0, 0},
+	{0x0316, 220, 0, 0},
+	{0x0317, 220, 0, 0},
+	{0x0318, 220, 0, 0},
+	{0x0319, 220, 0, 0},
+	{0x031A, 232, 0, 0},
+	{0x031B, 216, 0, 0},
+	{0x031C, 220, 0, 0},
+	{0x031D, 220, 0, 0},
+	{0x031E, 220, 0, 0},
+	{0x031F, 220, 0, 0},
+	{0x0320, 220, 0, 0},
+	{0x0321, 202, 0, 0},
+	{0x0322, 202, 0, 0},
+	{0x0323, 220, 0, 0},
+	{0x0324, 220, 0, 0},
+	{0x0325, 220, 0, 0},
+	{0x0326, 220, 0, 0},
+	{0x0327, 202, 0, 0},
+	{0x0328, 202, 0, 0},
+	{0x0329, 220, 0, 0},
+	{0x032A, 220, 0, 0},
+	{0x032B, 220, 0, 0},
+	{0x032C, 220, 0, 0},
+	{0x032D, 220, 0, 0},
+	{0x032E, 220, 0, 0},
+	{0x032F, 220, 0, 0},
+	{0x0330, 220, 0, 0},
+	{0x0331, 220, 0, 0},
+	{0x0332, 220, 0, 0},
+	{0x0333, 220, 0, 0},
+	{0x0334, 1, 0, 0},
+	{0x0335, 1, 0, 0},
+	{0x0336, 1, 0, 0},
+	{0x0337, 1, 0, 0},
+	{0x0338, 1, 0, 0},
+	{0x0339, 220, 0, 0},
+	{0x033A, 220, 0, 0},
+	{0x033B, 220, 0, 0},
+	{0x033C, 220, 0, 0},
+	{0x033D, 230, 0, 0},
+	{0x033E, 230, 0, 0},
+	{0x033F, 230, 0, 0},
+	{0x0340, 230, 1 | DECOMP_INLINE, 0x0300},
+	{0x0341, 230, 1 | DECOMP_INLINE, 0x0301},
+	{0x0342, 230, 0, 0},
+	{0x0343, 230, 1 | DECOMP_INLINE, 0x0313},
+	{0x0344, 230, 2 | DECOMP_NO_COMPOSE, 567},	/* non-starter decomposition */
+	{0x0345, 240, 0, 0},
+	{0x0346, 230, 0, 0},
+	{0x0347, 220, 0, 0},
+	{0x0348, 220, 0, 0},
+	{0x0349, 220, 0, 0},
+	{0x034A, 230, 0, 0},
+	{0x034B, 230, 0, 0},
+	{0x034C, 230, 0, 0},
+	{0x034D, 220, 0, 0},
+	{0x034E, 220, 0, 0},
+	{0x0350, 230, 0, 0},
+	{0x0351, 230, 0, 0},
+	{0x0352, 230, 0, 0},
+	{0x0353, 220, 0, 0},
+	{0x0354, 220, 0, 0},
+	{0x0355, 220, 0, 0},
+	{0x0356, 220, 0, 0},
+	{0x0357, 230, 0, 0},
+	{0x0358, 232, 0, 0},
+	{0x0359, 220, 0, 0},
+	{0x035A, 220, 0, 0},
+	{0x035B, 230, 0, 0},
+	{0x035C, 233, 0, 0},
+	{0x035D, 234, 0, 0},
+	{0x035E, 234, 0, 0},
+	{0x035F, 233, 0, 0},
+	{0x0360, 234, 0, 0},
+	{0x0361, 234, 0, 0},
+	{0x0362, 233, 0, 0},
+	{0x0363, 230, 0, 0},
+	{0x0364, 230, 0, 0},
+	{0x0365, 230, 0, 0},
+	{0x0366, 230, 0, 0},
+	{0x0367, 230, 0, 0},
+	{0x0368, 230, 0, 0},
+	{0x0369, 230, 0, 0},
+	{0x036A, 230, 0, 0},
+	{0x036B, 230, 0, 0},
+	{0x036C, 230, 0, 0},
+	{0x036D, 230, 0, 0},
+	{0x036E, 230, 0, 0},
+	{0x036F, 230, 0, 0},
+	{0x0374, 0, 1 | DECOMP_INLINE, 0x02B9},
+	{0x037A, 0, 2 | DECOMP_COMPAT, 569},
+	{0x037E, 0, 1 | DECOMP_INLINE, 0x003B},
+	{0x0384, 0, 2 | DECOMP_COMPAT, 571},
+	{0x0387, 0, 1 | DECOMP_INLINE, 0x00B7},
+	{0x03D0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B2},
+	{0x03D1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B8},
+	{0x03D2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03A5},
+	{0x03D5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C6},
+	{0x03D6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C0},
+	{0x03F0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03BA},
+	{0x03F1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C1},
+	{0x03F2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C2},
+	{0x03F4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0398},
+	{0x03F5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B5},
+	{0x03F9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03A3},
+	{0x0483, 230, 0, 0},
+	{0x0484, 230, 0, 0},
+	{0x0485, 230, 0, 0},
+	{0x0486, 230, 0, 0},
+	{0x0487, 230, 0, 0},
+	{0x0587, 0, 2 | DECOMP_COMPAT, 723},
+	{0x0591, 220, 0, 0},
+	{0x0592, 230, 0, 0},
+	{0x0593, 230, 0, 0},
+	{0x0594, 230, 0, 0},
+	{0x0595, 230, 0, 0},
+	{0x0596, 220, 0, 0},
+	{0x0597, 230, 0, 0},
+	{0x0598, 230, 0, 0},
+	{0x0599, 230, 0, 0},
+	{0x059A, 222, 0, 0},
+	{0x059B, 220, 0, 0},
+	{0x059C, 230, 0, 0},
+	{0x059D, 230, 0, 0},
+	{0x059E, 230, 0, 0},
+	{0x059F, 230, 0, 0},
+	{0x05A0, 230, 0, 0},
+	{0x05A1, 230, 0, 0},
+	{0x05A2, 220, 0, 0},
+	{0x05A3, 220, 0, 0},
+	{0x05A4, 220, 0, 0},
+	{0x05A5, 220, 0, 0},
+	{0x05A6, 220, 0, 0},
+	{0x05A7, 220, 0, 0},
+	{0x05A8, 230, 0, 0},
+	{0x05A9, 230, 0, 0},
+	{0x05AA, 220, 0, 0},
+	{0x05AB, 230, 0, 0},
+	{0x05AC, 230, 0, 0},
+	{0x05AD, 222, 0, 0},
+	{0x05AE, 228, 0, 0},
+	{0x05AF, 230, 0, 0},
+	{0x05B0, 10, 0, 0},
+	{0x05B1, 11, 0, 0},
+	{0x05B2, 12, 0, 0},
+	{0x05B3, 13, 0, 0},
+	{0x05B4, 14, 0, 0},
+	{0x05B5, 15, 0, 0},
+	{0x05B6, 16, 0, 0},
+	{0x05B7, 17, 0, 0},
+	{0x05B8, 18, 0, 0},
+	{0x05B9, 19, 0, 0},
+	{0x05BA, 19, 0, 0},
+	{0x05BB, 20, 0, 0},
+	{0x05BC, 21, 0, 0},
+	{0x05BD, 22, 0, 0},
+	{0x05BF, 23, 0, 0},
+	{0x05C1, 24, 0, 0},
+	{0x05C2, 25, 0, 0},
+	{0x05C4, 230, 0, 0},
+	{0x05C5, 220, 0, 0},
+	{0x05C7, 18, 0, 0},
+	{0x0610, 230, 0, 0},
+	{0x0611, 230, 0, 0},
+	{0x0612, 230, 0, 0},
+	{0x0613, 230, 0, 0},
+	{0x0614, 230, 0, 0},
+	{0x0615, 230, 0, 0},
+	{0x0616, 230, 0, 0},
+	{0x0617, 230, 0, 0},
+	{0x0618, 30, 0, 0},
+	{0x0619, 31, 0, 0},
+	{0x061A, 32, 0, 0},
+	{0x064B, 27, 0, 0},
+	{0x064C, 28, 0, 0},
+	{0x064D, 29, 0, 0},
+	{0x064E, 30, 0, 0},
+	{0x064F, 31, 0, 0},
+	{0x0650, 32, 0, 0},
+	{0x0651, 33, 0, 0},
+	{0x0652, 34, 0, 0},
+	{0x0653, 230, 0, 0},
+	{0x0654, 230, 0, 0},
+	{0x0655, 220, 0, 0},
+	{0x0656, 220, 0, 0},
+	{0x0657, 230, 0, 0},
+	{0x0658, 230, 0, 0},
+	{0x0659, 230, 0, 0},
+	{0x065A, 230, 0, 0},
+	{0x065B, 230, 0, 0},
+	{0x065C, 220, 0, 0},
+	{0x065D, 230, 0, 0},
+	{0x065E, 230, 0, 0},
+	{0x065F, 220, 0, 0},
+	{0x0670, 35, 0, 0},
+	{0x0675, 0, 2 | DECOMP_COMPAT, 735},
+	{0x0676, 0, 2 | DECOMP_COMPAT, 737},
+	{0x0677, 0, 2 | DECOMP_COMPAT, 739},
+	{0x0678, 0, 2 | DECOMP_COMPAT, 741},
+	{0x06D6, 230, 0, 0},
+	{0x06D7, 230, 0, 0},
+	{0x06D8, 230, 0, 0},
+	{0x06D9, 230, 0, 0},
+	{0x06DA, 230, 0, 0},
+	{0x06DB, 230, 0, 0},
+	{0x06DC, 230, 0, 0},
+	{0x06DF, 230, 0, 0},
+	{0x06E0, 230, 0, 0},
+	{0x06E1, 230, 0, 0},
+	{0x06E2, 230, 0, 0},
+	{0x06E3, 220, 0, 0},
+	{0x06E4, 230, 0, 0},
+	{0x06E7, 230, 0, 0},
+	{0x06E8, 230, 0, 0},
+	{0x06EA, 220, 0, 0},
+	{0x06EB, 230, 0, 0},
+	{0x06EC, 230, 0, 0},
+	{0x06ED, 220, 0, 0},
+	{0x0711, 36, 0, 0},
+	{0x0730, 230, 0, 0},
+	{0x0731, 220, 0, 0},
+	{0x0732, 230, 0, 0},
+	{0x0733, 230, 0, 0},
+	{0x0734, 220, 0, 0},
+	{0x0735, 230, 0, 0},
+	{0x0736, 230, 0, 0},
+	{0x0737, 220, 0, 0},
+	{0x0738, 220, 0, 0},
+	{0x0739, 220, 0, 0},
+	{0x073A, 230, 0, 0},
+	{0x073B, 220, 0, 0},
+	{0x073C, 220, 0, 0},
+	{0x073D, 230, 0, 0},
+	{0x073E, 220, 0, 0},
+	{0x073F, 230, 0, 0},
+	{0x0740, 230, 0, 0},
+	{0x0741, 230, 0, 0},
+	{0x0742, 220, 0, 0},
+	{0x0743, 230, 0, 0},
+	{0x0744, 220, 0, 0},
+	{0x0745, 230, 0, 0},
+	{0x0746, 220, 0, 0},
+	{0x0747, 230, 0, 0},
+	{0x0748, 220, 0, 0},
+	{0x0749, 230, 0, 0},
+	{0x074A, 230, 0, 0},
+	{0x07EB, 230, 0, 0},
+	{0x07EC, 230, 0, 0},
+	{0x07ED, 230, 0, 0},
+	{0x07EE, 230, 0, 0},
+	{0x07EF, 230, 0, 0},
+	{0x07F0, 230, 0, 0},
+	{0x07F1, 230, 0, 0},
+	{0x07F2, 220, 0, 0},
+	{0x07F3, 230, 0, 0},
+	{0x07FD, 220, 0, 0},
+	{0x0816, 230, 0, 0},
+	{0x0817, 230, 0, 0},
+	{0x0818, 230, 0, 0},
+	{0x0819, 230, 0, 0},
+	{0x081B, 230, 0, 0},
+	{0x081C, 230, 0, 0},
+	{0x081D, 230, 0, 0},
+	{0x081E, 230, 0, 0},
+	{0x081F, 230, 0, 0},
+	{0x0820, 230, 0, 0},
+	{0x0821, 230, 0, 0},
+	{0x0822, 230, 0, 0},
+	{0x0823, 230, 0, 0},
+	{0x0825, 230, 0, 0},
+	{0x0826, 230, 0, 0},
+	{0x0827, 230, 0, 0},
+	{0x0829, 230, 0, 0},
+	{0x082A, 230, 0, 0},
+	{0x082B, 230, 0, 0},
+	{0x082C, 230, 0, 0},
+	{0x082D, 230, 0, 0},
+	{0x0859, 220, 0, 0},
+	{0x085A, 220, 0, 0},
+	{0x085B, 220, 0, 0},
+	{0x08D3, 220, 0, 0},
+	{0x08D4, 230, 0, 0},
+	{0x08D5, 230, 0, 0},
+	{0x08D6, 230, 0, 0},
+	{0x08D7, 230, 0, 0},
+	{0x08D8, 230, 0, 0},
+	{0x08D9, 230, 0, 0},
+	{0x08DA, 230, 0, 0},
+	{0x08DB, 230, 0, 0},
+	{0x08DC, 230, 0, 0},
+	{0x08DD, 230, 0, 0},
+	{0x08DE, 230, 0, 0},
+	{0x08DF, 230, 0, 0},
+	{0x08E0, 230, 0, 0},
+	{0x08E1, 230, 0, 0},
+	{0x08E3, 220, 0, 0},
+	{0x08E4, 230, 0, 0},
+	{0x08E5, 230, 0, 0},
+	{0x08E6, 220, 0, 0},
+	{0x08E7, 230, 0, 0},
+	{0x08E8, 230, 0, 0},
+	{0x08E9, 220, 0, 0},
+	{0x08EA, 230, 0, 0},
+	{0x08EB, 230, 0, 0},
+	{0x08EC, 230, 0, 0},
+	{0x08ED, 220, 0, 0},
+	{0x08EE, 220, 0, 0},
+	{0x08EF, 220, 0, 0},
+	{0x08F0, 27, 0, 0},
+	{0x08F1, 28, 0, 0},
+	{0x08F2, 29, 0, 0},
+	{0x08F3, 230, 0, 0},
+	{0x08F4, 230, 0, 0},
+	{0x08F5, 230, 0, 0},
+	{0x08F6, 220, 0, 0},
+	{0x08F7, 230, 0, 0},
+	{0x08F8, 230, 0, 0},
+	{0x08F9, 220, 0, 0},
+	{0x08FA, 220, 0, 0},
+	{0x08FB, 230, 0, 0},
+	{0x08FC, 230, 0, 0},
+	{0x08FD, 230, 0, 0},
+	{0x08FE, 230, 0, 0},
+	{0x08FF, 230, 0, 0},
+	{0x093C, 7, 0, 0},
+	{0x094D, 9, 0, 0},
+	{0x0951, 230, 0, 0},
+	{0x0952, 220, 0, 0},
+	{0x0953, 230, 0, 0},
+	{0x0954, 230, 0, 0},
+	{0x0958, 0, 2 | DECOMP_NO_COMPOSE, 755},	/* in exclusion list */
+	{0x0959, 0, 2 | DECOMP_NO_COMPOSE, 757},	/* in exclusion list */
+	{0x095A, 0, 2 | DECOMP_NO_COMPOSE, 759},	/* in exclusion list */
+	{0x095B, 0, 2 | DECOMP_NO_COMPOSE, 761},	/* in exclusion list */
+	{0x095C, 0, 2 | DECOMP_NO_COMPOSE, 763},	/* in exclusion list */
+	{0x095D, 0, 2 | DECOMP_NO_COMPOSE, 765},	/* in exclusion list */
+	{0x095E, 0, 2 | DECOMP_NO_COMPOSE, 767},	/* in exclusion list */
+	{0x095F, 0, 2 | DECOMP_NO_COMPOSE, 769},	/* in exclusion list */
+	{0x09BC, 7, 0, 0},
+	{0x09CD, 9, 0, 0},
+	{0x09DC, 0, 2 | DECOMP_NO_COMPOSE, 775},	/* in exclusion list */
+	{0x09DD, 0, 2 | DECOMP_NO_COMPOSE, 777},	/* in exclusion list */
+	{0x09DF, 0, 2 | DECOMP_NO_COMPOSE, 779},	/* in exclusion list */
+	{0x09FE, 230, 0, 0},
+	{0x0A33, 0, 2 | DECOMP_NO_COMPOSE, 781},	/* in exclusion list */
+	{0x0A36, 0, 2 | DECOMP_NO_COMPOSE, 783},	/* in exclusion list */
+	{0x0A3C, 7, 0, 0},
+	{0x0A4D, 9, 0, 0},
+	{0x0A59, 0, 2 | DECOMP_NO_COMPOSE, 785},	/* in exclusion list */
+	{0x0A5A, 0, 2 | DECOMP_NO_COMPOSE, 787},	/* in exclusion list */
+	{0x0A5B, 0, 2 | DECOMP_NO_COMPOSE, 789},	/* in exclusion list */
+	{0x0A5E, 0, 2 | DECOMP_NO_COMPOSE, 791},	/* in exclusion list */
+	{0x0ABC, 7, 0, 0},
+	{0x0ACD, 9, 0, 0},
+	{0x0B3C, 7, 0, 0},
+	{0x0B4D, 9, 0, 0},
+	{0x0B5C, 0, 2 | DECOMP_NO_COMPOSE, 799},	/* in exclusion list */
+	{0x0B5D, 0, 2 | DECOMP_NO_COMPOSE, 801},	/* in exclusion list */
+	{0x0BCD, 9, 0, 0},
+	{0x0C4D, 9, 0, 0},
+	{0x0C55, 84, 0, 0},
+	{0x0C56, 91, 0, 0},
+	{0x0CBC, 7, 0, 0},
+	{0x0CCD, 9, 0, 0},
+	{0x0D3B, 9, 0, 0},
+	{0x0D3C, 9, 0, 0},
+	{0x0D4D, 9, 0, 0},
+	{0x0DCA, 9, 0, 0},
+	{0x0E33, 0, 2 | DECOMP_COMPAT, 837},
+	{0x0E38, 103, 0, 0},
+	{0x0E39, 103, 0, 0},
+	{0x0E3A, 9, 0, 0},
+	{0x0E48, 107, 0, 0},
+	{0x0E49, 107, 0, 0},
+	{0x0E4A, 107, 0, 0},
+	{0x0E4B, 107, 0, 0},
+	{0x0EB3, 0, 2 | DECOMP_COMPAT, 839},
+	{0x0EB8, 118, 0, 0},
+	{0x0EB9, 118, 0, 0},
+	{0x0EBA, 9, 0, 0},
+	{0x0EC8, 122, 0, 0},
+	{0x0EC9, 122, 0, 0},
+	{0x0ECA, 122, 0, 0},
+	{0x0ECB, 122, 0, 0},
+	{0x0EDC, 0, 2 | DECOMP_COMPAT, 841},
+	{0x0EDD, 0, 2 | DECOMP_COMPAT, 843},
+	{0x0F0C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0F0B},
+	{0x0F18, 220, 0, 0},
+	{0x0F19, 220, 0, 0},
+	{0x0F35, 220, 0, 0},
+	{0x0F37, 220, 0, 0},
+	{0x0F39, 216, 0, 0},
+	{0x0F43, 0, 2 | DECOMP_NO_COMPOSE, 845},	/* in exclusion list */
+	{0x0F4D, 0, 2 | DECOMP_NO_COMPOSE, 847},	/* in exclusion list */
+	{0x0F52, 0, 2 | DECOMP_NO_COMPOSE, 849},	/* in exclusion list */
+	{0x0F57, 0, 2 | DECOMP_NO_COMPOSE, 851},	/* in exclusion list */
+	{0x0F5C, 0, 2 | DECOMP_NO_COMPOSE, 853},	/* in exclusion list */
+	{0x0F69, 0, 2 | DECOMP_NO_COMPOSE, 855},	/* in exclusion list */
+	{0x0F71, 129, 0, 0},
+	{0x0F72, 130, 0, 0},
+	{0x0F73, 0, 2 | DECOMP_NO_COMPOSE, 857},	/* non-starter decomposition */
+	{0x0F74, 132, 0, 0},
+	{0x0F75, 0, 2 | DECOMP_NO_COMPOSE, 859},	/* non-starter decomposition */
+	{0x0F76, 0, 2 | DECOMP_NO_COMPOSE, 861},	/* in exclusion list */
+	{0x0F77, 0, 2 | DECOMP_COMPAT, 863},
+	{0x0F78, 0, 2 | DECOMP_NO_COMPOSE, 865},	/* in exclusion list */
+	{0x0F79, 0, 2 | DECOMP_COMPAT, 867},
+	{0x0F7A, 130, 0, 0},
+	{0x0F7B, 130, 0, 0},
+	{0x0F7C, 130, 0, 0},
+	{0x0F7D, 130, 0, 0},
+	{0x0F80, 130, 0, 0},
+	{0x0F81, 0, 2 | DECOMP_NO_COMPOSE, 869},	/* non-starter decomposition */
+	{0x0F82, 230, 0, 0},
+	{0x0F83, 230, 0, 0},
+	{0x0F84, 9, 0, 0},
+	{0x0F86, 230, 0, 0},
+	{0x0F87, 230, 0, 0},
+	{0x0F93, 0, 2 | DECOMP_NO_COMPOSE, 871},	/* in exclusion list */
+	{0x0F9D, 0, 2 | DECOMP_NO_COMPOSE, 873},	/* in exclusion list */
+	{0x0FA2, 0, 2 | DECOMP_NO_COMPOSE, 875},	/* in exclusion list */
+	{0x0FA7, 0, 2 | DECOMP_NO_COMPOSE, 877},	/* in exclusion list */
+	{0x0FAC, 0, 2 | DECOMP_NO_COMPOSE, 879},	/* in exclusion list */
+	{0x0FB9, 0, 2 | DECOMP_NO_COMPOSE, 881},	/* in exclusion list */
+	{0x0FC6, 220, 0, 0},
+	{0x1037, 7, 0, 0},
+	{0x1039, 9, 0, 0},
+	{0x103A, 9, 0, 0},
+	{0x108D, 220, 0, 0},
+	{0x10FC, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x10DC},
+	{0x135D, 230, 0, 0},
+	{0x135E, 230, 0, 0},
+	{0x135F, 230, 0, 0},
+	{0x1714, 9, 0, 0},
+	{0x1734, 9, 0, 0},
+	{0x17D2, 9, 0, 0},
+	{0x17DD, 230, 0, 0},
+	{0x18A9, 228, 0, 0},
+	{0x1939, 222, 0, 0},
+	{0x193A, 230, 0, 0},
+	{0x193B, 220, 0, 0},
+	{0x1A17, 230, 0, 0},
+	{0x1A18, 220, 0, 0},
+	{0x1A60, 9, 0, 0},
+	{0x1A75, 230, 0, 0},
+	{0x1A76, 230, 0, 0},
+	{0x1A77, 230, 0, 0},
+	{0x1A78, 230, 0, 0},
+	{0x1A79, 230, 0, 0},
+	{0x1A7A, 230, 0, 0},
+	{0x1A7B, 230, 0, 0},
+	{0x1A7C, 230, 0, 0},
+	{0x1A7F, 220, 0, 0},
+	{0x1AB0, 230, 0, 0},
+	{0x1AB1, 230, 0, 0},
+	{0x1AB2, 230, 0, 0},
+	{0x1AB3, 230, 0, 0},
+	{0x1AB4, 230, 0, 0},
+	{0x1AB5, 220, 0, 0},
+	{0x1AB6, 220, 0, 0},
+	{0x1AB7, 220, 0, 0},
+	{0x1AB8, 220, 0, 0},
+	{0x1AB9, 220, 0, 0},
+	{0x1ABA, 220, 0, 0},
+	{0x1ABB, 230, 0, 0},
+	{0x1ABC, 230, 0, 0},
+	{0x1ABD, 220, 0, 0},
+	{0x1ABF, 220, 0, 0},
+	{0x1AC0, 220, 0, 0},
+	{0x1B34, 7, 0, 0},
+	{0x1B44, 9, 0, 0},
+	{0x1B6B, 230, 0, 0},
+	{0x1B6C, 220, 0, 0},
+	{0x1B6D, 230, 0, 0},
+	{0x1B6E, 230, 0, 0},
+	{0x1B6F, 230, 0, 0},
+	{0x1B70, 230, 0, 0},
+	{0x1B71, 230, 0, 0},
+	{0x1B72, 230, 0, 0},
+	{0x1B73, 230, 0, 0},
+	{0x1BAA, 9, 0, 0},
+	{0x1BAB, 9, 0, 0},
+	{0x1BE6, 7, 0, 0},
+	{0x1BF2, 9, 0, 0},
+	{0x1BF3, 9, 0, 0},
+	{0x1C37, 7, 0, 0},
+	{0x1CD0, 230, 0, 0},
+	{0x1CD1, 230, 0, 0},
+	{0x1CD2, 230, 0, 0},
+	{0x1CD4, 1, 0, 0},
+	{0x1CD5, 220, 0, 0},
+	{0x1CD6, 220, 0, 0},
+	{0x1CD7, 220, 0, 0},
+	{0x1CD8, 220, 0, 0},
+	{0x1CD9, 220, 0, 0},
+	{0x1CDA, 230, 0, 0},
+	{0x1CDB, 230, 0, 0},
+	{0x1CDC, 220, 0, 0},
+	{0x1CDD, 220, 0, 0},
+	{0x1CDE, 220, 0, 0},
+	{0x1CDF, 220, 0, 0},
+	{0x1CE0, 230, 0, 0},
+	{0x1CE2, 1, 0, 0},
+	{0x1CE3, 1, 0, 0},
+	{0x1CE4, 1, 0, 0},
+	{0x1CE5, 1, 0, 0},
+	{0x1CE6, 1, 0, 0},
+	{0x1CE7, 1, 0, 0},
+	{0x1CE8, 1, 0, 0},
+	{0x1CED, 220, 0, 0},
+	{0x1CF4, 230, 0, 0},
+	{0x1CF8, 230, 0, 0},
+	{0x1CF9, 230, 0, 0},
+	{0x1D2C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0041},
+	{0x1D2D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x00C6},
+	{0x1D2E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0042},
+	{0x1D30, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0044},
+	{0x1D31, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0045},
+	{0x1D32, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x018E},
+	{0x1D33, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0047},
+	{0x1D34, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0048},
+	{0x1D35, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0049},
+	{0x1D36, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004A},
+	{0x1D37, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004B},
+	{0x1D38, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004C},
+	{0x1D39, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004D},
+	{0x1D3A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004E},
+	{0x1D3C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004F},
+	{0x1D3D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0222},
+	{0x1D3E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0050},
+	{0x1D3F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0052},
+	{0x1D40, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0054},
+	{0x1D41, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0055},
+	{0x1D42, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0057},
+	{0x1D43, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0061},
+	{0x1D44, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0250},
+	{0x1D45, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0251},
+	{0x1D46, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D02},
+	{0x1D47, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0062},
+	{0x1D48, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0064},
+	{0x1D49, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0065},
+	{0x1D4A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0259},
+	{0x1D4B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x025B},
+	{0x1D4C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x025C},
+	{0x1D4D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0067},
+	{0x1D4F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006B},
+	{0x1D50, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006D},
+	{0x1D51, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x014B},
+	{0x1D52, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006F},
+	{0x1D53, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0254},
+	{0x1D54, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D16},
+	{0x1D55, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D17},
+	{0x1D56, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0070},
+	{0x1D57, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0074},
+	{0x1D58, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0075},
+	{0x1D59, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D1D},
+	{0x1D5A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x026F},
+	{0x1D5B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0076},
+	{0x1D5C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D25},
+	{0x1D5D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B2},
+	{0x1D5E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B3},
+	{0x1D5F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B4},
+	{0x1D60, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C6},
+	{0x1D61, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C7},
+	{0x1D62, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0069},
+	{0x1D63, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0072},
+	{0x1D64, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0075},
+	{0x1D65, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0076},
+	{0x1D66, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B2},
+	{0x1D67, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B3},
+	{0x1D68, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C1},
+	{0x1D69, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C6},
+	{0x1D6A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03C7},
+	{0x1D78, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x043D},
+	{0x1D9B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0252},
+	{0x1D9C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0063},
+	{0x1D9D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0255},
+	{0x1D9E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x00F0},
+	{0x1D9F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x025C},
+	{0x1DA0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0066},
+	{0x1DA1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x025F},
+	{0x1DA2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0261},
+	{0x1DA3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0265},
+	{0x1DA4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0268},
+	{0x1DA5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0269},
+	{0x1DA6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x026A},
+	{0x1DA7, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D7B},
+	{0x1DA8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x029D},
+	{0x1DA9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x026D},
+	{0x1DAA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D85},
+	{0x1DAB, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x029F},
+	{0x1DAC, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0271},
+	{0x1DAD, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0270},
+	{0x1DAE, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0272},
+	{0x1DAF, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0273},
+	{0x1DB0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0274},
+	{0x1DB1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0275},
+	{0x1DB2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0278},
+	{0x1DB3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0282},
+	{0x1DB4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0283},
+	{0x1DB5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x01AB},
+	{0x1DB6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0289},
+	{0x1DB7, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x028A},
+	{0x1DB8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1D1C},
+	{0x1DB9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x028B},
+	{0x1DBA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x028C},
+	{0x1DBB, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x007A},
+	{0x1DBC, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0290},
+	{0x1DBD, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0291},
+	{0x1DBE, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0292},
+	{0x1DBF, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x03B8},
+	{0x1DC0, 230, 0, 0},
+	{0x1DC1, 230, 0, 0},
+	{0x1DC2, 220, 0, 0},
+	{0x1DC3, 230, 0, 0},
+	{0x1DC4, 230, 0, 0},
+	{0x1DC5, 230, 0, 0},
+	{0x1DC6, 230, 0, 0},
+	{0x1DC7, 230, 0, 0},
+	{0x1DC8, 230, 0, 0},
+	{0x1DC9, 230, 0, 0},
+	{0x1DCA, 220, 0, 0},
+	{0x1DCB, 230, 0, 0},
+	{0x1DCC, 230, 0, 0},
+	{0x1DCD, 234, 0, 0},
+	{0x1DCE, 214, 0, 0},
+	{0x1DCF, 220, 0, 0},
+	{0x1DD0, 202, 0, 0},
+	{0x1DD1, 230, 0, 0},
+	{0x1DD2, 230, 0, 0},
+	{0x1DD3, 230, 0, 0},
+	{0x1DD4, 230, 0, 0},
+	{0x1DD5, 230, 0, 0},
+	{0x1DD6, 230, 0, 0},
+	{0x1DD7, 230, 0, 0},
+	{0x1DD8, 230, 0, 0},
+	{0x1DD9, 230, 0, 0},
+	{0x1DDA, 230, 0, 0},
+	{0x1DDB, 230, 0, 0},
+	{0x1DDC, 230, 0, 0},
+	{0x1DDD, 230, 0, 0},
+	{0x1DDE, 230, 0, 0},
+	{0x1DDF, 230, 0, 0},
+	{0x1DE0, 230, 0, 0},
+	{0x1DE1, 230, 0, 0},
+	{0x1DE2, 230, 0, 0},
+	{0x1DE3, 230, 0, 0},
+	{0x1DE4, 230, 0, 0},
+	{0x1DE5, 230, 0, 0},
+	{0x1DE6, 230, 0, 0},
+	{0x1DE7, 230, 0, 0},
+	{0x1DE8, 230, 0, 0},
+	{0x1DE9, 230, 0, 0},
+	{0x1DEA, 230, 0, 0},
+	{0x1DEB, 230, 0, 0},
+	{0x1DEC, 230, 0, 0},
+	{0x1DED, 230, 0, 0},
+	{0x1DEE, 230, 0, 0},
+	{0x1DEF, 230, 0, 0},
+	{0x1DF0, 230, 0, 0},
+	{0x1DF1, 230, 0, 0},
+	{0x1DF2, 230, 0, 0},
+	{0x1DF3, 230, 0, 0},
+	{0x1DF4, 230, 0, 0},
+	{0x1DF5, 230, 0, 0},
+	{0x1DF6, 232, 0, 0},
+	{0x1DF7, 228, 0, 0},
+	{0x1DF8, 228, 0, 0},
+	{0x1DF9, 220, 0, 0},
+	{0x1DFB, 230, 0, 0},
+	{0x1DFC, 233, 0, 0},
+	{0x1DFD, 220, 0, 0},
+	{0x1DFE, 230, 0, 0},
+	{0x1DFF, 220, 0, 0},
+	{0x1E9A, 0, 2 | DECOMP_COMPAT, 1215},
 	{0x1F71, 0, 1 | DECOMP_INLINE, 0x03AC},
-	{0x1F72, 0, 2, 1601},
 	{0x1F73, 0, 1 | DECOMP_INLINE, 0x03AD},
-	{0x1F74, 0, 2, 1603},
 	{0x1F75, 0, 1 | DECOMP_INLINE, 0x03AE},
-	{0x1F76, 0, 2, 1605},
 	{0x1F77, 0, 1 | DECOMP_INLINE, 0x03AF},
-	{0x1F78, 0, 2, 1607},
 	{0x1F79, 0, 1 | DECOMP_INLINE, 0x03CC},
-	{0x1F7A, 0, 2, 1609},
 	{0x1F7B, 0, 1 | DECOMP_INLINE, 0x03CD},
-	{0x1F7C, 0, 2, 1611},
 	{0x1F7D, 0, 1 | DECOMP_INLINE, 0x03CE},
-	{0x1F80, 0, 2, 1613},
-	{0x1F81, 0, 2, 1615},
-	{0x1F82, 0, 2, 1617},
-	{0x1F83, 0, 2, 1619},
-	{0x1F84, 0, 2, 1621},
-	{0x1F85, 0, 2, 1623},
-	{0x1F86, 0, 2, 1625},
-	{0x1F87, 0, 2, 1627},
-	{0x1F88, 0, 2, 1629},
-	{0x1F89, 0, 2, 1631},
-	{0x1F8A, 0, 2, 1633},
-	{0x1F8B, 0, 2, 1635},
-	{0x1F8C, 0, 2, 1637},
-	{0x1F8D, 0, 2, 1639},
-	{0x1F8E, 0, 2, 1641},
-	{0x1F8F, 0, 2, 1643},
-	{0x1F90, 0, 2, 1645},
-	{0x1F91, 0, 2, 1647},
-	{0x1F92, 0, 2, 1649},
-	{0x1F93, 0, 2, 1651},
-	{0x1F94, 0, 2, 1653},
-	{0x1F95, 0, 2, 1655},
-	{0x1F96, 0, 2, 1657},
-	{0x1F97, 0, 2, 1659},
-	{0x1F98, 0, 2, 1661},
-	{0x1F99, 0, 2, 1663},
-	{0x1F9A, 0, 2, 1665},
-	{0x1F9B, 0, 2, 1667},
-	{0x1F9C, 0, 2, 1669},
-	{0x1F9D, 0, 2, 1671},
-	{0x1F9E, 0, 2, 1673},
-	{0x1F9F, 0, 2, 1675},
-	{0x1FA0, 0, 2, 1677},
-	{0x1FA1, 0, 2, 1679},
-	{0x1FA2, 0, 2, 1681},
-	{0x1FA3, 0, 2, 1683},
-	{0x1FA4, 0, 2, 1685},
-	{0x1FA5, 0, 2, 1687},
-	{0x1FA6, 0, 2, 1689},
-	{0x1FA7, 0, 2, 1691},
-	{0x1FA8, 0, 2, 1693},
-	{0x1FA9, 0, 2, 1695},
-	{0x1FAA, 0, 2, 1697},
-	{0x1FAB, 0, 2, 1699},
-	{0x1FAC, 0, 2, 1701},
-	{0x1FAD, 0, 2, 1703},
-	{0x1FAE, 0, 2, 1705},
-	{0x1FAF, 0, 2, 1707},
-	{0x1FB0, 0, 2, 1709},
-	{0x1FB1, 0, 2, 1711},
-	{0x1FB2, 0, 2, 1713},
-	{0x1FB3, 0, 2, 1715},
-	{0x1FB4, 0, 2, 1717},
-	{0x1FB6, 0, 2, 1719},
-	{0x1FB7, 0, 2, 1721},
-	{0x1FB8, 0, 2, 1723},
-	{0x1FB9, 0, 2, 1725},
-	{0x1FBA, 0, 2, 1727},
 	{0x1FBB, 0, 1 | DECOMP_INLINE, 0x0386},
-	{0x1FBC, 0, 2, 1729},
 	{0x1FBD, 0, 2 | DECOMP_COMPAT, 1731},
 	{0x1FBE, 0, 1 | DECOMP_INLINE, 0x03B9},
 	{0x1FBF, 0, 2 | DECOMP_COMPAT, 1733},
 	{0x1FC0, 0, 2 | DECOMP_COMPAT, 1735},
-	{0x1FC1, 0, 2, 1737},
-	{0x1FC2, 0, 2, 1739},
-	{0x1FC3, 0, 2, 1741},
-	{0x1FC4, 0, 2, 1743},
-	{0x1FC6, 0, 2, 1745},
-	{0x1FC7, 0, 2, 1747},
-	{0x1FC8, 0, 2, 1749},
 	{0x1FC9, 0, 1 | DECOMP_INLINE, 0x0388},
-	{0x1FCA, 0, 2, 1751},
 	{0x1FCB, 0, 1 | DECOMP_INLINE, 0x0389},
-	{0x1FCC, 0, 2, 1753},
-	{0x1FCD, 0, 2, 1755},
-	{0x1FCE, 0, 2, 1757},
-	{0x1FCF, 0, 2, 1759},
-	{0x1FD0, 0, 2, 1761},
-	{0x1FD1, 0, 2, 1763},
-	{0x1FD2, 0, 2, 1765},
 	{0x1FD3, 0, 1 | DECOMP_INLINE, 0x0390},
-	{0x1FD6, 0, 2, 1767},
-	{0x1FD7, 0, 2, 1769},
-	{0x1FD8, 0, 2, 1771},
-	{0x1FD9, 0, 2, 1773},
-	{0x1FDA, 0, 2, 1775},
 	{0x1FDB, 0, 1 | DECOMP_INLINE, 0x038A},
-	{0x1FDD, 0, 2, 1777},
-	{0x1FDE, 0, 2, 1779},
-	{0x1FDF, 0, 2, 1781},
-	{0x1FE0, 0, 2, 1783},
-	{0x1FE1, 0, 2, 1785},
-	{0x1FE2, 0, 2, 1787},
 	{0x1FE3, 0, 1 | DECOMP_INLINE, 0x03B0},
-	{0x1FE4, 0, 2, 1789},
-	{0x1FE5, 0, 2, 1791},
-	{0x1FE6, 0, 2, 1793},
-	{0x1FE7, 0, 2, 1795},
-	{0x1FE8, 0, 2, 1797},
-	{0x1FE9, 0, 2, 1799},
-	{0x1FEA, 0, 2, 1801},
 	{0x1FEB, 0, 1 | DECOMP_INLINE, 0x038E},
-	{0x1FEC, 0, 2, 1803},
-	{0x1FED, 0, 2, 1805},
 	{0x1FEE, 0, 1 | DECOMP_INLINE, 0x0385},
 	{0x1FEF, 0, 1 | DECOMP_INLINE, 0x0060},
-	{0x1FF2, 0, 2, 1807},
-	{0x1FF3, 0, 2, 1809},
-	{0x1FF4, 0, 2, 1811},
-	{0x1FF6, 0, 2, 1813},
-	{0x1FF7, 0, 2, 1815},
-	{0x1FF8, 0, 2, 1817},
 	{0x1FF9, 0, 1 | DECOMP_INLINE, 0x038C},
-	{0x1FFA, 0, 2, 1819},
 	{0x1FFB, 0, 1 | DECOMP_INLINE, 0x038F},
-	{0x1FFC, 0, 2, 1821},
 	{0x1FFD, 0, 1 | DECOMP_INLINE, 0x00B4},
 	{0x1FFE, 0, 2 | DECOMP_COMPAT, 1823},
 	{0x2000, 0, 1 | DECOMP_INLINE, 0x2002},
@@ -1839,54 +1965,10 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x217E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0064},
 	{0x217F, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x006D},
 	{0x2189, 0, 3 | DECOMP_COMPAT, 1980},
-	{0x219A, 0, 2, 1983},
-	{0x219B, 0, 2, 1985},
-	{0x21AE, 0, 2, 1987},
-	{0x21CD, 0, 2, 1989},
-	{0x21CE, 0, 2, 1991},
-	{0x21CF, 0, 2, 1993},
-	{0x2204, 0, 2, 1995},
-	{0x2209, 0, 2, 1997},
-	{0x220C, 0, 2, 1999},
-	{0x2224, 0, 2, 2001},
-	{0x2226, 0, 2, 2003},
 	{0x222C, 0, 2 | DECOMP_COMPAT, 2005},
 	{0x222D, 0, 3 | DECOMP_COMPAT, 2007},
 	{0x222F, 0, 2 | DECOMP_COMPAT, 2010},
 	{0x2230, 0, 3 | DECOMP_COMPAT, 2012},
-	{0x2241, 0, 2, 2015},
-	{0x2244, 0, 2, 2017},
-	{0x2247, 0, 2, 2019},
-	{0x2249, 0, 2, 2021},
-	{0x2260, 0, 2, 2023},
-	{0x2262, 0, 2, 2025},
-	{0x226D, 0, 2, 2027},
-	{0x226E, 0, 2, 2029},
-	{0x226F, 0, 2, 2031},
-	{0x2270, 0, 2, 2033},
-	{0x2271, 0, 2, 2035},
-	{0x2274, 0, 2, 2037},
-	{0x2275, 0, 2, 2039},
-	{0x2278, 0, 2, 2041},
-	{0x2279, 0, 2, 2043},
-	{0x2280, 0, 2, 2045},
-	{0x2281, 0, 2, 2047},
-	{0x2284, 0, 2, 2049},
-	{0x2285, 0, 2, 2051},
-	{0x2288, 0, 2, 2053},
-	{0x2289, 0, 2, 2055},
-	{0x22AC, 0, 2, 2057},
-	{0x22AD, 0, 2, 2059},
-	{0x22AE, 0, 2, 2061},
-	{0x22AF, 0, 2, 2063},
-	{0x22E0, 0, 2, 2065},
-	{0x22E1, 0, 2, 2067},
-	{0x22E2, 0, 2, 2069},
-	{0x22E3, 0, 2, 2071},
-	{0x22EA, 0, 2, 2073},
-	{0x22EB, 0, 2, 2075},
-	{0x22EC, 0, 2, 2077},
-	{0x22ED, 0, 2, 2079},
 	{0x2329, 0, 1 | DECOMP_INLINE, 0x3008},
 	{0x232A, 0, 1 | DECOMP_INLINE, 0x3009},
 	{0x2460, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0031},
@@ -2299,69 +2381,11 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x3038, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x5341},
 	{0x3039, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x5344},
 	{0x303A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x5345},
-	{0x304C, 0, 2, 2317},
-	{0x304E, 0, 2, 2319},
-	{0x3050, 0, 2, 2321},
-	{0x3052, 0, 2, 2323},
-	{0x3054, 0, 2, 2325},
-	{0x3056, 0, 2, 2327},
-	{0x3058, 0, 2, 2329},
-	{0x305A, 0, 2, 2331},
-	{0x305C, 0, 2, 2333},
-	{0x305E, 0, 2, 2335},
-	{0x3060, 0, 2, 2337},
-	{0x3062, 0, 2, 2339},
-	{0x3065, 0, 2, 2341},
-	{0x3067, 0, 2, 2343},
-	{0x3069, 0, 2, 2345},
-	{0x3070, 0, 2, 2347},
-	{0x3071, 0, 2, 2349},
-	{0x3073, 0, 2, 2351},
-	{0x3074, 0, 2, 2353},
-	{0x3076, 0, 2, 2355},
-	{0x3077, 0, 2, 2357},
-	{0x3079, 0, 2, 2359},
-	{0x307A, 0, 2, 2361},
-	{0x307C, 0, 2, 2363},
-	{0x307D, 0, 2, 2365},
-	{0x3094, 0, 2, 2367},
 	{0x3099, 8, 0, 0},
 	{0x309A, 8, 0, 0},
 	{0x309B, 0, 2 | DECOMP_COMPAT, 2369},
 	{0x309C, 0, 2 | DECOMP_COMPAT, 2371},
-	{0x309E, 0, 2, 2373},
 	{0x309F, 0, 2 | DECOMP_COMPAT, 2375},
-	{0x30AC, 0, 2, 2377},
-	{0x30AE, 0, 2, 2379},
-	{0x30B0, 0, 2, 2381},
-	{0x30B2, 0, 2, 2383},
-	{0x30B4, 0, 2, 2385},
-	{0x30B6, 0, 2, 2387},
-	{0x30B8, 0, 2, 2389},
-	{0x30BA, 0, 2, 2391},
-	{0x30BC, 0, 2, 2393},
-	{0x30BE, 0, 2, 2395},
-	{0x30C0, 0, 2, 2397},
-	{0x30C2, 0, 2, 2399},
-	{0x30C5, 0, 2, 2401},
-	{0x30C7, 0, 2, 2403},
-	{0x30C9, 0, 2, 2405},
-	{0x30D0, 0, 2, 2407},
-	{0x30D1, 0, 2, 2409},
-	{0x30D3, 0, 2, 2411},
-	{0x30D4, 0, 2, 2413},
-	{0x30D6, 0, 2, 2415},
-	{0x30D7, 0, 2, 2417},
-	{0x30D9, 0, 2, 2419},
-	{0x30DA, 0, 2, 2421},
-	{0x30DC, 0, 2, 2423},
-	{0x30DD, 0, 2, 2425},
-	{0x30F4, 0, 2, 2427},
-	{0x30F7, 0, 2, 2429},
-	{0x30F8, 0, 2, 2431},
-	{0x30F9, 0, 2, 2433},
-	{0x30FA, 0, 2, 2435},
-	{0x30FE, 0, 2, 2437},
 	{0x30FF, 0, 2 | DECOMP_COMPAT, 2439},
 	{0x3131, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1100},
 	{0x3132, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x1101},
@@ -4626,16 +4650,11 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x10F50, 220, 0, 0},
 	{0x11046, 9, 0, 0},
 	{0x1107F, 9, 0, 0},
-	{0x1109A, 0, 2, 4776},
-	{0x1109C, 0, 2, 4778},
-	{0x110AB, 0, 2, 4780},
 	{0x110B9, 9, 0, 0},
 	{0x110BA, 7, 0, 0},
 	{0x11100, 230, 0, 0},
 	{0x11101, 230, 0, 0},
 	{0x11102, 230, 0, 0},
-	{0x1112E, 0, 2, 4782},
-	{0x1112F, 0, 2, 4784},
 	{0x11133, 9, 0, 0},
 	{0x11134, 9, 0, 0},
 	{0x11173, 7, 0, 0},
@@ -4647,8 +4666,6 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x112EA, 9, 0, 0},
 	{0x1133B, 7, 0, 0},
 	{0x1133C, 7, 0, 0},
-	{0x1134B, 0, 2, 4786},
-	{0x1134C, 0, 2, 4788},
 	{0x1134D, 9, 0, 0},
 	{0x11366, 230, 0, 0},
 	{0x11367, 230, 0, 0},
@@ -4665,13 +4682,8 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x11442, 9, 0, 0},
 	{0x11446, 7, 0, 0},
 	{0x1145E, 230, 0, 0},
-	{0x114BB, 0, 2, 4790},
-	{0x114BC, 0, 2, 4792},
-	{0x114BE, 0, 2, 4794},
 	{0x114C2, 9, 0, 0},
 	{0x114C3, 7, 0, 0},
-	{0x115BA, 0, 2, 4796},
-	{0x115BB, 0, 2, 4798},
 	{0x115BF, 9, 0, 0},
 	{0x115C0, 7, 0, 0},
 	{0x1163F, 9, 0, 0},
@@ -4680,7 +4692,6 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x1172B, 9, 0, 0},
 	{0x11839, 9, 0, 0},
 	{0x1183A, 7, 0, 0},
-	{0x11938, 0, 2, 4800},
 	{0x1193D, 9, 0, 0},
 	{0x1193E, 9, 0, 0},
 	{0x11943, 7, 0, 0},
@@ -6641,7 +6652,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6604] =
 	{0x2FA1A, 0, 1 | DECOMP_INLINE, 0x9F0F},
 	{0x2FA1B, 0, 1 | DECOMP_INLINE, 0x9F16},
 	{0x2FA1C, 0, 1 | DECOMP_INLINE, 0x9F3B},
-	{0x2FA1D, 0, 1, 5091}
+	{0x2FA1D, 0, 1, 5091},
 
 };
 
@@ -8935,3 +8946,1684 @@ static const uint32 UnicodeDecomp_codepoints[5092] =
 	 /* 5090 */ 0x2A291,
 	 /* 5091 */ 0x2A600
 };
+
+/* Perfect hash function for decomposition */
+static int
+DecompMain_hash_func(const void *key)
+{
+	static const int16 h[13209] = {
+		     0,    759,   4790,   4791,      0,      0,      0,      0,
+		     0,      0,      0,      0,   2904,   2904,      0,      0,
+		  2905,   2905,  -1432,   2813,   2904,   2904,   2904,  -5133,
+		  3611,   3612,  -5178,  -5178,  -5133,   1803,   1803,    884,
+		  4427,   4428,  -4370,  -4370,  -4325,  -4325,   2661,     98,
+		 -4279,  -4325,  -4325,  -4325,  -4325,  -4325,   2661,   2661,
+		   797,   4401,   4402,   4403,   1096,   1052,   1053,   1054,
+		 -8722,   4413,  17622,   2664,   2664,   2664,   6412,   6413,
+		  6414,   6415,   6416,   6417,   5646,   1892,  -5094,  -4319,
+		  4472,  -5343,  -5343,   4432,   4433,  -5343,  -5343,  -6309,
+		 -3007,   2556,  -5343,  -5343,  -3628,  -3628,  -3628,  -3628,
+		  -906,      0,      0, -10611, -10566,   2887,   2888,   2889,
+		  2890,   2891,  -9616,  -3636,  -8844,  -8844,  -1858,  -5333,
+		 -8797,  -9755,    310,  -5333,  -8842,  -5333,  -1855,    152,
+		   316,   2907,   2908,  -2239,   2910,   2911,   2912,   2913,
+		  2914,   2915,   2916,   2917,   2918,   2919,   2920,   2921,
+		  2922,   2923,   2924,   2925,   2926,   2927,   2928,   2929,
+		  2930,   2931,   2932,   2933,   2934,   2935,   2936,   2937,
+		  2938,   2939,   2940,   2941,   2942,   2943,   2944,   2945,
+		  2946,   2947,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -7767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   942,  32767,    989,  32767,  32767,  32767,  32767,    990,
+		 32767,  32767,  -7733,  -7733,  -4425,  -4380,  32767,  32767,
+		 -7735,  -7735, -20943,  32767, -17642, -14340, -14340,  32767,
+		-11994,  -8692,  -8692,  -8692,  -8692,  -8692,  32767,     52,
+		 -8738,  -8738,  -8693,  -8693,  -8693,  -8693,     59,     60,
+		 32767,  -8739,  -8694,  -8694,  -8694,  -8694,  -8694,  32767,
+		 32767,  -8696,  -8696,  -8696,  -8696,  -8696,  32767,  32767,
+		    26,     27,  -3280,  -3324,     30,     31,  32767,     32,
+		 13241,   9940,   9941,   6640,   6641,   3340,   3341,     40,
+		     0,     41,     42,     43,  -8700,  -8700,     91,  32767,
+		 32767,     47,     48,     49,  -8702,  -8702,  32767,     97,
+		 32767,     53,     54,     55,     56,   2136,   3875,   -537,
+		  4904,     61,     62,     63,     64,     65,     66,     67,
+		    68,  32767,  32767,     69,     70,     71,     72,     73,
+		    74,     75,     76,     77,     78,     79,     80,     81,
+		    82,     83,     84,     85,     86,     87,     88,  32767,
+		 32767,     89,     90,     91,     92,     93,     94,     95,
+		 -8661,  -8661,  32767,  -7805,  -7805,  -8664,  -8664,  -8664,
+		 -8664,  32767,     57,     58,     59,     60,  -3247,  -3291,
+		   912,    913,  32767,  32767,  13271,   9970,   9971,   6670,
+		  6671,   3370,   4216,  32767,  32767,     69,     70,     71,
+		 -8672,  -8672,    119,  32767,  32767,     75,     76,     77,
+		 -8674,  -8674,    125,    126,     82,  -2585,  -2585,  -2585,
+		 -2585,  -5751,  -2585,  -2585,    135,  -2585,    137,  32767,
+		 32767,   7255,    139,  -3159,  -3158,  -3157, -13759,  -7669,
+		  -552,  -3155,    147,  -3154,  -5365,    150,  -3153,  -3152,
+		 -3151,  -3150,  -3149,  -3148,  -3147,  -2520,  -3145,  -3144,
+		   960,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4717,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,   3673,   3674,   2144,   2145,   2146,   2147,   2148,
+		  2149,   2150,   2151,   2152,   2153,   2154,   2155,   2156,
+		  2157,   2158,  -5459,  -5459,  -3599,  -3599,  -3599,  -3599,
+		 -3599,   2665,  -3599,  -3599,  -3599,  -3599,  -3599,  -3599,
+		 -3599,  -3599,   3706,  -3600,  -6989,  -6989,   1755,   1756,
+		 -7034,  -7034,  -6989,    -53,    -53,   -972,   1766,   1767,
+		 -7031,  -7031,  -6986,  -6986,      0,  -2563,  -6940,  -6986,
+		 -6986,  -6986,  -6986,  -6986,      0,      0,   1738,   1739,
+		  1740,   1741,  -1566,  -1610,  -1609,      0,   1748,   1749,
+		 14958,      0,      0,      0,   3748,   3749,   3750,   3751,
+		  3752,   3753,   3754,      0,  -6986,  -6986,   1805,   1806,
+		  1762,   1763,   1764,  -8012,  -8012,  -8978,  -5676,   -113,
+		 -8012,   -113,  -2456,  -6203,  -6203,  -6203,  -6203,  -6203,
+		 -6203,  -5431,  -1676,   5311,   4537,  -4253,   5563,   5564,
+		 -4210,  -4210,   5567,   5568,   6535,   3234,  -2328,   5572,
+		  5573,   3859,   3860,   3861,   3862,   1141,   2056,   9931,
+		 10847,  10803,   3868,   3869,   3870,    328,    328,   9127,
+		  3874,   9083,   9084,   2099,   5575,   9040,   9999,    -65,
+		  5579,   9089,   5581,   2104,     98,    -65,   1271,  12459,
+		  3669,   3669,   3714,   3714,   3714,  13491,  13492,  14459,
+		 11158,   5596,  13496,   5598,   7942,  11690,  11691,  11692,
+		 11693,  11694,  11695,  10924,   7170,    184,    959,   9750,
+		   -65,    -65,   9710,   9711,    -65,    -65,  -1031,   2271,
+		  7834,    -65,    -65,   1650,   1650,   1650,   1650,   4372,
+		  3458,  -4416,  -5331,  -5286,   1650,   1650,   1650,   5193,
+		  5194,  -3604,   1650,  -3558,  -3558,   3428,    -47,  -3511,
+		 -4469,   5596,    -47,  -3556,    -47,   3431,   5438,   5602,
+		  4267,  -6920,   1871,   1872,   1828,   1829,   1830,  -7946,
+		 -7946,  -8912,  -5610,    -47,  -7946,    -47,  -2390,  -6137,
+		 -6137,  -6137,  -6137,  -6137,  -6137,  -5365,  -1610,   5377,
+		  4603,  -4187,   5629,   5630,  -4144,  -4144,   5633,   5634,
+		  6601,   3300,  -2262,   5638,   5639,   3925,   3926,   3927,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -2367,  -2367,    935,    976,    936,    936,
+		   936,   9680,   9681,  32767,  32767,   3099,  32767,   3098,
+		  3098,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    911,    911,    911,    911,    911,    911,
+		 32767,  32767,    909,    909,    909,    909,    909,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,    993,    994,  -1216,    996,    997,
+		   998,   7401,   -800,  11149,   5060,  -2056,   5062,   1005,
+		  5063,  -4365,   5064,   5065,   5066,   1011,    559,   1013,
+		  1014,   1015,    908,    561,   1018,  -2743,   1534,   1021,
+		  1022,   1023,   1024,    566,   1026,   6103,   1028,   1029,
+		  1030,   1031,   1032,   1033,   1034,   1035,  -2737,  -2737,
+		 -2737,   1039,   1040,   1041,   1042,   1043,   1044,   1045,
+		  1046,   1047,   1048,   1049,   1050,   1051,  -6236,   1053,
+		  1054,   1055,   1056,   1057,   1058,   1059,     72,   1061,
+		  1062,   1063,   1064,   1065,   1066,   1067,   1068,   1069,
+		  1070,   1071,  32767,   1072,   1073,  -2802,  -2801,  -2800,
+		 -2799,   1078,  -2796,  -2795,  -2794,   1544,   -664,  -2791,
+		 -2790,  -2789,   5249,  -3494,  -2579,   5296,   6212,   6168,
+		  -767,   -766,   -765,  -4307,  -4307,   4492,   -761,   4448,
+		  4449,  -2536,    940,  32767,      0,  32767,  32767,   4451,
+		 -1318,  -1318,  -1318,  32767,  32767,   -672,    506,    506,
+		     0,   -928,  32767,  32767,  32767,  32767,  32767,    949,
+		   252,     96,   3294,   6187,   6188,    256,  32767,  -6362,
+		 32767,    258,    259,    260,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,  32767,      0,
+		 32767,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,  32767,    261,  -5575,    263,
+		 -5574,    265,  -4744,    267,  32767,  -3183,  32767,  32767,
+		 32767,  32767,  -3187,  32767,  32767,  32767,  32767,      0,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    268, -11680,  -5590,
+		  1527,  -5590,   1527,  -4754,   4675,  -4753,  -5592,  -5592,
+		 -4755,  -4755,   4681,      0,      0,      0,   4682,   4683,
+		  4684,   4685,   4686,   4687,      0,      0,  32767,  32767,
+		     0,      0,  -4560,      0,   4688,   4689,   4690,   4691,
+		  4692,   4693,   4694,   4695,   -706,   -706,   4696,  -4775,
+		 -4775,   4699,   4700,   4701,  -4777,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    275,      0,  32767,    277,
+		 32767,  32767,      0,    278,  32767,  32767,  32767,      0,
+		   279,    280,    281,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,   4703,   4704,   4705,   4706,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   4655,   4656,   4657,   4658,
+		  4659,   4712,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    283,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    284,    285,  32767,    286,
+		 32767,  32767,  32767,    287,  32767,  32767,  32767,  32767,
+		   288,    289,    290,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   2998,   2998,   2998,
+		  2998,   2998,   2998,   2998,  32767,  32767,  32767,  32767,
+		 32767,  32767,    291,    292,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   1120,
+		  1121,   1122,   1123,   1124,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   4713,   4714,   4715,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    293,    294,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    295,    296,    297,    298,
+		 32767,  32767,    299,    300,  32767,  32767,    301,    302,
+		   303,    304,    305,    306,  32767,  32767,    307,    308,
+		   309,    310,    311,    312,  32767,  32767,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,    736,   -753,    738,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,    764,    765,    766,    767,
+		   768,    769,    770,    771,    772,    773,    774,    775,
+		   776,    777,    778,    779,    780,    781,    782,    783,
+		  9637,    785,    887,    787,   4022,    789,   9648,    791,
+		  4028,    793,    794,   9658,    796,    797,    798,    799,
+		   800,    801,    802,    803,    804,    805,    806,    807,
+		     0,      0,   4407,   4452,    816,    -73,    818,    819,
+		  8149,  -4948,  -4948,  -4948,  -4948,   2009,      0,      0,
+		     0,      0,      0,      0,    838,    839,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,  32767,  32767,  32767,  32767,  32767,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  -2274,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -2283,  -2283,
+		 -2283,  -2283,  -2283,  -2283,  -2283,  -2283,  -2283,  -2283,
+		 -2283,  -2283,  -3665,  -2283,  -2283,  -2283,  -2283,  -2283,
+		 -2283,  -2283,  -2283,  -2283,  -2283,  -2283,  -2283,  -2283,
+		 -2283,  -2283,  -2283,  -2283,  -2283,  -2283,  -2283,  -2283,
+		 -2283,  -2283,  -2283,  -2283,  -2283,  -2283,  -2283,  -2283,
+		 -2283,  -2283,  -2283,  32767,  -2284,  32767,  -2285,  -2285,
+		 32767,  -2286,  -2286,  32767,  -2287,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   1177,   1178,
+		  1179,   1180,   1181,   1182,   1183,   1184,   1185,   1186,
+		  1187,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   327,    328,    329,    330,    331,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   -265,   -265,   -265,   1833,   1192,   1193,   1194,
+		 -3856,  -3812,  -3812,  -3812,  -3812,  -3812,  -3856,  -3856,
+		 -3856,   1204,   1205,   1206,   1207,   1208,  32767,  32767,
+		 32767,  32767,  -3865,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   4716,   4717,   4718,   4719,
+		  4720,   4721,   4722,   4723,   4724,   4725,   4726,   4727,
+		  4728,   4729,   4730,   4731,   4732,   4733,   4734,   4735,
+		  3252,   4737,   4738,   4739,   4740,   4741,   4742,   4376,
+		  4744,   4377,   3133,   3134,   4379,   4379,   3137,   4380,
+		  3267,   4753,   4754,   4755,   4756,   4757,   4758,   4759,
+		  4760,   4761,   4762,   4763,   4764,   4765,   4766,   4767,
+		  4768,   4769,   4770,   4771,   4772,   4773,   4774,   4775,
+		  4776,   4777,   4778,   4779,   4780,   4781,   6561,   6562,
+		  6563,  12193,   6565,   6566,   4788,   4789,   4790,   3305,
+		  4772,   3305,   4794,   3305,   4796,   4797,   4798,   3305,
+		  4800,  32767,      0,   4802,   4803,   4804,   4805,   4806,
+		  4807,   4808,   4809,   4810,   4811,   4812,   4813,   4814,
+		  4815,   4816,   4817,   4818,   4819,   4820,   4821,   4822,
+		  4823,   4824,   4825,   4826,   4827,   4828,  13682,   4830,
+		  4932,   4832,   8067,   4834,  13693,   4836,   8073,   4838,
+		  4839,  13703,   4841,   4842,   4843,   4844,   4845,   4846,
+		  4847,   4848,   4849,   4850,   4851,   4852,   1186,   4854,
+		  4855,   4856,   4857,   3968,   4859,   4860,  12190,   -907,
+		  -907,   -907,   -907,   -907,   -907,   4868,   4869,   4870,
+		  4871,  32767,   4872,   4873,  32767,  32767,   4874,  32767,
+		  1233,   4875,   4876,  32767,  32767,   4877,   4878,   4879,
+		  8126,  32767,   4881,   4882,   4883,   6698,   6699,   7945,
+		  6701,   4888,   9388,   7949,   4891,   4892,  32767,   4893,
+		 32767,   4894,   4895,   4896,   4897,   4898,   4899,   3517,
+		  3518,   3519,   3520,   3521,   4904,   3523,   3524,   3525,
+		  3526,   3527,   3528,   3529,   3530,   3531,   3532,   3533,
+		  3534,   3535,   3536,   3537,   3538,   3539,   3540,   3541,
+		  3542,   3543,   4926,   8206,   4928,   8209,   4930,   4931,
+		  4932,   4933,   4934,   4935,   8222,   4937,   4938,   8225,
+		  8226,   4941,   4942,   4943,      0,   4945,   8230,      0,
+		     0,   4949,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,   -127,   -127,   -127,
+		  7202,   -127,   -127,      0,   -128,   -128,   -128,   -128,
+		     0,  32767,   -130,   4971,   -129,   5613,   5614,   5615,
+		  4976,   5618,  32767,   5619,   5620,   5621,   4981,   5624,
+		  4983,   4984,  32767,   5630,   5631,  -1986,  -1986,   -126,
+		  -126,   5078,   4992,   5037,   5038,   5039,   5040,   5041,
+		  5086,   5087,   5088,   5089,  -2239,   5091,   5092,   5093,
+		  5094,   5095,   5096,   5097,   5098,   5099,   5100,      0,
+		  5101,   -640,   -640,   -640,      0,   -641,   -641,   -641,
+		  -641,   -641,      0,   -642,      0,      0,  32767,   -645,
+		  -645,   6973,   6974,   5115,   5116,    -87,      0,    -44,
+		   -44,    -44,    -44,    -44,    -88,    -88,    -88,    -88,
+		  7241,    -88,    -88,    -88,    -88,    -88,    -88,    -88,
+		   -88,    -88,    -88,    -88,    -88,   5654,   5655,   5656,
+		  5657,   5658,   5659,   5660,   5661,   5662,   5663,   5664,
+		  5665,   5666,   5667,   5668,   5669,  -1948,  -1948,    -88,
+		   -88,   5116,   5117,   5074,   5075,   5076,   5077,   5078,
+		  5123,   5124,   5125,   5126,  -2202,   5128,   5129,   5130,
+		  5131,   5132,   5133,   5134,   5135,   5136,   5137,   5138,
+		  5139,   -602,   -602,   -602,   -602,   -602,   -602,   -602,
+		  -602,   -602,   -602,   -602,   -602,   -602,   -602,   -602,
+		  -602,   7016,   7017,   5158,   5159,    -44,    -44,      0,
+		     0,      0,      0,      0,    -44,    -44,    -44,    -44,
+		  7285,    -44,    -44,    -44,    -44,    -44,    -44,    -44,
+		   -44,    -44,    -44,    -44,    -44,   5698,   5699,   5700,
+		  5701,   5702,   5703,   5704,   5705,   5706,   5707,   5708,
+		  5709,   5710,   5711,   5712,   5713,  -1904,  -1904,    -44,
+		   -44,   5160,   5161,   5118,   5119,   5120,   5121,   5122,
+		  5167,   5168,   5169,   5170,  -2158,   5172,   5173,   5174,
+		  5175,   5176,   5177,   5178,   5179,   5180,   5181,   5182,
+		  5183,   -558,   -558,   -558,   -558,   -558,   -558,   -558,
+		  -558,   -558,   -558,   -558,   -558,   -558,   -558,   -558,
+		  -558,   7060,   7061,   5202,   5203,      0,      0,     44,
+		    44,     44,     44,     44,      0,      0,      0,      0,
+		  7329,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   5742,   5743,   5744,
+		  5745,   5746,   5747,   5748,   5749,   5750,   5751,   5752,
+		  5753,   5754,   5755,   5756,   5757,  -1860,  -1860,      0,
+		     0,      0,      0,      0,   6264,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,  -3389,
+		 -3389,   5355,   5356,  -3434,  -3434,  -3389,  -3389,  -3389,
+		 -3389,   5363,   5364,  -3434,  -3434,  -3389,  -3389,  -3389,
+		 -3345,  -3345,  -3391,  -3391,  -3391,  -3391,  -3391,  -3391,
+		 -3391,   5331,   5332,   5333,   5334,   2027,   1983,   5337,
+		  5338,   5339,   5340,  18549,  15248,  15249,  11948,  11949,
+		  8648,   8649,   5348,   5349,   5350,   5351,   5352,  -3391,
+		 -3391,   5400,   5401,   5357,   5358,   5359,   5360,  -3391,
+		 -3391,   5408,   5409,   5365,   5366,   5367,   5324,   5325,
+		  5372,   5373,   5374,   5375,   5376,   5377,   5378,  -3343,
+		 -3343,  -3343,  -3343,    -35,     10,  -3343,  -3343,  -3343,
+		 -3343, -16551, -13249, -13249,  -9947,  -9947,  -6645,  -6645,
+		 -3343,  -3343,  -3343,  -3343,  -3343,   5401,   5402,  -3388,
+		 -3388,  -3343,  -3343,  -3343,  -3343,   5409,   5410,  -3388,
+		 -3388,  -3343,  -3343,  -3343,  -3299,  -3299,  -3345,  -3345,
+		 -3345,  -3345,  -3345,  -3345,  -3345,   5377,   5378,   5379,
+		  5380,   2073,   2029,   5383,   5384,   5385,   5386,  18595,
+		 15294,  15295,  11994,  11995,   8694,   8695,   5394,   5395,
+		  5396,   5397,   5398,  -3345,  -3345,   5446,   5447,   5403,
+		  5404,   5405,   5406,  -3345,  -3345,   5454,   5455,   5411,
+		  5412,   5413,   5414,   5415,   5416,   5417,   5418,   5419,
+		  5420,   5421,   5422,  -3299,  -3299,  -3299,  -3299,      9,
+		    54,  -3299,  -3299,  -3299,  -3299, -16507, -13205, -13205,
+		 -9903,  -9903,  -6601,  -6601,  -3299,  -3299,  -3299,  -3299,
+		 -3299,   5445,   5446,  -3344,  -3344,  -3299,  -3299,  -3299,
+		 -3299,   5453,   5454,  -3344,  -3344,  -3299,  -3299,  -3299,
+		 -3299,  -3299,  -3299,  -3299,  -3299,  -3299,  -3299,  -3299,
+		 -3299,   5423,   5424,   5425,   5426,   2119,   2075,   5429,
+		  5430,   5431,   5432,  18641,  15340,  15341,  12040,  12041,
+		  8740,   8741,   5440,   5441,   5442,   5443,   5444,  -3299,
+		 -3299,   5492,   5493,   5449,   5450,   5451,   5452,  -3299,
+		 -3299,   5500,   5501,   5457,   2790,   2790,   2790,   2790,
+		  -376,   2790,   2790,   5510,   2790,   5512,  12630,   5514,
+		 12632,   5516,   2218,   2219,   2220,  -8382,  -2292,   4825,
+		  2222,   5524,   2223,     12,   5527,   2224,   2225,   2226,
+		  2227,   2228,   2229,   2230,   2857,   2232,   2233,   5538,
+		  2234,   5540,   2235,   5542,   5543,   2236,  -3299,  -3299,
+		 -3299,   5548,   5549,  -3299,  -3299,   2790,   2790,   2790,
+		  5555,   5556,   5557,   2790,   2790,   2790,   2790,   2790,
+		  2790,   2790,   2790,   2790,   2790,   2790,   2790,   2790,
+		  9083,   9084,   2790,   2790,   2790,   2790,   2790,   2790,
+		  2790,   2790,   2790,   2790,   2790,   2790,   3549,   7580,
+		  7581,   2790,   2790,   2790,   2790,   2790,   2790,   2790,
+		  2790,   5694,   5694,   2790,   2790,   5695,   5695,   1358,
+		  5603,   5694,   5694,   5694,  -2343,   6401,   6402,  -2388,
+		 -2388,  -2343,   4593,   4593,   3674,   7217,   7218,  -1580,
+		 -1580,  -1535,  -1535,   5451,   2888,  -1489,  -1535,  -1535,
+		 -1535,  -1535,  -1535,   5451,   5451,   3587,   7191,   7192,
+		  7193,   3886,   3842,   3843,   3844,  -5932,   7203,  20412,
+		  5454,   5454,   5454,   9202,   9203,   9204,   9205,   9206,
+		  9207,   8436,   4682,  -2304,  -1529,   7262,  -2553,  -2553,
+		  7222,   7223,  -2553,  32767,  32767,   -219,   5344,  -2555,
+		 -2555,   -840,   -840,   -840,   -840,   1882,   2788,   2788,
+		 -7823,  -7778,   5675,   5676,   5677,   5678,   5679,  -6828,
+		  -848,  -6056,  -6056,    930,  -2545,  -6009,  -6967,   3098,
+		 -2545,  -6054,  -2545,    933,   2940,   3104,   5695,   5696,
+		   549,   5698,   5699,   5700,   5701,   5702,   5703,   5704,
+		  5705,   5706,   5707,   5708,   5709,   5710,   5711,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -1250,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   7502,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -1419,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,   4580,   4581,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    912,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -129,  32767,  32767,   -131,   -131,
+		   896,      0,  32767,  32767,  32767,  -2616,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,      0,  32767,    882,
+		   882,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   -197,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  5757,   5758,   5759,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -4071,  -4071, -12944,  -4071,  32767,
+		 -4072,  -4072,  -9647,  32767,      0,      0,   5401,      0,
+		     0,  -4068,  -4068,  -4068,      0,  -2329,  -4067,    346,
+		 -4068,  -5246,  32767,  32767,  -4575,  -5503,  -4069,  -4069,
+		 -4069,  32767,  32767,  -4071,  -4071,   -950,  32767,   -950,
+		 32767,  -4073,      0,  -4074,  32767,      0,      0,      0,
+		     0,  32767,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -4337,  -2128,      0,      0,      0,
+		 -8037,    707,   -207,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1760,  32767,  -2024,  32767,  32767,   1761,
+		  1762,   1763,   1764,   1765,   1766,  10620,   1768,   1870,
+		  1770,   1374,  32767,  32767,  32767,  -2908,  -2952,  32767,
+		 32767,   1375,  -3204,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    579,  32767,  32767,  32767,  32767,  32767,  -3995,
+		 -3995,  -3995,   2962,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,  -2645,    831,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   4613,   4614,
+		 32767,  32767,      0,    276,  32767,      0,  32767,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -4423,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1377,  32767,  32767,   2963,   2964,  32767,  32767,  32767,
+		 32767,  32767,  32767,    349,    350,  32767,   -531,   -530,
+		 32767,   1378,  32767,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,  32767,      0,  32767,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   -187,   -187,   -187,
+		  -187,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -5344,  -5344,  32767,  32767,   2965,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -5827,
+		 -5827,  -5827,  -4802,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,      0,  32767,  32767,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,    313,    314,    315,    316,
+		   317,    318,    319,    320,    321,    322,    323,    324,
+		 32767,  32767,   -411,   1079,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   -877,
+		 32767,   6064,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2966,   2967,  32767,   1382,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   2968,  32767,  32767,  32767,  -9358,
+		 32767,  -9314,  -9314,  -9314,  32767,  32767,  32767,  32767,
+		 32767,  32767,   -768,   7132,   7133,  32767,  32767,  32767,
+		 32767,   2697,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  -1181,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -4100,      0,   9000,
+		  9001,      0,      0,      0,      0,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  -1245,      0,
+		     0,  -1244,  -1243,      0,  -1242,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,   3268,
+		     0,   4651,  32767,  32767,      0,   4651,      0,   4652,
+		     0,   4653,      0,   4654,      0,   4655,      0,   4656,
+		  1389,   4656,      0,   4657,      0,   4658,      0,      0,
+		  4660,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,  32767,  32767,  32767,  32767,      0,      0,   8233,
+		 32767,      0,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  4220,   4221,      0,      0,      0,      0,      0,   3305,
+		     0,      0,   3307,   3307,   3307,   3307,      0,      0,
+		     0,   3310,   1901,      0,      0,      0,      0,      0,
+		     0,  -1319,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   7618,   7619,   7620,
+		     3,      3,   1863,   1863,   7067,   7068,   7025,   7026,
+		  7027,   7028,   7029,   7074,   7075,   7076,   7077,   -251,
+		  7079,   7080,   7081,   7082,   7083,   7084,   7085,   7086,
+		  7087,   7088,   7089,   7090,   1349,   1349,   1349,   1349,
+		  1349,   1349,   1349,   1349,   1349,   1349,   1349,   1349,
+		  1349,   1349,   1349,   1349,   8967,   8968,   7109,   7110,
+		  1907,   1907,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   2989,   2990,   2991,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,   1401,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   1402,
+		  2331,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   1449,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1404,  32767,   1405,  32767,
+		  1406,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1407,  32767,  32767,  32767,  32767,  32767,
+		 32767,   4588,   4589,   4590,   4591,   4592,   4593,   4594,
+		  4595,   4596,   4597,   4598,  32767,  32767,   1410,  32767,
+		 32767,  32767,  32767,   1411,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  7002,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  6168,  -3267,   1415,   1416,   1417,  -3264,  -3264,  -3264,
+		 -3264,  -3264,  -3264,   1424,   1425,  -4183,  32767,   1426,
+		  1427,   5988,   1429,  -3258,  32767,  -3259,  -3259,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   1390,  32767,
+		 32767,  32767,  -3268,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1434,  32767,  32767,  32767,
+		 32767,   1435,  32767,  32767,  32767,  32767,   1436,  32767,
+		 32767,  32767,  32767,   1437,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1438,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -3218,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   7380,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,    360,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   1440,
+		 32767,   1441,  -4485,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  10733,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4484,
+		 32767,   4531,   4532,   4533,  32767,  32767,  -2452,   -587,
+		 32767,  32767,  32767,  32767,  32767,   -842,   -842,   3659,
+		 -4200,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,    928,  32767,
+		   929,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    930,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4601,   4602,  32767,
+		 32767,  32767,  32767,  32767,  32767,   2071,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1444,  32767,  32767,  32767,
+		     0,  32767,      0,  32767,  32767,  -2192,   1107,   1107,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   3005,   3006,   3007,   3008,
+		 32767,  32767,  32767,    931,   -340,  32767,  32767,  32767,
+		 -1180,   5937,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  4608,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   3010,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4609,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   2880,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767, -11659,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -5062,  32767,  32767,  -5109,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -4115,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4639,
+		 32767,  32767,  32767,   4640,   4641,   4642,  17851,  32767,
+		 32767,  32767,  11248,   7947,   7948,   4647,   4648,   4649,
+		  4650,   4651,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   4611,   8686,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1270,   4897,   4898,   4899,  11619,   4901,   4902,  32767,
+		  4903,   4904,   4905,   4906,   4907,   9707,   -879,   1269,
+		  1269,   1269,   1269,   1269,   1269,   1269,   1269,   1269,
+		  1269,  32767,  32767,   4920,   4921,   3637,  -2451,  -1436,
+		  4925,   4926,  32767,   7319,   7320,  32767,   7321,   7322,
+		  7323,   7324,   5319,  32767,  32767,  32767,  -1435,  -1434,
+		 32767,  -7726,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,    384,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  20109,  16808,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   3219,   3220,   6903,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		 -5258,  -5258,  -5258,  -5258,  -5258,  -5258,  -5258,      0,
+		     0,      0,      0,      0,      0,  -1825,  -1825,  -1825,
+		-15033, -11731, -11731,  -8429,      0,      0,      0,  -1828,
+		 -1828,  -1828,  -1828,  -1828,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -2079,  -3817,    596,  -4844,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,   8757,   8758,
+		  8759,   8760,   8761,   8762,   8763,   8764,   8765,   8766,
+		    45,     45,     45,     45,   3353,   3398,     45,     45,
+		    45,     45, -13163,  -9861,  -9861,  -6559,  -6559,  -3257,
+		 -3257,     45,     45,     45,     45,     45,   8789,   8790,
+		     0,      0,     45,     45,     45,     45,   8797,   8798,
+		     0,      0,     45,   2713,   2714,   2715,   2716,   5883,
+		  2718,   2719,      0,   2721,      0,  -7117,      0,  -7117,
+		     0,   3299,   3299,   3299,  13902,   7813,    697,   3301,
+		     0,   3302,   5514,      0,   3304,   3304,   3304,   3304,
+		  3304,   3304,   3304,   2678,   3304,   3304,      0,   3305,
+		     0,   3306,      0,      0,   3308,   8844,   8845,   8846,
+		     0,      0,   8849,   8850,   2762,   2763,   2764,      0,
+		     0,      0,   2768,   2769,   2770,   2771,   2772,   2773,
+		  2774,   2775,   2776,   2777,   2778,   2779,   2780,  -3512,
+		 -3512,   2783,   2784,   2785,   2786,   2787,   2788,   2789,
+		  2790,   2791,   2792,   2793,   2794,   2036,  -1994,  -1994,
+		  2798,   2799,   2800,   2801,   2802,   2803,   2804,   2805,
+		   -98,    -97,   2808,   2809,    -95,    -94,   4244,      0,
+		   -90,    -89,    -88,   7950,   -793,   -793,   7998,   7999,
+		  7955,   1020,   1021,   1941,  -1601,  -1601,   7198,   7199,
+		  7155,   7156,    171,   2735,   7113,   7160,   7161,   7162,
+		  7163,   7164,    179,    180,   2045,  -1558,  -1558,  -1558,
+		  1750,   1795,   1795,   1795,  11572,  -1562, -14770,    189,
+		   190,    191,  -3556,  -3556,  -3556,  -3556,  -3556,  -3556,
+		 -2784,    971,   7958,   7184,  -1606,   8210,   8211,  -1563,
+		 -1563,   8214,   8215,   9182,   5881,    319,   8219,   8220,
+		  6506,   6507,   6508,   6509,   3788,   2883,   2884,  13496,
+		 13452,      0,      0,      0,      0,      0,  12508,   6529,
+		 11738,  11739,   4754,   8230,  11695,  12654,   2590,   8234,
+		 11744,   8236,   4759,   2753,   2590,      0,      0,   5148,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,      0,      0,  10878,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,   1408,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,   5760,      0,      0,      0,      0,      0,  32767,
+		     0,  32767,      0,      0,  32767,      0,      0,  32767,
+		     0,   3520,   3521,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  1657,   1658,   1659,   1660,  -5668,   1662,   1663,   1664,
+		  1665,   1666,   1667,   1668,   1669,   1670,   1671,   1672,
+		  1673,  -4068,  -4068,  -4068,  -4068,  -4068,  -4068,  -4068,
+		 -4068,  -4068,  -4068,  -4068,  -4068,  -4068,  -4068,  -4068,
+		 -4068,   3550,   3551,   1692,   3595,   3596,   3597,  -3469,
+		 -3469,  -3469,  -3469,  -3469,  -3513,  -3513,  -3513,  -3513,
+		  3816,  -3513,  -3513,  -3513,  -3513,   3612,   3613,   3614,
+		  3615,   3616,   3617,   3618,   3619,   3620,   3621,   3622,
+		  3623,   3624,   3625,   3626,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		 -6719,      0,      0,  -6678,      0,      0,      0,      0,
+		     0,  -4799,   5788,   3641,   3642,   3643,   3644,   3645,
+		  3646,   3647,   3648,   3649,   3650,   3651,   3652,      0,
+		     0,   1285,   7374,   6360,      0,      0,   3660,  -2392,
+		 -2392,   3663,  -2392,  -2392,  -2392,  -2392,   -386,  -2392,
+		 -2555,   3671,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,   6685,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  4638,   4639,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   4600,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1383,  32767,  32767,
+		 32767,  32767,   1384,  -1883,   1386,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   4640,  32767,
+		 32767,  32767,   1387,  -3268,      0,  -3266,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1391,  32767,  32767,
+		 32767,  32767,   1392,   1393,   1394,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -5630,  -5630,  -5630,  -5630,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -5690,  -5690,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   1515,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  -9707,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,      0,  32767,  32767,   4641,   4642,  32767,
+		 32767,  32767,  32767,  32767,   4630,  32767,  32767,  32767,
+		 -4214,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1852,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   1452,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -8247,  -4945,  32767,
+		 -7282,  32767,  32767,  32767,  -1875,  -1875,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1453,   1454,   1455,   -642,      0,      0,
+		     0,   5051,   5008,   5009,   5010,   5011,   5012,   5057,
+		  5058,   5059,      0,      0,      0,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -3509,
+		 32767,  32767,  32767,  32767,  -3513,  -3513,  -3513,  -3513,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4466,
+		 32767,  -4467,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -4482,  32767,  32767,  -3605,  -3605,  -3605,
+		 -3605,  -3605,  -3605,  -3605,  32767,  32767,  -3607, -12460,
+		 -3607,  -3708,  -3607,  -6841,  32767,  32767,  -3609,  -6845,
+		 32767,  -3610, -12473,  -3610,  -3610,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4646,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   1456,   1457,      0,  32767,      0,  32767,      0,
+		 32767,      0,  32767,      0,  32767,  32767,  32767,      0,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1857,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  -2932,      0,  32767,
+		     0,  32767,      0,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   1416,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,      0,      0,      0,   1459,
+		  1460,   1461,   1462,   1463,   1464,   1465,   1466,      0,
+		     0,   1467,      0,   1489,      0,   1491,   1492,   1493,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   5489,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,   3616,   1469,   1470,   1471,   1472,   1473,
+		  1474,   1475,   1476,   1477,   1478,   1479,   1480,  -2172,
+		  1496,   -888,   5201,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,    115,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    116,
+		   117,    361,  32767,    362,  32767,    363,  32767,    364,
+		 32767,    365,  32767,  32767,  32767,    366,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,   1484,
+		     0,      0,      0,      0,      0,      0,    367,      0,
+		   368,   1613,   1613,    369,    370,   1613,    371,   1485,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  -1779,  -1779,  -1779,
+		 -7408,  -1779,  -1779,      0,      0,      0,   1486,     20,
+		  1488,      0,   1490,      0,      0,      0,   1494,      0,
+		 32767,   4801,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  -8853,      0,   -101,
+		     0,  -3234,      0,  -8858,      0,  -3236,      0,      0,
+		 -8863,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   3667,      0,      0,
+		     0,      0,    890,      0,      0,  -7329,   5769,   5770,
+		  5771,   5772,   5773,   5774,      0,      0,      0,      0,
+		 32767,      0,      0,  32767,  32767,      0,  32767,  32767,
+		     0,      0,  32767,  32767,      0,      0,      0,  -3246,
+		 32767,      0,      0,      0,  -1814,  -1814,  -3059,  -1814,
+		     0,  -4499,  -3059,      0,      0,  32767,      0,  32767,
+		     0,      0,      0,      0,      0,      0,   1383,      0,
+		  1382,   1382,   1382,      0,   1382,   1382,   1382,   1382,
+		  1382,   1382,   1382,   1382,   1382,   1382,   1382,   1382,
+		  1382,   1382,   1382,   1382,   1382,   1382,   1382,   1382,
+		  1382,      0,  -3279,      0,  -3280,      0,      0,      0,
+		     0,      0,      0,  -3286,      0,      0,  -3286,  -3286,
+		     0,      0,      0,   4944,      0,  -3284,   4947,   4948,
+		     0,   4950,   4951,   4952,   4953,   4954,   4955,   4956,
+		  4957,   4958,   4959,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		 32767,  32767,      0,      0,      0,      0,  32767,  32767,
+		 32767,      0,      0,   1500,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4650,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   6703,
+		  6704,   6705,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  13097,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  -3442,   1502,  -3442,  32767,
+		  1504,   1505,  -3443,   1507,   1508,   1509,   1510,   1511,
+		  1512,   1513,   1514,   1515,   1516,  32767,   1644,   1645,
+		  1646,  -5682,   1648,   1649,   1523,  32767,  32767,  32767,
+		 32767,   1524,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -4090,  32767,  32767,  32767,  -4093,  -4093,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   1528,   1529,   1530,  32767,   1531,   1532,   1533,
+		  1534,   1535,   1536,   1537,   1538,   1539,   1540,   1541,
+		 32767,   1542,   1543,   1544,   1545,   1546,   1547,   1548,
+		  1549,   1550,   1551,   1552,   1553,   1554,   1555,   1556,
+		  1557,   1558,   1559,  32767,   1560,   1561,   1562,   1563,
+		  1564,   1565,   1566,   1567,   1568,   1569,   1570,   1571,
+		  1572,   1573,   1574,   1575,   1576,   1577,   1578,   1579,
+		  1580,   1581,   1582,   1583,   1584,   1585,   1586,   -365,
+		  -365,  32767,  32767,  32767,  32767,   -413,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1588,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  -410,   1590,  -2995,  -2995,   1593,   1594,   1595,   1596,
+		  1597,   1598,   1599,   1600,   1601,   1602,   1603,   1604,
+		  1605,   1606,   1607,   1608,   1609,   1610,   1611,   1612,
+		  1613,   1614,   1615,   1616,   1617,   1618,   1619,   1620,
+		  1621,   1622,   1623,   1624,   1625,   1626,   1627,   1628,
+		  1629,   1630,   1631,   1632,   1633,   1634,   1635,   1636,
+		  1637,   1638,   1639,   1640,   1641,   1642,   1643,   1644,
+		  1645,   1646,   1647,   1648,   1649,   1650,   1651,   1652,
+		  1653,   1654,   1655,   1656,   1657,   1658,   1659,   1660,
+		  1661,   1662,   1663,   1664,   1665,   1666,   1667,   1668,
+		  1669,   1670,   1671,   1672,   1673,   1674,   1675,   1676,
+		  1677,   1678,   1679,   1680,   1681,   1682,   1683,  32767,
+		  1684,   1685,   1686,   1687,   1688,  32767,    372,    373,
+		   374,    375,    376,    377,    378,    379,    380,    381,
+		   382,    383,      0,    385,    386,    387,    388,    389,
+		   390,    391,    392,    393,    394,    395,    396,    397,
+		   398,    399,    400,    401,    402,    403,    404,    405,
+		   406,    407,    408,    409,    410,    411,    412,    413,
+		   414,    415,    416,    417,    418,    419,    420,    421,
+		   422,    423,    424,    425,    426,    427,    428,    429,
+		   430,    431,    432,    433,    434,    435,    436,    437,
+		   438,    439,    440,    441,    442,    443,    444,    445,
+		   446,    447,    448,    449,    450,    451,    452,    453,
+		   454,    455,    456,    457,    458,    459,    460,    461,
+		-19647, -16345,    464,    465,    466,    467,    468,    469,
+		   470,    471,    472,    473,    474,    475,    476,    477,
+		 -2741,  -2741,  -6423,    481,    482,    483,    484,    485,
+		   486,    487,    488,    489,    490,    491,   5750,   5751,
+		  5752,   5753,   5754,   5755,   5756,    499,    500,    501,
+		   502,    503,    504,   2330,   2331,   2332,  15541,  12240,
+		 12241,   8940,    512,    513,    514,   2343,   2344,   2345,
+		  2346,   2347,    520,    521,    522,    523,    524,    525,
+		  1689,    526,  32767,  32767,  32767,  32767,    527,    528,
+		   529,    530,    531,    532,    533,    534,    535,    536,
+		   537,    538,    539,    540,    541,    542,    543,    544,
+		   545,    546,    547,    548,    549,    550,    551,    552,
+		   553,    554,    555,    556,    557,    558,    559,    560,
+		   561,    562,    563,    564,    565,    566,    567,    568,
+		   569,    570,    571,    572,    573,    574,    575,    576,
+		   577,    578,    579,    580,    581,    582,    583,    584,
+		   585,    586,    587,    588,    589,    590,    591,    592,
+		   593,   2673,   4412,      0,   5441,    598,    599,    600,
+		   601,    602,    603,    604,    605,    606,    607,    608,
+		   609,    610,    611,    612,    613,    614,    615,    616,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   6706,
+		  6707,   6708,   6709,   3402,   3358,   6712,   6713,   6714,
+		  6715,  19924,  16623,  16624,  13323,  13324,  10023,  10024,
+		  6723,   6724,   6725,   6726,   6727,  32767,  32767,   6773,
+		  6774,   6730,   6731,   6732,   6733,  32767,  32767,   6779,
+		  6780,   6736,   4069,   4069,   4069,   4069,    903,   4069,
+		  4069,   6789,   4069,   6791,  13909,   6793,  13911,   6795,
+		  3497,   3498,   3499,  -7103,  -1013,   6104,   3501,   6803,
+		  3502,   1291,    672,  -8578,  -5276,  -5276,  -1974,  -1974,
+		 -1974,  -1974,  -1974,   6770,   6771,      0,      0,  -1976,
+		 -1976,  -1976,  -1976,   6776,   6777,  32767,   1725,  -1978,
+		   690,    691,    692,    693,   3860,    695,    696,  32767,
+		   697,  32767,  -9142,  32767,  -9143,      0,   1272,   1272,
+		  1272,  11875,   5786,  -1330,   1274,  -2027,   1275,   3487,
+		 -2027,   1277,   1277,   1277,   1277,   1277,   1277,   1277,
+		  1623,   1276,   2248,  -2029,   2248,  -2030,   2248,  -2031,
+		 -1059,   1276,   7784,   6812,   7785,  32767,  32767,   6813,
+		  6814,    726,    727,    728,  -2036,  -2036,  -2036,    732,
+		   733,    734,    735,    736,    737,    738,    739,    740,
+		   741,    742,    743,    744,  -5548,  -5548,    747,    748,
+		   749,    750,    751,    752,    753,    754,    755,    756,
+		   757,    758,      0,  -4030,  -4030,    762,    763,    764,
+		   765,    766,    767,    768,    769,  -2134,  -2133,    772,
+		   773,  -2131,  -2130,   2208,      0,  -2127,  -2126,  -2125,
+		  5913,  -2830,  -1915,   5960,   6876,   6832,   -103,   -102,
+		  -101,  -3643,  -3643,   5156,    -97,   5112,   5113,  -1872,
+		  1604,   5069,   6028,   5116,   5117,   5118,   5119,  -1866,
+		 -1865,      0,  -2697,      0,   -298,   -298,   -253,   -253,
+		  -253,   9524,  -2708,  32767,  -1861,  -1860,  -1859,  -5606,
+		 -5606,  -5606,  -4709,  -5607,  -5607,  -4835,  -1080,   5907,
+		  5133,  -3657,   7050,   6159,  -3615,  -2725,   7052,      0,
+		 32767,   3825,  -1737,   6163,  32767,   4449,   4450,   4451,
+		  5338,   1730,   1711,    825,  12323,  12279,  32767,  32767,
+		  6990,   3689,   3690,   3691,   3692,   3693,  -5050,  -5050,
+		  1722,   1723,   3700,  32767,  32767,   1586,      0,  -7565,
+		     0,      0,   1431,   1595,    260, -10927,      0,  -2134,
+		 -2178,  -2177,  32767,  32767,      0,      0,   2211,      0,
+		     0,      0,  -6402,   1800, -10148,  -4058,   3059,  -4058,
+		     0,  -4057,   5372,  -4056,  -4056,  -4056,      0,    453,
+		     0,      0,      0,    108,    456,      0,   3762,   -514,
+		     0,      0,      0,      0,    459,      0,  -5076,      0,
+		     0,      0,      0,      0,      0,      0,      0,   3773,
+		  3774,   3775,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,   7288,
+		     0,      0,      0,      0,      0,      0,      0,    988,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,      0,      0,   3876,   3876,
+		  3876,   3876,      0,   3875,   3875,   3875,   -462,   1747,
+		  3875,   3875,   3875,  -4162,   4582,   3668,  -4206,  -5121,
+		 -5076,   1860,   1860,   1860,   5403,   5404,  -3394,   1860,
+		 -3348,  -3348,   3638,    163,  -3301,  -4259,  -3346,    162,
+		 -3347,  -3347,   3639,   3639,   1775,   4473,   1777,   2076,
+		  2077,   2033,   2034,   2035,  -7741,  -7741,  -8707,  -5405,
+		   158,      0,    157,  -2186,  -5933,  -5933,      0,  -5934,
+		  6619,  -5935,      0,      0,      0,  32767,  32767,  32767,
+		  5826,  32767,  32767,  32767,  32767,   6793,  32767,  -2071,
+		 32767,   5829,  32767,   5830,   5831,   5832,  32767,   5833,
+		  5834,  32767,   5835,  32767,  32767,  -4499,      0,   5837,
+		     0,   5838,      0,   5010,      0,   5840,  32767,  10263,
+		   199,   1786,   9352,   1788,   1789,    359,    196,   1532,
+		 12720,   1794,   3929,   3974,   3974,   3974,  13751,  13752,
+		 14719,   -413,   5855,  13755,   5857,   8201,      0,  11949,
+		  5860,  -1256,   5862,   1805,   5863,  -3565,   5864,   5865,
+		  5866,   5867,   5868,   5869,   5870,   5871,   5872,   5873,
+		 32767,   5874,   5875,   5876,   5877,   5878,   5879,   5880,
+		  5881,   5882,   5883,  14757,   5885,   5886,   5887,   5888,
+		 11464,   5890,   1818,   1819,  -3581,   1821,   1822,   5891,
+		  5892,   5893,   1826,   4156,   5895,   5896,   5897,   7076,
+		 32767,   5899,   6406,   7335,   5902,   5903,   5904,   5905,
+		  5906,   5907,   5908,   2788,   5910,   2789,   5912,   5913,
+		  5914,   5915,  32767,   1842,   1843,   1844,   1845,  32767,
+		  1846,   1847,   1848,  32767,   1849,   1850,   1851,   1852,
+		  1853,   1854,   1855,  32767,   1856,   1857,   1858,   1859,
+		  1860,   1861,  32767,  32767,  32767,  32767,   1862,   1863,
+		  1864,   1865,   1866,  32767,  32767,  32767,  32767,  32767,
+		 32767,   1867,   1868,   1869,   1870,   1871,   1872,   1873,
+		  1874,   1875,   1876,   1877,   1878,   1879,   1880,   1881,
+		  1882,   1883,   1884,   1885,   1886,   1887,   1888,   1889,
+		  1890,   1891,   1892,   1893,   1894,   1895,   1896,   1897,
+		  1898,   1899,   1900,   1901,   1902,   1903,   1904,   1905,
+		  1906,   6244,   4036,   1909,   1910,   1911,   9949,   1206,
+		  2121,   9996,  10912,  10868,   3933,   3934,   3935,    393,
+		   393,   9192,   3939,   9148,   9149,   2164,   5640,   9105,
+		 10064,      0,   5644,   9154,   5646,   2169,    163,      0,
+		  1336,  12524,   3734,   3734,   3779,   3779,   3779,  13556,
+		 13557,  14524,  11223,   5661,  13561,   5663,   8007,  11755,
+		 11756,  11757,  11758,  11759,  11760,  10989,   7235,    249,
+		  1024,   9815,      0,      0,   9775,   9776,      0,      0,
+		  -966,   2336,   7899,      0,      0,  32767,      0,      0,
+		     0,  32767,      0,      0,  32767,      0,  32767,  32767,
+		 10335,  32767,      0,  32767,      0,  32767,    829,   3475,
+		     0,  -3464,  -4422,   5643,      0,  -3509,      0,   3478,
+		  5485,   5649,   4314,  -6873,   1918,   1919,   1875,   1876,
+		  1877,  -7899,  -7899,  -8865,  -5563,      0,  -7899,      0,
+		 -2343,  -6090,  -6090,      0,   7117,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  -8873,      0,
+		     0,      0,      0,  -5575,      0,      0,   3168,  32767,
+		 32767,      0,      0,      0,      0,      0,   1738,      0,
+		     0,      0,  -1178,      0,      0,   -506,  -1434,      0,
+		     0,      0,      0,      0,      0,      0,   3121,      0,
+		  3122,      0,      0,      0,      0,      0,   4202,  17411,
+		     0,  14110,  10809,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -5629,      0,      0,   3169,  32767,
+		 32767,   3125,  32767,   3126,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -8912,  32767,  -5611,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -5621,
+		 -5621,   3131,   3132,  -5666,      0,      0,  -5623,  -5623,
+		     0,      0,  -5625,  -5625,  32767,  32767,  32767,  32767,
+		 32767,  32767,   3092,   3093,  32767,  32767,   -259,   3095,
+		 32767,  32767,   3096,  16305,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  10260,   3144,
+		 10262,   3146,   9428,      0,   9429,  10269,  10270,   9434,
+		  9435,      0,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,  32767,      0,   9472,   9473,
+		     0,      0,      0,   9479,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -2417,   8186,   2097,  -5019,  32767,      0,
+		 32767,  32767,  32767,  32767,  -2418,  -2418,  -2418,  -2418,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,     52,     52,     52,     52,     52,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1920,   1921,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   171,    172,    173,    174,    175,    176,    177,    178,
+		   179,  -5562,  -5562,  -5562,  -5562,  -5562,  -5562,  -5562,
+		 -5562,  -5562,  -5562,  -5562,  -5562,  -5562,  -5562,  -5562,
+		 -5562,   2056,   2057,    198,   2101,   2102,   2103,  -4963,
+		 32767,  32767,  32767,  32767,  32767,      0,  32767,  32767,
+		 32767,   5916,   5917,   5918,   5919,   5920,   5921,   5922,
+		  5923,   5924,   8857,   5926,  32767,  32767,      0,  32767,
+		     0,   5927,   5928,   5929,   5930,   5931,   5932,   5933,
+		  5934,   5935,   5936,   5937,   5938,   5939,   5940,   4525,
+		  5942,   5943,   5944,   5945,   5946,   5947,   5948,   5949,
+		  5950,   5951,   5952,   5953,   5954,   5955,   5956,   5957,
+		 32767,   5958,   5959,   5960,   4502,   4502,   4502,   4502,
+		  4502,   4502,   4502,   4502,   5969,   5970,   4504,   5972,
+		  4484,   5974,   4484,   4484,   4484,   5978,   5979,   5980,
+		  5981,   5982,   5983,   5984,   5985,   5986,   5987,   5988,
+		  5989,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2285,  32767,  32767,  32767,
+		 32767,  32767,  32767,   5990,   5991,   5992,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   5993,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   7023,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1922,   1923,   1924,   1925,
+		  1926,   1927,   1928,   1929,   1930,   1931,   1932,   1933,
+		  1934,   1935,   1200,   2690,   1200,   1939,   1940,   1941,
+		  1942,   1943,   1944,   1945,   1946,   1947,   1948,   1949,
+		  1950,   1951,   1188,   1188,   1188,   1188,   1188,   1188,
+		  1188,   1188,   1188,   1188,   1188,   1188,   1188,   1188,
+		  1188,   1188,   1188,   1188,   1188,   1188,  -7665,   1188,
+		  1087,   1188,  -2046,   1188,  -7670,   1188,  -2048,   1188,
+		  1188,  -7675,   1188,   1188,   1188,   1188,   1188,   1188,
+		  1188,   1188,   1188,   1188,   1188,   1188,   1996,   1997,
+		 -2409,  -2453,   1184,   2074,   1184,   1184,  -6145,   6953,
+		  6954,   6955,   6956,      0,   2010,   2011,   2012,   2013,
+		  2014,   2015,   1178,   1178,   2018,   2019,   2020,   2021,
+		  2022,   2023,   2024,   2025,   2026,   2027,   2028,   2029,
+		  2030,   2031,   2032,   2033,   2034,   2035,   2036,   2037,
+		  2038,   2039,   2040,   2041,   2042,   2043,   2044,   2045,
+		  2046,   2047,   2048,   2049,   2050,   2051,   2052,   2053,
+		  2054,   2055,   2056,   2057,   2058,   2059,   2060,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1315,   1272,   1273,   1274,  32767,   1275,
+		  1320,   1321,   1322,   1323,  -6005,   1325,   1326,   1327,
+		 32767,   1328,   1329,   1330,  32767,   1331,   1332,   1333,
+		  1334,  -4407,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   6052,      0,      0,   6055,
+		     0,      0,      0,      0,   2006,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1850,   1851,   1852,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4054,
+		 -4054,  -4054,  -4054,   4690,   4691,  -4099,  -4099,  -4054,
+		 -4054,  -4054,  -4054,   4698,   4699,  -4099,  32767,  -4055,
+		 -4055,  -4055,  -4011,  -4011,  -4057,  -4057,  -4057,  -4057,
+		 -4057,  -4057,  -4057,   4665,   4666,   4667,   4668,   1361,
+		  1317,   4671,   4672,   4673,   4674,  17883,  14582,  14583,
+		 11282,  11283,   7982,   7983,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		 32767,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   1952,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1999,      0,   4586,
+		  4587,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  5204,   5161,   5162,   5163,   5164,   5165,   5210,   5211,
+		  5212,   5213,  -2115,   5215,   5216,   5217,   5218,   5219,
+		  5220,   5221,   5222,   5223,   5224,   5225,   5226,   -515,
+		  -515,   -515,   -515,   -515,   -515,   -515,   -515,   -515,
+		  -515,   -515,   -515,   -515,   -515,   -515,   -515,   7103,
+		  7104,   5245,   5246,   5247,   5248,   5249,  -1014,   5251,
+		  5252,   5253,   5254,   5255,   5256,   5257,   5258,   5259,
+		  5260,   8650,   8651,    -92,    -92,   8699,   8700,   8656,
+		  8657,   8658,   8659,    -92,    -92,   8707,   8708,   8664,
+		  8665,   8666,   8623,   8624,   8671,   8672,   8673,   8674,
+		  8675,   8676,   8677,    -44,    -44,    -44,    -44,   3264,
+		  3309,    -44,    -44,    -44,    -44, -13252,  -9950,  -9950,
+		 -6648,  -6648,  -3346,  -3346,    -44,    -44,    -44,    -44,
+		   -44,   8700,   8701,    -89,    -89,    -44,    -44,    -44,
+		   -44,   8708,   8709,    -89,    -89,    -44,    -44,    -44,
+		     0,      0,    -46,    -46,    -46,    -46,    -46,    -46,
+		   -46,   8676,   8677,   8678,   8679,   5372,   5328,   8682,
+		  8683,   8684,   8685,  21894,  18593,  18594,  15293,  15294,
+		 11993,  11994,   8693,   8694,   8695,   8696,   8697,    -46,
+		   -46,   8745,   8746,   8702,   8703,   8704,   8705,    -46,
+		   -46,   8753,   8754,   8710,   8711,   8712,   8713,   8714,
+		  8715,   8716,   8717,   8718,   8719,   8720,   8721,      0,
+		     0,      0,      0,   3308,   3353,      0,      0,      0,
+		     0, -13208,  -9906,  -9906,  -6604,  -6604,  -3302,  -3302,
+		     0,      0,      0,      0,      0,   8744,   8745,    -45,
+		   -45,      0,      0,      0,      0,   8752,   8753,    -45,
+		   -45,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   8722,   8723,   8724,
+		  8725,   5418,   5374,   8728,   8729,   8730,   8731,  21940,
+		 18639,  18640,  15339,  15340,  12039,  12040,   8739,   8740,
+		  8741,   8742,   8743,      0,      0,   8791,   8792,   8748,
+		  8749,   8750,   8751,      0,      0,   8799,   8800,   8756,
+		  6089,   6089,   6089,   6089,   2923,   6089,   6089,   8809,
+		  6089,   8811,  15929,   8813,  15931,   8815,   5517,   5518,
+		  5519,  -5083,   1007,   8124,   5521,   8823,   5522,   3311,
+		  8826,   5523,   5524,   5525,   5526,   5527,   5528,   5529,
+		  6156,   5531,   5532,   8837,   5533,   8839,   5534,   8841,
+		  8842,   5535,      0,      0,      0,   8847,   8848,      0,
+		     0,      0,  13200,   9900,   9900,   6600,   6600,   3300,
+		  3300,      0,      0,      0, -10416,  -3299,      0,      0,
+		     0,  10603,  32767,  32767,      0,  32767,      0,  32767,
+		 32767,      0,      0,      0,      0,      0,      0,      0,
+		  -626,      0,      0,  32767,      0,  32767,      0,  32767,
+		 32767,      0,      0,  32767,  32767,  32767,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  -1382,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -2928,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  -4090,   1652,   1653,  32767,  32767,   2061,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   1610,  32767,  32767,   6150,   6151,   6152,    411,
+		   411,    411,    411,    411,    411,    411,    411,    411,
+		   411,    411,    411,    411,    411,    411,    411,   8029,
+		  8030,   6171,   6172,    969,    969,   1013,   1013,   1013,
+		  1013,   1013,    969,    969,    969,    969,   8298,    969,
+		   969,    969,    969,    969,    969,    969,    969,    969,
+		   969,    969,    969,   6711,   6712,   6713,   6714,   6715,
+		  6716,   6717,   6718,   6719,   6720,   6721,   6722,   6723,
+		  6724,   6725,   6726,   -891,   -891,    969,    969,   6173,
+		  6174,   6131,   6132,   6133,   6134,   6135,   6180,   6181,
+		  6182,   6183,  -1145,   6185,   6186,   6187,   6188,   6189,
+		  6190,   6191,   6192,   6193,   6194,   6195,   6196,    455,
+		   455,    455,    455,    455,    455,    455,    455,    455,
+		   455,    455,    455,    455,    455,    455,    455,   8073,
+		  8074,   6215,   6216,   1013,   1013,   1057,   1057,   1057,
+		  1057,   1057,   1013,   1013,   1013,   1013,   8342,   1013,
+		  1013,   1013,   1013,   1013,   1013,   1013,   1013,   1013,
+		  1013,   1013,   1013,   6755,   6756,   6757,   6758,   6759,
+		  6760,   6761,   6762,   6763,   6764,   6765,   6766,   6767,
+		  6768,   6769,   6770,   -847,   -847,   1013,   1013,   6217,
+		  6218,   6175,   6176,   6177,   6178,   6179,   6224,   6225,
+		  6226,   6227,  -1101,   6229,   6230,   6231,   6232,   6233,
+		  6234,   6235,   6236,   6237,   6238,   6239,   6240,    499,
+		   499,    499,    499,    499,    499,    499,    499,    499,
+		   499,    499,    499,    499,    499,    499,    499,   8117,
+		  8118,   6259,   6260,   6261,   6262,   6263,      0,   6265,
+		  6266,   6267,   6268,   6269,   6270,   6271,   6272,   6273,
+		  6274,   9664,   9665,    922,    922,   9713,   9714,   9670,
+		  9671,   9672,   9673,    922,    922,   9721,   9722,   9678,
+		  9679,   9680,   9637,   9638,   9685,   9686,   9687,   9688,
+		  9689,   9690,   9691,    970,    970,    970,    970,   4278,
+		  4323,    970,    970,    970,    970, -12238,  -8936,  -8936,
+		 -5634,  -5634,  -2332,  -2332,  -2332,  -2332,  -2332,   6412,
+		  6413,  -2377,  -2377,  -2332,  -2332,  -2332,  -2332,   6420,
+		  6421,  -2377,  -2377,  -2332,  -2332,  -2332,  -2288,  -2288,
+		 -2334,  -2334,  -2334,  -2334,  -2334,  -2334,  -2334,   6388,
+		  6389,   6390,   6391,   3084,   3040,   6394,   6395,   6396,
+		  6397,  19606,  16305,  16306,  13005,  13006,   9705,   9706,
+		  6405,   6406,   6407,   6408,   6409,  -2334,  -2334,   6457,
+		  6458,   6414,   6415,   6416,   6417,  -2334,  -2334,   6465,
+		  6466,   6422,   6423,   6424,   6381,   6382,   6429,   6430,
+		  6431,   6432,   6433,   6434,   6435,  -2286,  -2286,  -2286,
+		 -2286,   1022,   1067,  -2286,  -2286,  -2286,  -2286, -15494,
+		-12192, -12192,  -8890,  -8890,  -5588,  -5588,  -2286,  -2286,
+		 -2286,  -2286,  -2286,   6458,   6459,  -2331,  -2331,  -2286,
+		 -2286,  -2286,  -2286,   6466,   6467,  -2331,  -2331,  -2286,
+		 -2286,  -2286,  -2286,  -2286,  -2286,  -2286,  -2286,  -2286,
+		 -2286,  -2286,  -2286,   6436,   6437,   6438,   6439,   3132,
+		  3088,   6442,   6443,   6444,   6445,  19654,  16353,  16354,
+		 13053,  13054,   9753,   9754,   6453,   6454,   6455,   6456,
+		  6457,  -2286,  -2286,   6505,   6506,   6462,   6463,   6464,
+		  6465,  -2286,  -2286,   6513,   6514,   6470,   6471,   6472,
+		  6473,   6474,   6475,   6476,   6477,   6478,   6479,   6480,
+		  6481,  -2240,  -2240,  -2240,  -2240,   1068,   1113,  -2240,
+		 -2240,  -2240,  -2240, -15448, -12146, -12146,  -8844,  -8844,
+		 -5542,  -5542,  -2240,  -2240,  -2240,  -2240,  -2240,   6504,
+		  6505,  -2285,  -2285,  -2240,  -2240,  -2240,  -2240,   6512,
+		  6513,  -2285,  -2285,  -2240,    428,    429,    430,    431,
+		  3598,    433,    434,  -2285,    436,  -2285,  -9402,  -2285,
+		 -9402,  -2285,   1014,   1014,   1014,  11617,   5528,  -1588,
+		  1016,  -2285,   1017,   3229,  -2285,   1019,   1019,   1019,
+		  1019,   1019,   1019,   1019,    393,   1019,   1019,  -2285,
+		  1020,  -2285,   1021,  -2285,  -2285,   1023,   6559,   6560,
+		  6561,  -2285,  -2285,   6564,   6565,   6566,  -6633,  -3332,
+		 -3331,    -30,    -29,   3272,   3273,   3274,  13691,   6575,
+		  3277,   3278,   3279,  -7323,  -1233,   5884,   3281,   6583,
+		  3282,   1071,   6586,   3283,   3284,   3285,   3286,   3287,
+		  3288,   3289,   3916,   3291,   3292,   6597,   3293,   6599,
+		  3294,   6601,   6602,   3295,   3296,  32767,  32767,  32767,
+		  3297,   3298,   3299,   3300,   3301,   3302,   3303,   3304,
+		  3305,   3306,   3307,   3308,   3309,   3310,   3311,   3312,
+		  3313,   3314,   3315,   3316,   3317,   3318,   3319,   3320,
+		  3321,   3322,   3323,   3324,   3325,   3326,   3327,   3328,
+		  3329,   3330,   3331,   3332,   3333,   3334,   3335,   3336,
+		  3337,   3338,   3339,   3340,   3341,   3342,   3343,   3344,
+		  3345,   3346,   3347,   3348,   3349,   3350,   3351,   3352,
+		  3353,   3354,   3355,   3356,   3357,   3358,   3359,   3360,
+		  3361,   3362,   3363,   3364,  32767,  32767,   3365,   3366,
+		  3367,   3368,   3369,   3370,   3371,   3372,   3373,   3374,
+		  3375,   3376,   3377,   3378,   3379,   3380,   3381,   3382,
+		  3383,   3384,   3385,   3386,   3387,   3388,   3389,   3390,
+		  3391,   3392,   3393,   3394,   3395,   3396,   3397,   3398,
+		  3399,   3400,   3401,   3402,   3403,   3404,   3405,   3406,
+		  3407,   3408,   3409,   3410,   3411,   3412,   3413,   3414,
+		  3415,   3416,   3417,   3418,   3419,   3420,   4803,   3422,
+		  3423,   3424,   3425,   3426,   3427,   3428,   3429,   3430,
+		  3431,   3432,   3433,   3434,   3435,   3436,   3437,   3438,
+		  3439,   3440,   3441,   3442,   3443,   3444,   3445,   3446,
+		  3447,   3448,   3449,   3450,   3451,   3452,   3453,   3454,
+		  3455,   3456,   3457,   3458,   3459,   3460,   3461,   3462,
+		  3463,   3464,   3465,   3466,   3467,   3468,   3469,   3470,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   3471,
+		  3472,   3473,   3474,   3475,  -7402,   3477,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   3478,   3479,   2072,   3481,   3482,  32767,
+		 32767,  32767,  32767,  32767,   3483,   3484,   3485,   3486,
+		  3487,   3488,   3489,   3490,   3491,   3492,   3493,   3494,
+		  3495,   3496,   3497,   3498,   3499,   3500,   3501,   3502,
+		  3503,   3504,   3505,   3506,   3507,   3508,  32767,   3509,
+		  3510,   3511,   3512,   3513,  32767,   3514,  32767,   3515,
+		  3516,  32767,   3517,   3518,  32767,   3519,      0,      0,
+		  3522,   3523,   3524,   3525,   3526,   3527,   3528,   3529,
+		  3530,   3531,   3532,   3533,   3534,   3535,   3536,   3537,
+		  3538,   3539,   3540,   3541,   3542,   3543,   3544,   3545,
+		  3546,   3547,   3548,   3549,   3550,   3551,   3552,   3553,
+		  3554,   3555,   3556,   3557,   3558,   1902,   1902,   1902,
+		  1902,   9231,   1902,   1902,   1902,   1902,   1902,   1902,
+		  1902,   1902,   1902,   1902,   1902,   1902,   7644,   7645,
+		  7646,   7647,   7648,   7649,   7650,   7651,   7652,   7653,
+		  7654,   7655,   7656,   7657,   7658,   7659,     42,     42,
+		  1902,      0,      0,      0,   7067,   7068,   7069,   7070,
+		  7071,   7116,   7117,   7118,   7119,   -209,   7121,   7122,
+		  7123,   7124,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   3627,   3628,   3629,  10349,   3631,   3632,
+		 10311,   3634,   3635,   3636,   3637,   3638,   8438,  -2148,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   3653,   3654,   2370,  -3718,
+		 -2703,   3658,   3659,      0,   6053,   6054,      0,   6056,
+		  6057,   6058,   6059,   4054,   6061,   6225,      0,      0,
+		  3672,      0,      0,   1531,   1531,   1531,   1531,   1531,
+		  1531,   1531,   1531,   1531,   1531,   1531,   1531,   1531,
+		  1531,   1531,   9149,   9150,   7291,   7292,   7293,   7294,
+		  7295,   1032,   7297,   7298,   7299,   7300,   7301,   7302,
+		  7303,   7304,      0,   7307,  10697,  10698,   1955,   1955,
+		 10746,  10747,  10703,   3768,   3769,   4689,   1952,   1952,
+		 10751,  10752,  10708,  10709,   3724,   6288,  10666,  10713,
+		 10714,  10715,  10716,  10717,   3732,   3733,   1996,   1996,
+		  1996,   1996,   5304,   5349,   5349,   3741,   1994,   1994,
+		-11214,   3745,   3746,   3747,      0,      0,      0,      0,
+		     0,      0,      0,   3755,  10742,  10743,   1953,   1953,
+		  1998,   1998,   1998,  11775,  11776,  12743,   9442,   3880,
+		 11780,   3882,   6226,   9974,   9975,   9976,   9977,   9978,
+		  9979,   9208,   5454,  -1532,   -757,   8034,  -1781,  -1781,
+		  7994,   7995,  -1781,  -1781,  -2747,    555,   6118,  -1781,
+		 -1781,    -66,    -66,    -66,    -66,   2656,   1742,  -6132,
+		 -7047,  -7002,    -66,    -66,    -66,   3477,   3478,  -5320,
+		   -66,  -5274,  -5274,   1712,  -1763,  -5227,  -6185,   3880,
+		 -1763,  -5272,  -1763,   1715,   3722,   3886,   2551,  -8636,
+		   155,    156,    112,    113,    114,  -9662,  -9662, -10628,
+		 -7326,  -1763,  -9662,  -1763,  -4106,  -7853,  -7853,  -7853,
+		 -7853,  -7853,  -7853,  -7081,  -3326,   3661,   2887,  -5903,
+		  3913,   3914,  -5860,  -5860,   3917,   3918,   4885,   1584,
+		 -3978,   3922,   3923,   2209,   2210,   2211,   2212,   -509,
+		   406,   8281,   9197,   9153,   2218,   2219,   2220,  -1322,
+		 -1322,   7477,   2224,   7433,   7434,    449,   3925,   7390,
+		  8349,  -1715,   3929,   7439,   3931,    454,  -1552,  -1715,
+		  -379,  10809,   2019,   2019,   2064,   2064,   2064,  11841,
+		 11842,  12809,   9508,   3946,  11846,   3948,   6292,  10040,
+		 10041,  10042,  10043,  10044,  10045,   9274,   5520,  -1466,
+		  -691,   8100,  -1715,  -1715,   8060,   8061,  -1715,  -1715,
+		 -2681,    621,   6184,  -1715,  -1715,      0,      0,      0,
+		     0,   2722,   1808,  -6066,  -6981,  -6936,      0,      0,
+		     0,   3543,   3544,  -5254,      0,  -5208,  -5208,   1778,
+		 -1697,  -5161,  -6119,   3946,  -1697,  -5206,  -1697,   1781,
+		  3788,   3952,   2617,  -8570,    221,    222,    178,    179,
+		   180,  -9596,  -9596, -10562,  -7260,  -1697,  -9596,  -1697,
+		 -4040,  -7787,  -7787,  -7787,  -7787,  -7787,  -7787,  -7015,
+		 -3260,   3727,   2953,  -5837,   3979,   3980,  -5794,  -5794,
+		  3983,   3984,   4951,   1650,  -3912,   3988,   3989,   2275,
+		  2276,   2277,   2278,   -443,    472,   8347,   9263,   9219,
+		  2284,   2285,   2286,  -1256,  -1256,   7543,   2290,   7499,
+		  7500,    515,   3991,   7456,   8415,  -1649,   3995,   7505,
+		  3997,    520,  -1486,  -1649,   -313,  10875,   2085,   2085,
+		  2130,   2130,   2130,  11907,  11908,  12875,   9574,   4012,
+		 11912,   4014,   6358,  10106,  10107,   4018,  -3098,   4020,
+		  4021,   4022,   4023,   4024,   4025,   4026,   4027,   4028,
+		  4029,   4030,   4031,   4032,   4033,   4034,   4035,   4036,
+		  4037,   4038,   4039,   4040,   4041,   4042,   4043,   4044,
+		 12918,   4046,   4047,   4048,   4049,   9625,   4051,   4052,
+		   885,  32767,  32767,   4054,   4055,   4056,   4057,   4058,
+		  2321,   4060,   4061,   4062,   5241,   4064,   4065,   4572,
+		  5501,   4068,   4069,   4070,   4071,   4072,   4073,   4074,
+		   954,   4076,    955,   4078,   4079,   4080,   4081,   4082,
+		  -119, -13327,   4085, -10024,  -6722,   4088,   4089,   4090,
+		  4091,   4092,   4093,   4094,   4095,   4096,   4097,   4098,
+		  4099,   4100,   4101,   4102,   4103,   9733,   4105,   4106,
+		   938,  32767,  32767,  32767,  32767,  32767,   2328,  32767,
+		  2329,   2330,   2331,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    870,  32767,    871,  32767,
+		   872,  32767,    873,  32767,    874,  32767,    875,  32767,
+		   876,   9729,   9730,    979,    979,   9778,   4113,   4114,
+		  9738,   9739,   4117,   4118,   9744,   9745,  32767,    883,
+		 32767,    884,  32767,  32767,  32767,  32767,  32767,  32767,
+		   885,    886,  32767,    887,    888,  32767,    889,      0,
+		 32767,    891,   8221,   4122,  -4877,  -4877,   4125,   4126,
+		  4127,   4128,   4129,   4130,  32767,  32767,  32767,  32767,
+		 32767,  32767,   4131,   4132,   4133,   4134,   4135,   4136,
+		  4137,   4138,   4139,   4140,   4141,   4142,   4143,   4144,
+		  4145,   4146,   4147,   5393,   4149,   4150,   5395,   5395,
+		  4153,   5396,   4155,   4156,   4157,   4158,   4159,   4160,
+		  4161,   4162,   4163,   4164,    897,   4166,   -484,  32767,
+		   899,   4168,   -482,   4170,   -481,   4172,   -480,   4174,
+		  -479,   4176,   -478,   4178,   -477,  32767,   -476,   4181,
+		  -475,   4183,   -474,   4185,   4186,   -473,   4188,   4189,
+		  4190,   4191,   4192,   4193,   4194,   4195,   4196,   4197,
+		  4198,    913,   4199,   4200,   4201,   4202,    916,    917,
+		 32767,    918,   4203,   4204,  -4028,    921,   4206,  32767,
+		  4207,   4208,   4209,   4210,   4211,   4212,   4213,   4214,
+		  4215,   4216,   4217,   4218,   4219,      0,      0,   4222,
+		  4223,   4224,   4225,   4226,    922,   4228,   4229,    923,
+		   924,    925,    926,   4234,   4235,   4236,    927,   2337,
+		  4239,   4240,   4241,   4242,   4243,   4244,   5564,   4246,
+		  4247,   4248,   4249,   4250,   4251,   4252,   4253,   4254,
+		  4255,   4256,   4257,   4258,   4259,   4260,   4261,   4262,
+		  4263,   4264,   4265,   4266,   4267,   4268,   4269,   4270,
+		  4271,   4272,   4273,   4274,   4275,   4276,   4277,   4278,
+		  4279,   4280,   4281,   4282,   4283,   4284,   4285,   4286,
+		  4287,   4288,  -3329,  -3329,  -3329,   4289,   4290,   2431,
+		  2432,  -2771,  -2771,  -2727,  -2727,  -2727,  -2727,  -2727,
+		 -2771,  -2771,  -2771,  -2771,   4558,  -2771,  -2771,  -2771,
+		 -2771,  -2771,  -2771,  -2771,  -2771,  -2771,  -2771,  -2771,
+		 -2771,   2971,   2972,   2973,   2974,   2975,   2976,   2977,
+		  2978,   2979,   2980,   2981,   2982,   2983,   2984,   2985,
+		  2986,  -4631,  -4631,  -2771,  -2771,   2433,   2434,   2391,
+		  2392,   2393,   2394,   2395,   2440,   2441,   2442,   2443,
+		 -4885,   2445,   2446,   2447,   2448,   2449,   2450,   2451,
+		  2452,   2453,   2454,   2455,   2456,  -3285,  -3285,  -3285,
+		 -3285,  -3285,  -3285,  -3285,  -3285,  -3285,  -3285,  -3285,
+		 -3285,  -3285,  -3285,  -3285,  -3285,   4333,   4334,   2475,
+		  4378,   4379,   4380,  -2686,  -2686,  -2686,  -2686,  -2686,
+		 -2730,  -2730,  -2730,  -2730,   4599,  -2730,  -2730,  -2730,
+		 -2730,   4395,   4396,   4397,   4398,   4399,   4400,   4401,
+		  4402,   4403,   4404,   4405,   4406,   4407,   4408,   4409,
+		  4410,   4411,   4412,   4413,   4414,   4415,   4416,   4417,
+		  4418,   4419,   4420,   4421,   4422,   4423,   4424,   4425,
+		  4426,   4427,   4428,   4429,   4430,   4431,   4432,   4433,
+		  4434,   4435,   4436,   4437,   4438,   4439,   4440,   4441,
+		  4442,    816,    816,    816,  -5903,    816,    816,  -5862,
+		   816,    816,    816,    816,    816,  -3983,   6604,   4457,
+		  4458,   4459,   4460,   4461,   4462,   4463,   4464,   4465,
+		  4466,   4467,   4468,    816,    816,   2101,   8190,   7176,
+		   816,    816,   4476,  -1576,  -1576,   4479,  -1576,  -1576,
+		 -1576,  -1576,    430,  -1576,  -1739,   4487,   4488,    817,
+		  4490,   4491,   2961,   2962,   2963,   2964,   2965,   2966,
+		  2967,   2968,   2969,   2970,   2971,   2972,   2973,   2974,
+		  2975,  -4642,  -4642,  -2782,  -2782,  -2782,  -2782,  -2782,
+		  3482,  -2782,  -2782,  -2782,  -2782,  -2782,  -2782,  -2782,
+		 -2782,   4523,  -2783,  -6172,  -6172,   2572,   2573,  -6217,
+		 -6217,  -6172,  -6172,  -6172,  -6172,   2580,   2581,  -6217,
+		 -6217,  -6172,  -6172,  -6172,  -6128,  -6128,  -6174,  -6174,
+		 -6174,  -6174,  -6174,  -6174,  -6174,   2548,   2549,   2550,
+		  2551,   -756,   -800,   2554,   2555,   2556,   2557,  15766,
+		 12465,  12466,  32767,   4553,   4554,   4555,   4556,   4557,
+		  4558,   4559,   2561,  -6182,  -6182,   2609,   2610,   2566,
+		  2567,   2568,   2569,  -6182,  -6182,   2617,   2618,   2574,
+		  2575,   2576,   2533,   2534,   2581,   2582,   2583,   2584,
+		  2585,   2586,   2587,  -6134,  -6134,  -6134,  -6134,  -2826,
+		 -2781,  -6134,  -6134,  -6134,  -6134, -19342, -16040, -16040,
+		-12738, -12738,  -9436,  -9436,  -6134,  -6134,  -6134,  -6134,
+		 -6134,  32767,   2610,  -6180,  -6180,  -6135,  -6135,  -6135,
+		 -6135,   2617,   2618,  -6180,  -6180,  -6135,  -6135,  -6135,
+		 -6135,  -6135,  -6135,  -6135,  -6135,  -6135,  -6135,  -6135,
+		 -6135,   2587,   2588,   2589,   2590,   -717,   -761,   2593,
+		  2594,   2595,   2596,  15805,  12504,  12505,   9204,   9205,
+		  5904,   5905,   2604,   2605,   2606,   2607,   2608,  -6135,
+		 -6135,   2656,   2657,   2613,   2614,   2615,   2616,  -6135,
+		 -6135,   2664,   2665,   2621,   2622,   2623,   2624,   2625,
+		  2626,   2627,   2628,   2629,   2630,   2631,   2632,  -6089,
+		 -6089,  -6089,  -6089,  -2781,  -2736,  -6089,  -6089,  -6089,
+		 -6089, -19297, -15995, -15995, -12693, -12693,  -9391,  -9391,
+		 -6089,  -6089,  -6089,  -6089,  -6089,   2655,   2656,  -6134,
+		 -6134,  -6089,  -6089,  -6089,  -6089,   2663,   2664,  -6134,
+		 -6134,  -6089,  -3421,  -3420,  -3419,  -3418,   -251,  -3416,
+		 -3415,  -6134,  -3413,  -6134, -13251,  -6134, -13251,  -6134,
+		 -2835,  -2835,  -2835,   7768,   1679,  -5437,  -2833,  -6134,
+		 -2832,   -620,      0,   9251,   5950,   5951,   2650,   2651,
+		  2652,   2653,   2654,  -6089,  -6089,   2702,   2703,   2659,
+		  2660,   2661,   2662,  -6089,  -6089,   2710,   2711,   2667,
+		     0,      0,      0,      0,  -3166,      0,      0,   2720,
+		     0,   2722,   9840,   2724,   9842,   2726,   -572,   -571,
+		  -570, -11172,  -5082,   2035,   -568,   2734,   -567,  -2778,
+		  2737,   -566,   -565,   -564,   -563,   -562,   -561,   -560,
+		    67,   -558,   -557,   2748,   -556,   2750,   -555,   2752,
+		  2753,   -554,  -6089,  -6089,  -6089,   2758,   2759,  -6089,
+		 -6089,      0,      0,      0,   2765,   2766,   2767,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   6293,   6294,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 1;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 8191 + c;
+	}
+	return h[a % 13209] + h[b % 13209];
+}
+
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo = {
+	UnicodeDecompMain,
+	DecompMain_hash_func,
+	6604
+};
diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns
index 86bdd9d6dc..f7e771a7e6 100644
--- a/src/tools/pgindent/exclude_file_patterns
+++ b/src/tools/pgindent/exclude_file_patterns
@@ -18,9 +18,10 @@ src/backend/utils/fmgrprotos\.h$
 # they match pgindent style, they'd look worse not better, so exclude them.
 kwlist_d\.h$
 #
-# This is generated by the scripts from src/common/unicode/.  It uses
+# These are generated by the scripts from src/common/unicode/.  They use
 # hash functions generated by PerfectHash.pm whose format looks worse with
 # pgindent.
+src/include/common/unicode_norm_table\.h$
 src/include/common/unicode_normprops_table\.h$
 #
 # Exclude ecpg test files to avoid breaking the ecpg regression tests
-- 
2.22.0

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: John Naylor (#1)
Re: speed up unicode decomposition and recomposition

John Naylor <john.naylor@enterprisedb.com> writes:

Some other considerations:
- As I alluded above, this adds ~26kB to libpq because of SASLPrep. Since
the decomp array was reordered to optimize linear search, it can no longer
be used for binary search. It's possible to build two arrays, one for
frontend and one for backend, but that's additional complexity. We could
also force frontend to do a linear search all the time, but that seems
foolish. I haven't checked if it's possible to exclude the hash from
backend's libpq.

IIUC, the only place libpq uses this is to process a password-sized string
or two during connection establishment. It seems quite silly to add
26kB in order to make that faster. Seems like a nice speedup on the
backend side, but I'd vote for keeping the frontend as-is.

regards, tom lane

#3Michael Paquier
michael@paquier.xyz
In reply to: Tom Lane (#2)
Re: speed up unicode decomposition and recomposition

On Wed, Oct 14, 2020 at 01:06:40PM -0400, Tom Lane wrote:

John Naylor <john.naylor@enterprisedb.com> writes:

Some other considerations:
- As I alluded above, this adds ~26kB to libpq because of SASLPrep. Since
the decomp array was reordered to optimize linear search, it can no longer
be used for binary search. It's possible to build two arrays, one for
frontend and one for backend, but that's additional complexity. We could
also force frontend to do a linear search all the time, but that seems
foolish. I haven't checked if it's possible to exclude the hash from
backend's libpq.

IIUC, the only place libpq uses this is to process a password-sized string
or two during connection establishment. It seems quite silly to add
26kB in order to make that faster. Seems like a nice speedup on the
backend side, but I'd vote for keeping the frontend as-is.

Agreed. Let's only use the perfect hash in the backend. It would be
nice to avoid an extra generation of the decomposition table for that,
and a table ordered by codepoints is easier to look at. How much do
you think would be the performance impact if we don't use for the
linear search the most-optimized decomposition table?
--
Michael

#4John Naylor
john.naylor@enterprisedb.com
In reply to: Michael Paquier (#3)
Re: speed up unicode decomposition and recomposition

On Wed, Oct 14, 2020 at 8:25 PM Michael Paquier <michael@paquier.xyz> wrote:

On Wed, Oct 14, 2020 at 01:06:40PM -0400, Tom Lane wrote:

IIUC, the only place libpq uses this is to process a password-sized

string

or two during connection establishment. It seems quite silly to add
26kB in order to make that faster. Seems like a nice speedup on the
backend side, but I'd vote for keeping the frontend as-is.

Agreed. Let's only use the perfect hash in the backend. It would be
nice to avoid an extra generation of the decomposition table for that,
and a table ordered by codepoints is easier to look at. How much do
you think would be the performance impact if we don't use for the
linear search the most-optimized decomposition table?

With those points in mind and thinking more broadly, I'd like to try harder
on recomposition. Even several times faster, recomposition is still orders
of magnitude slower than ICU, as measured by Daniel Verite [1]/messages/by-id/2c5e8df9-43b8-41fa-88e6-286e8634f00a@manitou-mail.org. I only did
it this way because I couldn't think of how to do the inverse lookup with a
hash. But I think if we constructed the hash key like

pg_hton64((code1 << 32) | code2)

and on the Perl side do something like

pack('N',$code1) . pack('N',$code2)

that might work. Or something that looks more like the C side. And make
sure to use the lowest codepoint for the result. That way, we can still
keep the large decomp array ordered, making it easier to keep the current
implementation in the front end, and hopefully getting even better
performance in the backend.

[1]: /messages/by-id/2c5e8df9-43b8-41fa-88e6-286e8634f00a@manitou-mail.org
/messages/by-id/2c5e8df9-43b8-41fa-88e6-286e8634f00a@manitou-mail.org

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: John Naylor (#4)
Re: speed up unicode decomposition and recomposition

John Naylor <john.naylor@enterprisedb.com> writes:

With those points in mind and thinking more broadly, I'd like to try harder
on recomposition. Even several times faster, recomposition is still orders
of magnitude slower than ICU, as measured by Daniel Verite [1].

Huh. Has anyone looked into how they do it?

regards, tom lane

#6Kyotaro Horiguchi
horikyota.ntt@gmail.com
In reply to: Tom Lane (#5)
Re: speed up unicode decomposition and recomposition

At Wed, 14 Oct 2020 23:06:28 -0400, Tom Lane <tgl@sss.pgh.pa.us> wrote in

John Naylor <john.naylor@enterprisedb.com> writes:

With those points in mind and thinking more broadly, I'd like to try harder
on recomposition. Even several times faster, recomposition is still orders
of magnitude slower than ICU, as measured by Daniel Verite [1].

Huh. Has anyone looked into how they do it?

I'm not sure it is that, but it would be that.. It uses separate
tables for decomposition and composition pointed from a trie?

That table is used after trying algorithmic decomposition/composition
for, for example, Hangul. I didn't look it any fruther but just for
information, icu4c/source/common/normalizer2impl.cpp seems doing that.
For example icu4c/srouce/common/norm2_nfc_data.h defines the static data.

icu4c/source/common/normalier2impl.h:244 points a design documentation
of normalization.

http://site.icu-project.org/design/normalization/custom

Old and New Implementation Details

The old normalization data format (unorm.icu, ca. 2001..2009) uses
three data structures for normalization: A trie for looking up 32-bit
values for every code point, a 16-bit-unit array with decompositions
and some other data, and a composition table (16-bit-unit array,
linear search list per starter). The data is combined for all 4
standard normalization forms: NFC, NFD, NFKC and NFKD.

regards.

--
Kyotaro Horiguchi
NTT Open Source Software Center

#7John Naylor
john.naylor@enterprisedb.com
In reply to: Kyotaro Horiguchi (#6)
2 attachment(s)
Re: speed up unicode decomposition and recomposition

On Thu, Oct 15, 2020 at 1:30 AM Kyotaro Horiguchi <horikyota.ntt@gmail.com>
wrote:

At Wed, 14 Oct 2020 23:06:28 -0400, Tom Lane <tgl@sss.pgh.pa.us> wrote in

John Naylor <john.naylor@enterprisedb.com> writes:

With those points in mind and thinking more broadly, I'd like to try

harder

on recomposition. Even several times faster, recomposition is still

orders

of magnitude slower than ICU, as measured by Daniel Verite [1].

Huh. Has anyone looked into how they do it?

I'm not sure it is that, but it would be that.. It uses separate
tables for decomposition and composition pointed from a trie?

I think I've seen a trie recommended somewhere, maybe the official website.
That said, I was able to get the hash working for recomposition (split into
a separate patch, and both of them now leave frontend alone), and I'm
pleased to say it's 50-75x faster than linear search in simple tests. I'd
be curious how it compares to ICU now. Perhaps Daniel Verite would be
interested in testing again? (CC'd)

select count(normalize(t, NFC)) from (
select md5(i::text) as t from
generate_series(1,100000) as i
) s;

master patch
18800ms 257ms

select count(normalize(t, NFC)) from (
select repeat(U&'\00E4\00C5\0958\00F4\1EBF\3300\1FE2\3316\2465\322D', i % 3
+ 1) as t from
generate_series(1,100000) as i
) s;

master patch
13000ms 254ms

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

Attachments:

v2-0001-Speed-up-unicode-decomposition.patchapplication/x-patch; name=v2-0001-Speed-up-unicode-decomposition.patchDownload
From 6bbddb72852b18803ccf258e026242630c5db674 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Thu, 15 Oct 2020 12:44:28 -0400
Subject: [PATCH v2 1/2] Speed up unicode decomposition

Replace binary search in the backend with a perfect hash function.
This takes up 26kB additional bytes, so leave out of the frontend
since decomposition there is thus far only used on password-length
strings.
---
 .../unicode/generate-unicode_norm_table.pl    |   52 +-
 src/common/unicode_norm.c                     |   57 +-
 src/include/common/unicode_norm_table.h       | 1693 +++++++++++++++++
 src/tools/pgindent/exclude_file_patterns      |    3 +-
 4 files changed, 1781 insertions(+), 24 deletions(-)

diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 7ce15e1a03..05eec2bf21 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -10,6 +10,10 @@
 use strict;
 use warnings;
 
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
 my $output_file = "unicode_norm_table.h";
 
 my $FH;
@@ -96,6 +100,17 @@ typedef struct
 								 * decomposition itself if DECOMP_INLINE */
 } pg_unicode_decomposition;
 
+/* Typedef for perfect hash functions */
+typedef int (*cp_hash_func) (const void *key);
+
+/* Information for lookups with perfect hash functions */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	cp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
 #define DECOMP_NO_COMPOSE	0x80	/* don't use for re-composition */
 #define DECOMP_INLINE		0x40	/* decomposition is stored inline in
 									 * dec_index */
@@ -113,6 +128,7 @@ HEADER
 
 my $decomp_index  = 0;
 my $decomp_string = "";
+my @dec_cp_packed;
 
 my $last_code = $characters[-1]->{code};
 foreach my $char (@characters)
@@ -121,6 +137,9 @@ foreach my $char (@characters)
 	my $class  = $char->{class};
 	my $decomp = $char->{decomp};
 
+	# Save the code point bytes as a string in network order.
+	push @dec_cp_packed, pack('N', hex($char->{code}));
+
 	# The character decomposition mapping field in UnicodeData.txt is a list
 	# of unicode codepoints, separated by space. But it can be prefixed with
 	# so-called compatibility formatting tag, like "<compat>", or "<font>".
@@ -163,7 +182,7 @@ foreach my $char (@characters)
 		{
 			foreach my $lcode (@composition_exclusion_codes)
 			{
-				if ($lcode eq $char->{code})
+				if ($lcode eq $code)
 				{
 					$flags .= " | DECOMP_NO_COMPOSE";
 					$comment = "in exclusion list";
@@ -206,18 +225,8 @@ foreach my $char (@characters)
 
 	# Print a comma after all items except the last one.
 	print $OUTPUT "," unless ($code eq $last_code);
-	if ($comment ne "")
-	{
-
-		# If the line is wide already, indent the comment with one tab,
-		# otherwise with two. This is to make the output match the way
-		# pgindent would mangle it. (This is quite hacky. To do this
-		# properly, we should actually track how long the line is so far,
-		# but this works for now.)
-		print $OUTPUT "\t" if ($decomp_index < 10);
 
-		print $OUTPUT "\t/* $comment */" if ($comment ne "");
-	}
+	print $OUTPUT "\t/* $comment */" if ($comment ne "");
 	print $OUTPUT "\n";
 }
 print $OUTPUT "\n};\n\n";
@@ -231,4 +240,23 @@ $decomp_string
 };
 HEADER
 
+# Emit the definition of the decomp hash function.
+my $dec_funcname = 'Decomp_hash_func';
+my $dec_func     = PerfectHash::generate_hash_function(\@dec_cp_packed,
+	$dec_funcname, fixed_key_length => 4);
+print $OUTPUT "\n/* Perfect hash function for decomposition */\n";
+print $OUTPUT "static $dec_func\n";
+
+# Emit the structure that wraps the hash lookup information into
+# one variable.
+print $OUTPUT <<HEADER;
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo =
+{
+	UnicodeDecompMain,
+	$dec_funcname,
+	$num_characters
+};
+HEADER
+
 close $OUTPUT;
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 4bb6a0f587..ee12aa6789 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -44,6 +44,42 @@
 #define NCOUNT		VCOUNT * TCOUNT
 #define SCOUNT		LCOUNT * NCOUNT
 
+/*
+ * Get the entry corresponding to code in the decomposition lookup table.
+ */
+#ifndef FRONTEND
+
+static const pg_unicode_decomposition *
+get_code_entry(pg_wchar code)
+{
+	int			h;
+	uint32		hashkey;
+	pg_unicode_decompinfo decompinfo = UnicodeDecompInfo;
+
+	/*
+	 * Compute the hash function. The hash key is the codepoint with the bytes
+	 * in network order.
+	 */
+	hashkey = pg_hton32(code);
+	h = decompinfo.hash(&hashkey);
+
+	/* An out-of-range result implies no match */
+	if (h < 0 || h >= decompinfo.num_decomps)
+		return NULL;
+
+	/*
+	 * Since it's a perfect hash, we need only match to the specific codepoint
+	 * it identifies.
+	 */
+	if (code != decompinfo.decomps[h].codepoint)
+		return NULL;
+
+	/* Success! */
+	return &decompinfo.decomps[h];
+}
+
+#else
+
 /* comparison routine for bsearch() of decomposition lookup table. */
 static int
 conv_compare(const void *p1, const void *p2)
@@ -56,10 +92,7 @@ conv_compare(const void *p1, const void *p2)
 	return (v1 > v2) ? 1 : ((v1 == v2) ? 0 : -1);
 }
 
-/*
- * Get the entry corresponding to code in the decomposition lookup table.
- */
-static pg_unicode_decomposition *
+static const pg_unicode_decomposition *
 get_code_entry(pg_wchar code)
 {
 	return bsearch(&(code),
@@ -69,6 +102,8 @@ get_code_entry(pg_wchar code)
 				   conv_compare);
 }
 
+#endif							/* !FRONTEND */
+
 /*
  * Given a decomposition entry looked up earlier, get the decomposed
  * characters.
@@ -77,7 +112,7 @@ get_code_entry(pg_wchar code)
  * is only valid until next call to this function!
  */
 static const pg_wchar *
-get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
+get_code_decomposition(const pg_unicode_decomposition *entry, int *dec_size)
 {
 	static pg_wchar x;
 
@@ -104,7 +139,7 @@ get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
 static int
 get_decomposed_size(pg_wchar code, bool compat)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			size = 0;
 	int			i;
 	const uint32 *decomp;
@@ -231,7 +266,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 static void
 decompose_code(pg_wchar code, bool compat, pg_wchar **result, int *current)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			i;
 	const uint32 *decomp;
 	int			dec_size;
@@ -358,8 +393,8 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 		pg_wchar	prev = decomp_chars[count - 1];
 		pg_wchar	next = decomp_chars[count];
 		pg_wchar	tmp;
-		pg_unicode_decomposition *prevEntry = get_code_entry(prev);
-		pg_unicode_decomposition *nextEntry = get_code_entry(next);
+		const pg_unicode_decomposition *prevEntry = get_code_entry(prev);
+		const pg_unicode_decomposition *nextEntry = get_code_entry(next);
 
 		/*
 		 * If no entries are found, the character used is either an Hangul
@@ -417,7 +452,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 	for (count = 1; count < decomp_size; count++)
 	{
 		pg_wchar	ch = decomp_chars[count];
-		pg_unicode_decomposition *ch_entry = get_code_entry(ch);
+		const pg_unicode_decomposition *ch_entry = get_code_entry(ch);
 		int			ch_class = (ch_entry == NULL) ? 0 : ch_entry->comb_class;
 		pg_wchar	composite;
 
@@ -458,7 +493,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 static uint8
 get_canonical_class(pg_wchar ch)
 {
-	pg_unicode_decomposition *entry = get_code_entry(ch);
+	const pg_unicode_decomposition *entry = get_code_entry(ch);
 
 	if (!entry)
 		return 0;
diff --git a/src/include/common/unicode_norm_table.h b/src/include/common/unicode_norm_table.h
index 96d43b893c..25cf16f47e 100644
--- a/src/include/common/unicode_norm_table.h
+++ b/src/include/common/unicode_norm_table.h
@@ -25,6 +25,17 @@ typedef struct
 								 * decomposition itself if DECOMP_INLINE */
 } pg_unicode_decomposition;
 
+/* Typedef for perfect hash functions */
+typedef int (*cp_hash_func) (const void *key);
+
+/* Information for lookups with perfect hash functions */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	cp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
 #define DECOMP_NO_COMPOSE	0x80	/* don't use for re-composition */
 #define DECOMP_INLINE		0x40	/* decomposition is stored inline in
 									 * dec_index */
@@ -8935,3 +8946,1685 @@ static const uint32 UnicodeDecomp_codepoints[5092] =
 	 /* 5090 */ 0x2A291,
 	 /* 5091 */ 0x2A600
 };
+
+/* Perfect hash function for decomposition */
+static int
+Decomp_hash_func(const void *key)
+{
+	static const int16 h[13209] = {
+		     0,   1515,   4744,   4745,      0,      0,      0,      0,
+		     0,      0,      0,      0,   3890,   3890,      0,      0,
+		  3891,   3891,  -2046,   2800,   3890,   3890,   3890,  -4396,
+		  4361,   4362,  -4441,  -4441,  -4396,   1773,   1773,   1773,
+		  4372,   4373,  -4438,  -4438,  -4393,  -4393,   2619,     17,
+		 -4347,  -4393,  -4393,  -4393,  -4393,  -4393,   2619,   2619,
+		  1560,   4346,   4347,   4348,   1917,   1873,   1874,   1875,
+		 -7856,   4358,  17619,   2622,   2622,   2622,   6357,   6358,
+		  6359,   6360,   6361,   6362,   6363,   2622,  -4390,  -4390,
+		  4414,  -5356,  -5356,   4374,   4375,  -5356,  -5356,  -6335,
+		 -3020,   2511,  -5356,  -5356,  -3583,  -3583,  -3583,  -3583,
+		  -995,      0,      0,  -9799,  -9754,   2874,   2875,   2876,
+		  2877,   2878,  -9830,  -3591,  -9756,  -9756,  -2744,  -5346,
+		 -9710,  -9756,    342,  -5346,  -9756,  -5346,  -2743,   -449,
+		   348,   2894,   2895,  -2853,   2897,   2898,   2899,   2900,
+		  2901,   2902,   2903,   2904,   2905,   2906,   2907,   2908,
+		  2909,   2910,   2911,   2912,   2913,   2914,   2915,   2916,
+		  2917,   2918,   2919,   2920,   2921,   2922,   2923,   2924,
+		  2925,   2926,   2927,   2928,   2929,   2930,   2931,   2932,
+		  2933,   2934,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -8721,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     1,  32767,     48,  32767,  32767,  32767,  32767,     49,
+		 32767,  32767,  -8687,  -8687,  -6255,  -6210,  32767,  32767,
+		 -8689,  -8689, -21949,  32767, -18635, -15320, -15320,  32767,
+		-12006,  -8691,  -8691,  -8691,  -8691,  -8691,  32767,     66,
+		 -8737,  -8737,  -8692,  -8692,  -8692,  -8692,     73,     74,
+		 32767,  -8738,  -8693,  -8693,  -8693,  -8693,  -8693,  32767,
+		 32767,  -8695,  -8695,  -8695,  -8695,  -8695,  32767,  32767,
+		    40,     41,  -2390,  -2434,     44,     45,  32767,     46,
+		 13307,   9993,   9994,   6680,   6681,   3367,   3368,     54,
+		     0,     55,     56,     57,  -8699,  -8699,    105,  32767,
+		 32767,     61,     62,     63,  -8701,  -8701,  32767,    111,
+		 32767,     67,     68,     69,     70,   1890,   3687,  -1272,
+		  3690,     75,     76,     77,     78,     79,     80,     81,
+		    82,  32767,  32767,     83,     84,     85,     86,     87,
+		    88,     89,     90,     91,     92,     93,     94,     95,
+		    96,     97,     98,     99,    100,    101,    102,  32767,
+		 32767,    103,    104,    105,    106,    107,    108,    109,
+		 -8660,  -8660,  32767,  -8661,  -8661,  -8661,  -8661,  -8661,
+		 -8661,  32767,     73,     74,     75,     76,  -2355,  -2399,
+		    79,     80,  32767,  32767,  13341,  10027,  10028,   6714,
+		  6715,   3401,   3402,  32767,  32767,     88,     89,     90,
+		 -8666,  -8666,    138,  32767,  32767,     94,     95,     96,
+		 -8668,  -8668,    144,    145,    101,  -2553,  -2553,  -2553,
+		 -2553,  -4983,  -2553,  -2553,    154,  -2553,    156,  32767,
+		 32767,   6114,    158,  -3153,  -3152,  -3151, -12891,  -6888,
+		  -931,  -3149,    166,  -3148,  -4728,    169,  -3147,  -3146,
+		 -3145,  -3144,  -3143,  -3142,  -3141,  -2543,  -3139,  -3138,
+		   180,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   3314,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,   3660,   3661,   2131,   2132,   2133,   2134,   2135,
+		  2136,   2137,   2138,   2139,   2140,   2141,   2142,   2143,
+		  2144,   2145,  -5472,  -5472,  -3612,  -3612,  -3612,  -3612,
+		 -3612,   2652,  -3612,  -3612,  -3612,  -3612,  -3612,  -3612,
+		 -3612,  -3612,   3693,  -3613,  -7015,  -7015,   1742,   1743,
+		 -7060,  -7060,  -7015,   -846,   -846,   -846,   1753,   1754,
+		 -7057,  -7057,  -7012,  -7012,      0,  -2602,  -6966,  -7012,
+		 -7012,  -7012,  -7012,  -7012,      0,      0,   1725,   1726,
+		  1727,   1728,   -703,   -747,   -746,      0,   1735,   1736,
+		 14997,      0,      0,      0,   3735,   3736,   3737,   3738,
+		  3739,   3740,   3741,      0,  -7012,  -7012,   1792,   1793,
+		  1749,   1750,   1751,  -7980,  -7980,  -8959,  -5644,   -113,
+		 -7980,   -113,  -2382,  -6116,  -6116,  -6116,  -6116,  -6116,
+		 -6116,  -6116,  -2374,   4639,   4640,  -4163,   5608,   5609,
+		 -4120,  -4120,   5612,   5613,   6593,   3279,  -2251,   5617,
+		  5618,   3846,   3847,   3848,   3849,   1262,   1262,  10066,
+		 10067,  10023,   3855,   3856,   3857,   1259,   1259,  10071,
+		  3861,  10027,  10028,   3017,   5620,   9985,  10032,    -65,
+		  5624,  10035,   5626,   3024,    731,    -65,   1298,  12530,
+		  3727,   3727,   3772,   3772,   3772,  13504,  13505,  14485,
+		 11171,   5641,  13509,   5643,   7913,  11648,  11649,  11650,
+		 11651,  11652,  11653,  11654,   7913,    901,    901,   9705,
+		   -65,    -65,   9665,   9666,    -65,    -65,  -1044,   2271,
+		  7802,    -65,    -65,   1708,   1708,   1708,   1708,   4296,
+		  4297,  -4506,  -4506,  -4461,   1708,   1708,   1708,   4307,
+		  4308,  -4503,   1708,  -4457,  -4457,   2555,    -47,  -4411,
+		 -4457,   5641,    -47,  -4457,    -47,   2556,   4850,   5647,
+		  4285,  -6946,   1858,   1859,   1815,   1816,   1817,  -7914,
+		 -7914,  -8893,  -5578,    -47,  -7914,    -47,  -2316,  -6050,
+		 -6050,  -6050,  -6050,  -6050,  -6050,  -6050,  -2308,   4705,
+		  4706,  -4097,   5674,   5675,  -4054,  -4054,   5678,   5679,
+		  6659,   3345,  -2185,   5683,   5684,   3912,   3913,   3914,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -3083,  -3083,    232,    287,    233,    233,
+		   233,   8990,   8991,  32767,  32767,   3668,  32767,   3667,
+		  3667,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    208,    208,    208,    208,    208,    208,
+		 32767,  32767,    206,    206,    206,    206,    206,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,    304,    305,  -1274,    307,    308,
+		   309,   6753,  -1374,  10488,   4486,  -1470,   4488,    316,
+		  4489,  -5607,   4490,   4491,   4492,    322,    760,    324,
+		   325,    326,    166,    763,    329,  -2553,    765,    332,
+		   333,    334,    335,    772,    337,   6310,    339,    340,
+		   341,    342,    343,    344,    345,    346,  -2542,  -2542,
+		 -2542,    350,    351,    352,    353,    354,    355,    356,
+		   357,    358,    359,    360,    361,    362,  -6008,    364,
+		   365,    366,    367,    368,    369,    370,    254,    372,
+		   373,    374,    375,    376,    377,    378,    379,    380,
+		   381,    382,  32767,    383,    384,  -3606,  -3605,  -3604,
+		 -3603,    389,  -3600,  -3599,  -3598,   2340,  -1238,  -3595,
+		 -3594,  -3593,   4694,  -4062,  -4062,   4742,   4743,   4699,
+		 -1469,  -1468,  -1467,  -4065,  -4065,   4747,  -1463,   4703,
+		  4704,  -2307,    296,  32767,      0,  32767,  32767,   4708,
+		 -1376,  -1376,  -1376,  32767,  32767,  -1246,    506,    506,
+		     0,  -1559,  32767,  32767,  32767,  32767,  32767,    305,
+		   419,    308,   2578,   6313,   6314,    424,  32767,  -6030,
+		 32767,    426,    427,    428,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,  32767,      0,
+		 32767,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,  32767,    429,  -5407,    431,
+		 -5406,    433,  -3601,    435,  32767,  -3751,  32767,  32767,
+		 32767,  32767,  -3755,  32767,  32767,  32767,  32767,      0,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    436, -11425,  -5422,
+		   535,  -5422,    535,  -5422,   4675,  -5421,  -5421,  -5421,
+		 -5421,  -5421,   4681,      0,      0,      0,   4682,   4683,
+		  4684,   4685,   4686,   4687,      0,      0,  32767,  32767,
+		     0,      0,  -5684,      0,   4688,   4689,   4690,   4691,
+		  4692,   4693,   4694,   4695,  -1257,  -1257,   4696,  -5441,
+		 -5441,   4699,   4700,   4701,  -5443,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    454,      0,  32767,    456,
+		 32767,  32767,      0,    457,  32767,  32767,  32767,      0,
+		   458,    459,    460,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,   4703,   4704,   4705,   4706,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   4655,   4656,   4657,   4658,
+		  4659,   4712,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    462,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    463,    464,  32767,    465,
+		 32767,  32767,  32767,    466,  32767,  32767,  32767,  32767,
+		   467,    468,    469,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   3011,   3011,   3011,
+		  3011,   3011,   3011,   3011,  32767,  32767,  32767,  32767,
+		 32767,  32767,    470,    471,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    472,
+		   473,    474,    475,    476,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   4713,   4714,   4715,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    477,    478,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    479,    480,    481,    482,
+		 32767,  32767,    483,    484,  32767,  32767,    485,    486,
+		   487,    488,    489,    490,  32767,  32767,    491,    492,
+		   493,    494,    495,    496,  32767,  32767,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,    665,   -255,    667,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,    693,    694,    695,    696,
+		   697,    698,    699,    700,    701,    702,    703,    704,
+		   705,    706,    707,    708,    709,    710,    711,    712,
+		  7183,    714,  -1580,    716,   2547,    718,   7194,    720,
+		  2553,    722,    723,   7204,    725,    726,    727,    728,
+		   729,    730,    731,    732,    733,    734,    735,    736,
+		     0,      0,   8114,   8159,    745,  -1535,    747,    748,
+		  8161,  -5019,  -5019,  -5019,  -5019,   1938,      0,      0,
+		     0,      0,      0,      0,    767,    768,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,  32767,  32767,  32767,  32767,  32767,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  -2875,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -2884,  -2884,
+		 -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,
+		 -2884,  -2884,  -4271,  -2884,  -2884,  -2884,  -2884,  -2884,
+		 -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,
+		 -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,
+		 -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,  -2884,
+		 -2884,  -2884,  -2884,  32767,  -2885,  32767,  -2886,  -2886,
+		 32767,  -2887,  -2887,  32767,  -2888,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,    563,    564,
+		   565,    566,    567,    568,    569,    570,    571,    572,
+		   573,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   574,    575,    576,    577,    578,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   -294,   -294,   -294,  -3047,    583,    584,    585,
+		 -4462,  -4418,  -4418,  -4418,  -4418,  -4418,  -4462,  -4462,
+		 -4462,    595,    596,    597,    598,    599,  32767,  32767,
+		 32767,  32767,  -4471,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   4716,   4717,   4718,   4719,
+		  4720,   4721,   4722,   4723,   4724,   4725,   4726,   4727,
+		  4728,   4729,   4730,   4731,   4732,   4733,   4734,   4735,
+		  3826,   4737,   4738,   4739,   4740,   4741,   4742,   3832,
+		  4744,   3833,   3120,   3121,   3835,   3835,   3124,   3836,
+		  3836,   4753,   4754,   4755,   4756,   4757,   4758,   4759,
+		  4760,   4761,   4762,   4763,   4764,   4765,   4766,   4767,
+		  4768,   4769,   4770,   4771,   4772,   4773,   4774,   4775,
+		  4776,   4777,   4778,   4779,   4780,   4781,   6619,   6620,
+		  6621,  11272,   6623,   6624,   4788,   4789,   4790,   3874,
+		  4761,   3874,   4794,   3874,   4796,   4797,   4798,   3874,
+		  4800,  32767,      0,   4802,   4803,   4804,   4805,   4806,
+		  4807,   4808,   4809,   4810,   4811,   4812,   4813,   4814,
+		  4815,   4816,   4817,   4818,   4819,   4820,   4821,   4822,
+		  4823,   4824,   4825,   4826,   4827,   4828,  11299,   4830,
+		  2536,   4832,   6663,   4834,  11310,   4836,   6669,   4838,
+		  4839,  11320,   4841,   4842,   4843,   4844,   4845,   4846,
+		  4847,   4848,   4849,   4850,   4851,   4852,   1188,   4854,
+		  4855,   4856,   4857,   2577,   4859,   4860,  12273,   -907,
+		  -907,   -907,   -907,   -907,   -907,   4868,   4869,   4870,
+		  4871,  32767,   4872,   4873,  32767,  32767,   4874,  32767,
+		   627,   4875,   4876,  32767,  32767,   4877,   4878,   4879,
+		  6722,  32767,   4881,   4882,   4883,   6730,   6731,   7446,
+		  6733,   4888,   7449,   7449,   4891,   4892,  32767,   4893,
+		 32767,   4894,   4895,   4896,   4897,   4898,   4899,   3512,
+		  3513,   3514,   3515,   3516,   4904,   3518,   3519,   3520,
+		  3521,   3522,   3523,   3524,   3525,   3526,   3527,   3528,
+		  3529,   3530,   3531,   3532,   3533,   3534,   3535,   3536,
+		  3537,   3538,   4926,   6797,   4928,   6800,   4930,   4931,
+		  4932,   4933,   4934,   4935,   6813,   4937,   4938,   6816,
+		  6817,   4941,   4942,   4943,      0,   4945,   6821,      0,
+		     0,   4949,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,   -127,   -127,   -127,
+		  7285,   -127,   -127,      0,   -128,   -128,   -128,   -128,
+		     0,  32767,   -130,   4971,   -129,   5613,   5614,   5615,
+		  4976,   5618,  32767,   5619,   5620,   5621,   4981,   5624,
+		  4983,   4984,  32767,   5630,   5631,  -1986,  -1986,   -126,
+		  -126,   5078,   4992,   5037,   5038,   5039,   5040,   5041,
+		  5086,   5087,   5088,   5089,  -2322,   5091,   5092,   5093,
+		  5094,   5095,   5096,   5097,   5098,   5099,   5100,      0,
+		  5101,   -640,   -640,   -640,      0,   -641,   -641,   -641,
+		  -641,   -641,      0,   -642,      0,      0,  32767,   -645,
+		  -645,   6973,   6974,   5115,   5116,    -87,      0,    -44,
+		   -44,    -44,    -44,    -44,    -88,    -88,    -88,    -88,
+		  7324,    -88,    -88,    -88,    -88,    -88,    -88,    -88,
+		   -88,    -88,    -88,    -88,    -88,   5654,   5655,   5656,
+		  5657,   5658,   5659,   5660,   5661,   5662,   5663,   5664,
+		  5665,   5666,   5667,   5668,   5669,  -1948,  -1948,    -88,
+		   -88,   5116,   5117,   5074,   5075,   5076,   5077,   5078,
+		  5123,   5124,   5125,   5126,  -2285,   5128,   5129,   5130,
+		  5131,   5132,   5133,   5134,   5135,   5136,   5137,   5138,
+		  5139,   -602,   -602,   -602,   -602,   -602,   -602,   -602,
+		  -602,   -602,   -602,   -602,   -602,   -602,   -602,   -602,
+		  -602,   7016,   7017,   5158,   5159,    -44,    -44,      0,
+		     0,      0,      0,      0,    -44,    -44,    -44,    -44,
+		  7368,    -44,    -44,    -44,    -44,    -44,    -44,    -44,
+		   -44,    -44,    -44,    -44,    -44,   5698,   5699,   5700,
+		  5701,   5702,   5703,   5704,   5705,   5706,   5707,   5708,
+		  5709,   5710,   5711,   5712,   5713,  -1904,  -1904,    -44,
+		   -44,   5160,   5161,   5118,   5119,   5120,   5121,   5122,
+		  5167,   5168,   5169,   5170,  -2241,   5172,   5173,   5174,
+		  5175,   5176,   5177,   5178,   5179,   5180,   5181,   5182,
+		  5183,   -558,   -558,   -558,   -558,   -558,   -558,   -558,
+		  -558,   -558,   -558,   -558,   -558,   -558,   -558,   -558,
+		  -558,   7060,   7061,   5202,   5203,      0,      0,     44,
+		    44,     44,     44,     44,      0,      0,      0,      0,
+		  7412,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   5742,   5743,   5744,
+		  5745,   5746,   5747,   5748,   5749,   5750,   5751,   5752,
+		  5753,   5754,   5755,   5756,   5757,  -1860,  -1860,      0,
+		     0,      0,      0,      0,   6264,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,  -3402,
+		 -3402,   5355,   5356,  -3447,  -3447,  -3402,  -3402,  -3402,
+		 -3402,   5363,   5364,  -3447,  -3447,  -3402,  -3402,  -3402,
+		 -3358,  -3358,  -3404,  -3404,  -3404,  -3404,  -3404,  -3404,
+		 -3404,   5331,   5332,   5333,   5334,   2903,   2859,   5337,
+		  5338,   5339,   5340,  18601,  15287,  15288,  11974,  11975,
+		  8661,   8662,   5348,   5349,   5350,   5351,   5352,  -3404,
+		 -3404,   5400,   5401,   5357,   5358,   5359,   5360,  -3404,
+		 -3404,   5408,   5409,   5365,   5366,   5367,   5324,   5325,
+		  5372,   5373,   5374,   5375,   5376,   5377,   5378,  -3356,
+		 -3356,  -3356,  -3356,   -924,   -879,  -3356,  -3356,  -3356,
+		 -3356, -16616, -13301, -13301,  -9986,  -9986,  -6671,  -6671,
+		 -3356,  -3356,  -3356,  -3356,  -3356,   5401,   5402,  -3401,
+		 -3401,  -3356,  -3356,  -3356,  -3356,   5409,   5410,  -3401,
+		 -3401,  -3356,  -3356,  -3356,  -3312,  -3312,  -3358,  -3358,
+		 -3358,  -3358,  -3358,  -3358,  -3358,   5377,   5378,   5379,
+		  5380,   2949,   2905,   5383,   5384,   5385,   5386,  18647,
+		 15333,  15334,  12020,  12021,   8707,   8708,   5394,   5395,
+		  5396,   5397,   5398,  -3358,  -3358,   5446,   5447,   5403,
+		  5404,   5405,   5406,  -3358,  -3358,   5454,   5455,   5411,
+		  5412,   5413,   5414,   5415,   5416,   5417,   5418,   5419,
+		  5420,   5421,   5422,  -3312,  -3312,  -3312,  -3312,   -880,
+		  -835,  -3312,  -3312,  -3312,  -3312, -16572, -13257, -13257,
+		 -9942,  -9942,  -6627,  -6627,  -3312,  -3312,  -3312,  -3312,
+		 -3312,   5445,   5446,  -3357,  -3357,  -3312,  -3312,  -3312,
+		 -3312,   5453,   5454,  -3357,  -3357,  -3312,  -3312,  -3312,
+		 -3312,  -3312,  -3312,  -3312,  -3312,  -3312,  -3312,  -3312,
+		 -3312,   5423,   5424,   5425,   5426,   2995,   2951,   5429,
+		  5430,   5431,   5432,  18693,  15379,  15380,  12066,  12067,
+		  8753,   8754,   5440,   5441,   5442,   5443,   5444,  -3312,
+		 -3312,   5492,   5493,   5449,   5450,   5451,   5452,  -3312,
+		 -3312,   5500,   5501,   5457,   2803,   2803,   2803,   2803,
+		   373,   2803,   2803,   5510,   2803,   5512,  11470,   5514,
+		 11472,   5516,   2205,   2206,   2207,  -7533,  -1530,   4427,
+		  2209,   5524,   2210,    630,   5527,   2211,   2212,   2213,
+		  2214,   2215,   2216,   2217,   2815,   2219,   2220,   5538,
+		  2221,   5540,   2222,   5542,   5543,   2223,  -3312,  -3312,
+		 -3312,   5548,   5549,  -3312,  -3312,   2803,   2803,   2803,
+		  5555,   5556,   5557,   2803,   2803,   2803,   2803,   2803,
+		  2803,   2803,   2803,   2803,   2803,   2803,   2803,   2803,
+		  9050,   9051,   2803,   2803,   2803,   2803,   2803,   2803,
+		  2803,   2803,   2803,   2803,   2803,   2803,   4318,   7547,
+		  7548,   2803,   2803,   2803,   2803,   2803,   2803,   2803,
+		  2803,   6693,   6693,   2803,   2803,   6694,   6694,    757,
+		  5603,   6693,   6693,   6693,  -1593,   7164,   7165,  -1638,
+		 -1638,  -1593,   4576,   4576,   4576,   7175,   7176,  -1635,
+		 -1635,  -1590,  -1590,   5422,   2820,  -1544,  -1590,  -1590,
+		 -1590,  -1590,  -1590,   5422,   5422,   4363,   7149,   7150,
+		  7151,   4720,   4676,   4677,   4678,  -5053,   7161,  20422,
+		  5425,   5425,   5425,   9160,   9161,   9162,   9163,   9164,
+		  9165,   9166,   5425,  -1587,  -1587,   7217,  -2553,  -2553,
+		  7177,   7178,  -2553,  32767,  32767,   -219,   5312,  -2555,
+		 -2555,   -782,   -782,   -782,   -782,   1806,   2801,   2801,
+		 -6998,  -6953,   5675,   5676,   5677,   5678,   5679,  -7029,
+		  -790,  -6955,  -6955,     57,  -2545,  -6909,  -6955,   3143,
+		 -2545,  -6955,  -2545,     58,   2352,   3149,   5695,   5696,
+		   -52,   5698,   5699,   5700,   5701,   5702,   5703,   5704,
+		  5705,   5706,   5707,   5708,   5709,   5710,   5711,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -1838,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   6927,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   -973,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,   4567,   4568,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   -437,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -448,  32767,  32767,   -450,   -450,
+		  -450,      0,  32767,  32767,  32767,  -2166,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,      0,  32767,   -464,
+		  -464,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   -514,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  5757,   5758,   5759,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -4186,  -4186, -12097,  -4186,  32767,
+		 -4187,  -4187,  -8787,  32767,      0,      0,   5952,      0,
+		     0,  -4183,  -4183,  -4183,      0,  -2386,  -4182,    778,
+		 -4183,  -5935,  32767,  32767,  -4690,  -6249,  -4184,  -4184,
+		 -4184,  32767,  32767,  -4186,  -4186,    -77,  32767,    -77,
+		 32767,  -4188,      0,  -4189,  32767,      0,      0,      0,
+		     0,  32767,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -5937,  -2358,      0,      0,      0,
+		 -8286,    471,    472,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1747,  32767,  -2126,  32767,  32767,   1748,
+		  1749,   1750,   1751,   1752,   1753,   8224,   1755,   -539,
+		  1757,    781,  32767,  32767,  32767,  -1991,  -2035,  32767,
+		 32767,    782,  -3784,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    837,  32767,  32767,  32767,  32767,  32767,  -4008,
+		 -4008,  -4008,   2949,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,   -797,   1806,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   4605,   4606,
+		 32767,  32767,      0,    455,  32767,      0,  32767,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -4244,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   784,  32767,  32767,   2950,   2951,  32767,  32767,  32767,
+		 32767,  32767,  32767,    786,    787,  32767,   1252,   1253,
+		 32767,    790,  32767,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,  32767,      0,  32767,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   -200,   -200,   -200,
+		  -200,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -5932,  -5932,  32767,  32767,   2952,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -5387,
+		 -5387,  -5387,  -5387,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,      0,  32767,  32767,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,    497,    498,    499,    500,
+		   501,    502,    503,    504,    505,    506,    507,    508,
+		 32767,  32767,   -156,    765,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   -861,
+		 32767,   6106,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2953,   2954,  32767,    797,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   2955,  32767,  32767,  32767,  -8929,
+		 32767,  -8885,  -8885,  -8885,  32767,  32767,  32767,  32767,
+		 32767,  32767,   -749,   7119,   7120,  32767,  32767,  32767,
+		 32767,   2760,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  -1181,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -5587,      0,   7596,
+		  7597,      0,      0,      0,      0,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,   -714,      0,
+		     0,   -713,   -712,      0,   -711,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,   1859,
+		     0,   3247,  32767,  32767,      0,   3247,      0,   3248,
+		     0,   3249,      0,   3250,      0,   3251,      0,   3252,
+		   808,   3252,      0,   3253,      0,   3254,      0,      0,
+		  3256,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,  32767,  32767,  32767,  32767,      0,      0,   6824,
+		 32767,      0,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  4207,   4208,      0,      0,      0,      0,      0,   1896,
+		     0,      0,   1898,   1898,   1898,   1898,      0,      0,
+		     0,   1901,   1901,      0,      0,      0,      0,      0,
+		     0,  -1319,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   7618,   7619,   7620,
+		     3,      3,   1863,   1863,   7067,   7068,   7025,   7026,
+		  7027,   7028,   7029,   7074,   7075,   7076,   7077,   -334,
+		  7079,   7080,   7081,   7082,   7083,   7084,   7085,   7086,
+		  7087,   7088,   7089,   7090,   1349,   1349,   1349,   1349,
+		  1349,   1349,   1349,   1349,   1349,   1349,   1349,   1349,
+		  1349,   1349,   1349,   1349,   8967,   8968,   7109,   7110,
+		  1907,   1907,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   2976,   2977,   2978,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,    820,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    821,
+		  2381,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   2005,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    823,  32767,    824,  32767,
+		   825,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    826,  32767,  32767,  32767,  32767,  32767,
+		 32767,   4575,   4576,   4577,   4578,   4579,   4580,   4581,
+		  4582,   4583,   4584,   4585,  32767,  32767,    829,  32767,
+		 32767,  32767,  32767,    830,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  6253,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  6253,  -3848,    834,    835,    836,  -3845,  -3845,  -3845,
+		 -3845,  -3845,  -3845,    843,    844,  -4280,  32767,    845,
+		   846,   6531,    848,  -3839,  32767,  -3840,  -3840,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   1946,  32767,
+		 32767,  32767,  -3849,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    853,  32767,  32767,  32767,
+		 32767,    854,  32767,  32767,  32767,  32767,    855,  32767,
+		 32767,  32767,  32767,    856,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   857,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -3799,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   8266,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,    859,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,    860,
+		 32767,    861,  -5065,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  10746,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4526,
+		 32767,   4573,   4574,   4575,  32767,  32767,  -2436,  -1376,
+		 32767,  32767,  32767,  32767,  32767,  -1689,  -1689,   4349,
+		 -4171,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   4588,  32767,
+		  4589,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4590,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4591,   4592,  32767,
+		 32767,  32767,  32767,  32767,  32767,   2933,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,    864,  32767,  32767,  32767,
+		     0,  32767,      0,  32767,  32767,  -2977,    335,    335,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2992,   2993,   2994,   2995,
+		 32767,  32767,  32767,   4596,   2550,  32767,  32767,  32767,
+		 -1188,   4769,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  4600,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   2997,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4601,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   2013,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767, -11287,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  -4664,  32767,  32767,  -4711,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -4718,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4049,
+		 32767,  32767,  32767,   4050,   4051,   4052,  17313,  32767,
+		 32767,  32767,  10684,   7370,   7371,   4057,   4058,   4059,
+		  4060,   4061,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   4603,   8793,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1283,   4897,   4898,   4899,  12175,   4901,   4902,  32767,
+		  4903,   4904,   4905,   4906,   4907,  10276,  -1469,   1282,
+		  1282,   1282,   1282,   1282,   1282,   1282,   1282,   1282,
+		  1282,  32767,  32767,   4920,   4921,   4063,  -2051,  -2050,
+		  4925,   4926,  32767,   7332,   7333,  32767,   7334,   7335,
+		  7336,   7337,   5045,  32767,  32767,  32767,  -2049,  -2048,
+		 32767,  -8294,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   1132,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  20166,  16852,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   6908,   6909,   6910,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		 -4510,  -4510,  -4510,  -4510,  -4510,  -4510,  -4510,      0,
+		     0,      0,      0,      0,      0,  -1831,  -1831,  -1831,
+		-15091, -11776, -11776,  -8461,      0,      0,      0,  -1834,
+		 -1834,  -1834,  -1834,  -1834,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -1819,  -3615,   1345,  -3616,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,   8770,   8771,
+		  8772,   8773,   8774,   8775,   8776,   8777,   8778,   8779,
+		    45,     45,     45,     45,   2477,   2522,     45,     45,
+		    45,     45, -13215,  -9900,  -9900,  -6585,  -6585,  -3270,
+		 -3270,     45,     45,     45,     45,     45,   8802,   8803,
+		     0,      0,     45,     45,     45,     45,   8810,   8811,
+		     0,      0,     45,   2700,   2701,   2702,   2703,   5134,
+		  2705,   2706,      0,   2708,      0,  -5957,      0,  -5957,
+		     0,   3312,   3312,   3312,  13053,   7051,   1095,   3314,
+		     0,   3315,   4896,      0,   3317,   3317,   3317,   3317,
+		  3317,   3317,   3317,   2720,   3317,   3317,      0,   3318,
+		     0,   3319,      0,      0,   3321,   8857,   8858,   8859,
+		     0,      0,   8862,   8863,   2749,   2750,   2751,      0,
+		     0,      0,   2755,   2756,   2757,   2758,   2759,   2760,
+		  2761,   2762,   2763,   2764,   2765,   2766,   2767,  -3479,
+		 -3479,   2770,   2771,   2772,   2773,   2774,   2775,   2776,
+		  2777,   2778,   2779,   2780,   2781,   1267,  -1961,  -1961,
+		  2785,   2786,   2787,   2788,   2789,   2790,   2791,   2792,
+		 -1097,  -1096,   2795,   2796,  -1094,  -1093,   4845,      0,
+		 -1089,  -1088,  -1087,   7200,  -1556,  -1556,   7248,   7249,
+		  7205,   1037,   1038,   1039,  -1559,  -1559,   7253,   7254,
+		  7210,   7211,    200,   2803,   7168,   7215,   7216,   7217,
+		  7218,   7219,    208,    209,   1269,  -1516,  -1516,  -1516,
+		   916,    961,    961,    961,  10693,  -1520, -14780,    218,
+		   219,    220,  -3514,  -3514,  -3514,  -3514,  -3514,  -3514,
+		 -3514,    228,   7241,   7242,  -1561,   8210,   8211,  -1518,
+		 -1518,   8214,   8215,   9195,   5881,    351,   8219,   8220,
+		  6448,   6449,   6450,   6451,   3864,   2870,   2871,  12671,
+		 12627,      0,      0,      0,      0,      0,  12709,   6471,
+		 12637,  12638,   5627,   8230,  12595,  12642,   2545,   8234,
+		 12645,   8236,   5634,   3341,   2545,      0,      0,   5749,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,      0,      0,  11602,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,   1466,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,   5760,      0,      0,      0,      0,      0,  32767,
+		     0,  32767,      0,      0,  32767,      0,      0,  32767,
+		     0,   3507,   3508,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		  1644,   1645,   1646,   1647,  -5764,   1649,   1650,   1651,
+		  1652,   1653,   1654,   1655,   1656,   1657,   1658,   1659,
+		  1660,  -4081,  -4081,  -4081,  -4081,  -4081,  -4081,  -4081,
+		 -4081,  -4081,  -4081,  -4081,  -4081,  -4081,  -4081,  -4081,
+		 -4081,   3537,   3538,   1679,   3582,   3583,   3584,  -3482,
+		 -3482,  -3482,  -3482,  -3482,  -3526,  -3526,  -3526,  -3526,
+		  3886,  -3526,  -3526,  -3526,  -3526,   3599,   3600,   3601,
+		  3602,   3603,   3604,   3605,   3606,   3607,   3608,   3609,
+		  3610,   3611,   3612,   3613,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,      0,
+		 -7275,      0,      0,  -7234,      0,      0,      0,      0,
+		     0,  -5368,   6378,   3628,   3629,   3630,   3631,   3632,
+		  3633,   3634,   3635,   3636,   3637,   3638,   3639,      0,
+		     0,    859,   6974,   6974,      0,      0,   3647,  -2405,
+		 -2405,   3650,  -2405,  -2405,  -2405,  -2405,   -112,  -2405,
+		 -3201,   3658,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,   5280,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  4637,   4638,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   4014,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    802,  32767,  32767,
+		 32767,  32767,    803,  -1055,    805,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   4639,  32767,
+		 32767,  32767,    806,  -2445,      0,  -2443,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    810,  32767,  32767,
+		 32767,  32767,    811,    812,    813,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -6211,  -6211,  -6211,  -6211,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  -6271,  -6271,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    935,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767, -10300,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,      0,  32767,  32767,   4640,   4641,  32767,
+		 32767,  32767,  32767,  32767,   4624,  32767,  32767,  32767,
+		 -4233,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  1859,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    872,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -4568,  -1253,  32767,
+		 -3590,  32767,  32767,  32767,  -1820,  -1820,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    873,    874,    875,   3629,      0,      0,
+		     0,   5048,   5005,   5006,   5007,   5008,   5009,   5054,
+		  5055,   5056,      0,      0,      0,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4118,
+		 32767,  32767,  32767,  32767,  -4122,  -4122,  -4122,  -4122,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4193,
+		 32767,  -4194,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -4209,  32767,  32767,  -4211,  -4211,  -4211,
+		 -4211,  -4211,  -4211,  -4211,  32767,  32767,  -4213, -10683,
+		 -4213,  -1918,  -4213,  -6043,  32767,  32767,  -4215,  -6047,
+		 32767,  -4216, -10696,  -4216,  -4216,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   4646,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    876,    877,      0,  32767,      0,  32767,      0,
+		 32767,      0,  32767,      0,  32767,  32767,  32767,      0,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   1844,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  -2899,      0,  32767,
+		     0,  32767,      0,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,    836,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,      0,      0,      0,    879,
+		   880,    881,    882,    883,    884,    885,    886,      0,
+		     0,    887,      0,    920,      0,    922,    923,    924,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   5431,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,   3639,    889,    890,    891,    892,    893,
+		   894,    895,    896,    897,    898,    899,    900,  -2739,
+		   927,  -1881,   4234,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,   -459,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   -458,
+		  -457,    904,  32767,    905,  32767,    906,  32767,    907,
+		 32767,    908,  32767,  32767,  32767,    909,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,    910,
+		     0,      0,      0,      0,      0,      0,    911,      0,
+		   912,   1626,   1626,    913,    914,   1626,    915,    916,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  -1837,  -1837,  -1837,
+		 -6487,  -1837,  -1837,      0,      0,      0,    917,     31,
+		   919,      0,    921,      0,      0,      0,    925,      0,
+		 32767,   4801,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  -6470,      0,   2295,
+		     0,  -1830,      0,  -6475,      0,  -1832,      0,      0,
+		 -6480,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   3665,      0,      0,
+		     0,      0,   2281,      0,      0,  -7412,   5769,   5770,
+		  5771,   5772,   5773,   5774,      0,      0,      0,      0,
+		 32767,      0,      0,  32767,  32767,      0,  32767,  32767,
+		     0,      0,  32767,  32767,      0,      0,      0,  -1842,
+		 32767,      0,      0,      0,  -1846,  -1846,  -2560,  -1846,
+		     0,  -2560,  -2559,      0,      0,  32767,      0,  32767,
+		     0,      0,      0,      0,      0,      0,   1388,      0,
+		  1387,   1387,   1387,      0,   1387,   1387,   1387,   1387,
+		  1387,   1387,   1387,   1387,   1387,   1387,   1387,   1387,
+		  1387,   1387,   1387,   1387,   1387,   1387,   1387,   1387,
+		  1387,      0,  -1870,      0,  -1871,      0,      0,      0,
+		     0,      0,      0,  -1877,      0,      0,  -1877,  -1877,
+		     0,      0,      0,   4944,      0,  -1875,   4947,   4948,
+		     0,   4950,   4951,   4952,   4953,   4954,   4955,   4956,
+		  4957,   4958,   4959,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		 32767,  32767,      0,      0,      0,      0,  32767,  32767,
+		 32767,      0,      0,    931,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   4650,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   5375,
+		  5376,   5377,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  13180,      0,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  -4011,    933,  -4011,  32767,
+		   935,    936,  -4012,    938,    939,    940,    941,    942,
+		   943,    944,    945,    946,    947,  32767,   1075,   1076,
+		  1077,  -6334,   1079,   1080,    954,  32767,  32767,  32767,
+		 32767,    955,  32767,  32767,  32767,  32767,  32767,  32767,
+		 -4659,  32767,  32767,  32767,  -4662,  -4662,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,    959,    960,    961,  32767,    962,    963,    964,
+		   965,    966,    967,    968,    969,    970,    971,    972,
+		 32767,    973,    974,    975,    976,    977,    978,    979,
+		   980,    981,    982,    983,    984,    985,    986,    987,
+		   988,    989,    990,  32767,    991,    992,    993,    994,
+		   995,    996,    997,    998,    999,   1000,   1001,   1002,
+		  1003,   1004,   1005,   1006,   1007,   1008,   1009,   1010,
+		  1011,   1012,   1013,   1014,   1015,   1016,   1017,   -362,
+		  -362,  32767,  32767,  32767,  32767,   -410,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1019,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   164,   1021,  -3551,  -3551,   1024,   1025,   1026,   1027,
+		  1028,   1029,   1030,   1031,   1032,   1033,   1034,   1035,
+		  1036,   1037,   1038,   1039,   1040,   1041,   1042,   1043,
+		  1044,   1045,   1046,   1047,   1048,   1049,   1050,   1051,
+		  1052,   1053,   1054,   1055,   1056,   1057,   1058,   1059,
+		  1060,   1061,   1062,   1063,   1064,   1065,   1066,   1067,
+		  1068,   1069,   1070,   1071,   1072,   1073,   1074,   1075,
+		  1076,   1077,   1078,   1079,   1080,   1081,   1082,   1083,
+		  1084,   1085,   1086,   1087,   1088,   1089,   1090,   1091,
+		  1092,   1093,   1094,   1095,   1096,   1097,   1098,   1099,
+		  1100,   1101,   1102,   1103,   1104,   1105,   1106,   1107,
+		  1108,   1109,   1110,   1111,   1112,   1113,   1114,  32767,
+		  1115,   1116,   1117,   1118,   1119,  32767,   1120,   1121,
+		  1122,   1123,   1124,   1125,   1126,   1127,   1128,   1129,
+		  1130,   1131,      0,   1133,   1134,   1135,   1136,   1137,
+		  1138,   1139,   1140,   1141,   1142,   1143,   1144,   1145,
+		  1146,   1147,   1148,   1149,   1150,   1151,   1152,   1153,
+		  1154,   1155,   1156,   1157,   1158,   1159,   1160,   1161,
+		  1162,   1163,   1164,   1165,   1166,   1167,   1168,   1169,
+		  1170,   1171,   1172,   1173,   1174,   1175,   1176,   1177,
+		  1178,   1179,   1180,   1181,   1182,   1183,   1184,   1185,
+		  1186,   1187,   1188,   1189,   1190,   1191,   1192,   1193,
+		  1194,   1195,   1196,   1197,   1198,   1199,   1200,   1201,
+		  1202,   1203,   1204,   1205,   1206,   1207,   1208,   1209,
+		-18956, -15641,   1212,   1213,   1214,   1215,   1216,   1217,
+		  1218,   1219,   1220,   1221,   1222,   1223,   1224,   1225,
+		 -5682,  -5682,  -5682,   1229,   1230,   1231,   1232,   1233,
+		  1234,   1235,   1236,   1237,   1238,   1239,   5750,   5751,
+		  5752,   5753,   5754,   5755,   5756,   1247,   1248,   1249,
+		  1250,   1251,   1252,   3084,   3085,   3086,  16347,  13033,
+		 13034,   9720,   1260,   1261,   1262,   3097,   3098,   3099,
+		  3100,   3101,   1268,   1269,   1270,   1271,   1272,   1273,
+		  1274,   1275,  32767,  32767,  32767,  32767,   1276,   1277,
+		  1278,   1279,   1280,   1281,   1282,   1283,   1284,   1285,
+		  1286,   1287,   1288,   1289,   1290,   1291,   1292,   1293,
+		  1294,   1295,   1296,   1297,   1298,   1299,   1300,   1301,
+		  1302,   1303,   1304,   1305,   1306,   1307,   1308,   1309,
+		  1310,   1311,   1312,   1313,   1314,   1315,   1316,   1317,
+		  1318,   1319,   1320,   1321,   1322,   1323,   1324,   1325,
+		  1326,   1327,   1328,   1329,   1330,   1331,   1332,   1333,
+		  1334,   1335,   1336,   1337,   1338,   1339,   1340,   1341,
+		  1342,   3162,   4959,      0,   4962,   1347,   1348,   1349,
+		  1350,   1351,   1352,   1353,   1354,   1355,   1356,   1357,
+		  1358,   1359,   1360,   1361,   1362,   1363,   1364,   1365,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   7481,
+		  7482,   7483,   7484,   5053,   5009,   7487,   7488,   7489,
+		  7490,  20751,  17437,  17438,  14124,  14125,  10811,  10812,
+		  7498,   7499,   7500,   7501,   7502,  32767,  32767,   7548,
+		  7549,   7505,   7506,   7507,   7508,  32767,  32767,   7554,
+		  7555,   7511,   4857,   4857,   4857,   4857,   2427,   4857,
+		  4857,   7564,   4857,   7566,  13524,   7568,  13526,   7570,
+		  4259,   4260,   4261,  -5479,    524,   6481,   4263,   7578,
+		  4264,   2684,   1421,  -7842,  -4527,  -4527,  -1212,  -1212,
+		 -1212,  -1212,  -1212,   7545,   7546,      0,      0,  -1214,
+		 -1214,  -1214,  -1214,   7551,   7552,  32767,   1610,  -1216,
+		  1439,   1440,   1441,   1442,   3873,   1444,   1445,  32767,
+		  1446,  32767,  -7220,  32767,  -7221,      0,   2047,   2047,
+		  2047,  11788,   5786,   -170,   2049,  -1265,   2050,   3631,
+		 -1265,   2052,   2052,   2052,   2052,   2052,   2052,   2052,
+		  1455,   2052,   2052,  -1265,   2053,  -1265,   2054,  -1265,
+		 -1265,   2056,   7592,   7593,   7594,  32767,  32767,   7595,
+		  7596,   1482,   1483,   1484,  -1267,  -1267,  -1267,   1488,
+		  1489,   1490,   1491,   1492,   1493,   1494,   1495,   1496,
+		  1497,   1498,   1499,   1500,  -4746,  -4746,   1503,   1504,
+		  1505,   1506,   1507,   1508,   1509,   1510,   1511,   1512,
+		  1513,   1514,      0,  -3228,  -3228,   1518,   1519,   1520,
+		  1521,   1522,   1523,   1524,   1525,  -2364,  -2363,   1528,
+		  1529,  -2361,  -2360,   3578,      0,  -2357,  -2356,  -2355,
+		  5932,  -2824,  -2824,   5980,   5981,   5937,   -231,   -230,
+		  -229,  -2827,  -2827,   5985,   -225,   5941,   5942,  -1069,
+		  1534,   5899,   5946,   5947,   5948,   5949,   5950,  -1061,
+		 -1060,      0,  -2785,      0,   -355,   -355,   -310,   -310,
+		  -310,   9422,  -2791,  32767,  -1054,  -1053,  -1052,  -4786,
+		 -4786,  -4786,  -4786,  -4786,  -4786,  -4786,  -1044,   5969,
+		  5970,  -2833,   6938,   6939,  -2790,  -2790,   6942,      0,
+		 32767,   4607,   -923,   6945,  32767,   5173,   5174,   5175,
+		  5176,   2589,   1595,   1596,  11396,  11352,  32767,  32767,
+		  6126,   2812,   2813,   2814,   2815,   2816,  -5940,  -5940,
+		  1607,   1608,   2823,  32767,  32767,   1516,      0,  -8581,
+		     0,      0,    728,   1525,    163, -11068,      0,  -2262,
+		 -2306,  -2305,  32767,  32767,      0,      0,   1580,      0,
+		     0,      0,  -6443,   1685, -10176,  -4173,   1784,  -4173,
+		     0,  -4172,   5925,  -4171,  -4171,  -4171,      0,   -437,
+		     0,      0,      0,    161,   -435,      0,   2883,   -434,
+		     0,      0,      0,      0,   -436,      0,  -5972,      0,
+		     0,      0,      0,      0,      0,      0,      0,   2889,
+		  2890,   2891,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,   6371,
+		     0,      0,      0,      0,      0,      0,      0,    117,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,      0,      0,   3991,   3991,
+		  3991,   3991,      0,   3990,   3990,   3990,  -1947,   1632,
+		  3990,   3990,   3990,  -4296,   4461,   4462,  -4341,  -4341,
+		 -4296,   1873,   1873,   1873,   4472,   4473,  -4338,   1873,
+		 -4292,  -4292,   2720,    118,  -4246,  -4292,  -4292,    117,
+		 -4293,  -4293,   2719,   2719,   1660,   4446,   1662,   2018,
+		  2019,   1975,   1976,   1977,  -7754,  -7754,  -8733,  -5418,
+		   113,      0,    112,  -2157,  -5891,  -5891,      0,  -5892,
+		  6455,  -5893,      0,      0,      0,  32767,  32767,  32767,
+		  5826,  32767,  32767,  32767,  32767,   6806,  32767,  -2039,
+		 32767,   5829,  32767,   5830,   5831,   5832,  32767,   5833,
+		  5834,  32767,   5835,  32767,  32767,  -3520,      0,   5837,
+		     0,   5838,      0,   4035,      0,   5840,  32767,  10251,
+		   154,   1671,  10253,   1673,   1674,    947,    151,   1514,
+		 12746,   1679,   3942,   3987,   3987,   3987,  13719,  13720,
+		 14700,    103,   5855,  13723,   5857,   8127,      0,  11862,
+		  5860,    -96,   5862,   1690,   5863,  -4233,   5864,   5865,
+		  5866,   5867,   5868,   5869,   5870,   5871,   5872,   5873,
+		 32767,   5874,   5875,   5876,   5877,   5878,   5879,   5880,
+		  5881,   5882,   5883,  13795,   5885,   5886,   5887,   5888,
+		 10489,   5890,   1703,   1704,  -4247,   1706,   1707,   5891,
+		  5892,   5893,   1711,   4098,   5895,   5896,   5897,   7650,
+		 32767,   5899,   6406,   7966,   5902,   5903,   5904,   5905,
+		  5906,   5907,   5908,   1800,   5910,   1801,   5912,   5913,
+		  5914,   5915,  32767,   1727,   1728,   1729,   1730,  32767,
+		  1731,   1732,   1733,  32767,   1734,   1735,   1736,   1737,
+		  1738,   1739,   1740,  32767,   1741,   1742,   1743,   1744,
+		  1745,   1746,  32767,  32767,  32767,  32767,   1747,   1748,
+		  1749,   1750,   1751,  32767,  32767,  32767,  32767,  32767,
+		 32767,   1752,   1753,   1754,   1755,   1756,   1757,   1758,
+		  1759,   1760,   1761,   1762,   1763,   1764,   1765,   1766,
+		  1767,   1768,   1769,   1770,   1771,   1772,   1773,   1774,
+		  1775,   1776,   1777,   1778,   1779,   1780,   1781,   1782,
+		  1783,   1784,   1785,   1786,   1787,   1788,   1789,   1790,
+		  1791,   7729,   4151,   1794,   1795,   1796,  10083,   1327,
+		  1327,  10131,  10132,  10088,   3920,   3921,   3922,   1324,
+		  1324,  10136,   3926,  10092,  10093,   3082,   5685,  10050,
+		 10097,      0,   5689,  10100,   5691,   3089,    796,      0,
+		  1363,  12595,   3792,   3792,   3837,   3837,   3837,  13569,
+		 13570,  14550,  11236,   5706,  13574,   5708,   7978,  11713,
+		 11714,  11715,  11716,  11717,  11718,  11719,   7978,    966,
+		   966,   9770,      0,      0,   9730,   9731,      0,      0,
+		  -979,   2336,   7867,      0,      0,  32767,      0,      0,
+		     0,  32767,      0,      0,  32767,      0,  32767,  32767,
+		  9356,  32767,      0,  32767,      0,  32767,   1804,   2602,
+		     0,  -4364,  -4410,   5688,      0,  -4410,      0,   2603,
+		  4897,   5694,   4332,  -6899,   1905,   1906,   1862,   1863,
+		  1864,  -7867,  -7867,  -8846,  -5531,      0,  -7867,      0,
+		 -2269,  -6003,  -6003,      0,   5957,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  -7911,      0,
+		     0,      0,      0,  -4600,      0,      0,   4156,  32767,
+		 32767,      0,      0,      0,      0,      0,   1796,      0,
+		     0,      0,  -1752,      0,      0,   -506,  -2065,      0,
+		     0,      0,      0,      0,      0,      0,   4109,      0,
+		  4110,      0,      0,      0,      0,      0,   4111,  17372,
+		     0,  14058,  10744,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,  -4650,      0,      0,   4161,  32767,
+		 32767,   4117,  32767,   4118,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -7946,  32767,  -4632,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4642,
+		 -4642,   4123,   4124,  -4687,      0,      0,  -4644,  -4644,
+		     0,      0,  -4646,  -4646,  32767,  32767,  32767,  32767,
+		 32767,  32767,   4084,   4085,  32767,  32767,   1609,   4087,
+		 32767,  32767,   4088,  17349,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  10092,   4136,
+		 10094,   4138,  10096,      0,  10097,  10098,  10099,  10100,
+		 10101,      0,  32767,  32767,  32767,      0,      0,      0,
+		     0,      0,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,      0,      0,      0,      0,
+		     0,      0,      0,  32767,  32767,      0,  10138,  10139,
+		     0,      0,      0,  10145,  32767,  32767,  32767,  32767,
+		 32767,  32767,  -1425,   8316,   2314,  -3642,  32767,      0,
+		 32767,  32767,  32767,  32767,  -1426,  -1426,  -1426,  -1426,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,     52,     52,     52,     52,     52,
+		     0,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1849,   1850,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		   100,    101,    102,    103,    104,    105,    106,    107,
+		   108,  -5633,  -5633,  -5633,  -5633,  -5633,  -5633,  -5633,
+		 -5633,  -5633,  -5633,  -5633,  -5633,  -5633,  -5633,  -5633,
+		 -5633,   1985,   1986,    127,   2030,   2031,   2032,  -5034,
+		 32767,  32767,  32767,  32767,  32767,      0,  32767,  32767,
+		 32767,   5916,   5917,   5918,   5919,   5920,   5921,   5922,
+		  5923,   5924,   8824,   5926,  32767,  32767,      0,  32767,
+		     0,   5927,   5928,   5929,   5930,   5931,   5932,   5933,
+		  5934,   5935,   5936,   5937,   5938,   5939,   5940,   5105,
+		  5942,   5943,   5944,   5945,   5946,   5947,   5948,   5949,
+		  5950,   5951,   5952,   5953,   5954,   5955,   5956,   5957,
+		 32767,   5958,   5959,   5960,   5082,   5082,   5082,   5082,
+		  5082,   5082,   5082,   5082,   5969,   5970,   5084,   5972,
+		  5053,   5974,   5053,   5053,   5053,   5978,   5979,   5980,
+		  5981,   5982,   5983,   5984,   5985,   5986,   5987,   5988,
+		  5989,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2552,  32767,  32767,  32767,
+		 32767,  32767,  32767,   5990,   5991,   5992,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   5993,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,   6936,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   1851,   1852,   1853,   1854,
+		  1855,   1856,   1857,   1858,   1859,   1860,   1861,   1862,
+		  1863,   1864,   1200,   2121,   1200,   1868,   1869,   1870,
+		  1871,   1872,   1873,   1874,   1875,   1876,   1877,   1878,
+		  1879,   1880,   1188,   1188,   1188,   1188,   1188,   1188,
+		  1188,   1188,   1188,   1188,   1188,   1188,   1188,   1188,
+		  1188,   1188,   1188,   1188,   1188,   1188,  -5282,   1188,
+		  3483,   1188,   -642,   1188,  -5287,   1188,   -644,   1188,
+		  1188,  -5292,   1188,   1188,   1188,   1188,   1188,   1188,
+		  1188,   1188,   1188,   1188,   1188,   1188,   1925,   1926,
+		 -6187,  -6231,   1184,   3465,   1184,   1184,  -6228,   6953,
+		  6954,   6955,   6956,      0,   1939,   1940,   1941,   1942,
+		  1943,   1944,   1178,   1178,   1947,   1948,   1949,   1950,
+		  1951,   1952,   1953,   1954,   1955,   1956,   1957,   1958,
+		  1959,   1960,   1961,   1962,   1963,   1964,   1965,   1966,
+		  1967,   1968,   1969,   1970,   1971,   1972,   1973,   1974,
+		  1975,   1976,   1977,   1978,   1979,   1980,   1981,   1982,
+		  1983,   1984,   1985,   1986,   1987,   1988,   1989,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,      0,      0,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,    709,    666,    667,    668,  32767,    669,
+		   714,    715,    716,    717,  -6694,    719,    720,    721,
+		 32767,    722,    723,    724,  32767,    725,    726,    727,
+		   728,  -5013,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   6052,      0,      0,   6055,
+		     0,      0,      0,      0,   2293,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,   1244,   1245,   1246,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  -4660,
+		 -4660,  -4660,  -4660,   4097,   4098,  -4705,  -4705,  -4660,
+		 -4660,  -4660,  -4660,   4105,   4106,  -4705,  32767,  -4661,
+		 -4661,  -4661,  -4617,  -4617,  -4663,  -4663,  -4663,  -4663,
+		 -4663,  -4663,  -4663,   4072,   4073,   4074,   4075,   1644,
+		  1600,   4078,   4079,   4080,   4081,  17342,  14028,  14029,
+		 10715,  10716,   7402,   7403,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,      0,      0,
+		     0,  32767,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,  32767,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		 32767,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   1380,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,      0,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,    856,      0,   4573,
+		  4574,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  32767,      0,      0,      0,
+		     0,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		  5204,   5161,   5162,   5163,   5164,   5165,   5210,   5211,
+		  5212,   5213,  -2198,   5215,   5216,   5217,   5218,   5219,
+		  5220,   5221,   5222,   5223,   5224,   5225,   5226,   -515,
+		  -515,   -515,   -515,   -515,   -515,   -515,   -515,   -515,
+		  -515,   -515,   -515,   -515,   -515,   -515,   -515,   7103,
+		  7104,   5245,   5246,   5247,   5248,   5249,  -1014,   5251,
+		  5252,   5253,   5254,   5255,   5256,   5257,   5258,   5259,
+		  5260,   8663,   8664,    -92,    -92,   8712,   8713,   8669,
+		  8670,   8671,   8672,    -92,    -92,   8720,   8721,   8677,
+		  8678,   8679,   8636,   8637,   8684,   8685,   8686,   8687,
+		  8688,   8689,   8690,    -44,    -44,    -44,    -44,   2388,
+		  2433,    -44,    -44,    -44,    -44, -13304,  -9989,  -9989,
+		 -6674,  -6674,  -3359,  -3359,    -44,    -44,    -44,    -44,
+		   -44,   8713,   8714,    -89,    -89,    -44,    -44,    -44,
+		   -44,   8721,   8722,    -89,    -89,    -44,    -44,    -44,
+		     0,      0,    -46,    -46,    -46,    -46,    -46,    -46,
+		   -46,   8689,   8690,   8691,   8692,   6261,   6217,   8695,
+		  8696,   8697,   8698,  21959,  18645,  18646,  15332,  15333,
+		 12019,  12020,   8706,   8707,   8708,   8709,   8710,    -46,
+		   -46,   8758,   8759,   8715,   8716,   8717,   8718,    -46,
+		   -46,   8766,   8767,   8723,   8724,   8725,   8726,   8727,
+		  8728,   8729,   8730,   8731,   8732,   8733,   8734,      0,
+		     0,      0,      0,   2432,   2477,      0,      0,      0,
+		     0, -13260,  -9945,  -9945,  -6630,  -6630,  -3315,  -3315,
+		     0,      0,      0,      0,      0,   8757,   8758,    -45,
+		   -45,      0,      0,      0,      0,   8765,   8766,    -45,
+		   -45,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,   8735,   8736,   8737,
+		  8738,   6307,   6263,   8741,   8742,   8743,   8744,  22005,
+		 18691,  18692,  15378,  15379,  12065,  12066,   8752,   8753,
+		  8754,   8755,   8756,      0,      0,   8804,   8805,   8761,
+		  8762,   8763,   8764,      0,      0,   8812,   8813,   8769,
+		  6115,   6115,   6115,   6115,   3685,   6115,   6115,   8822,
+		  6115,   8824,  14782,   8826,  14784,   8828,   5517,   5518,
+		  5519,  -4221,   1782,   7739,   5521,   8836,   5522,   3942,
+		  8839,   5523,   5524,   5525,   5526,   5527,   5528,   5529,
+		  6127,   5531,   5532,   8850,   5533,   8852,   5534,   8854,
+		  8855,   5535,      0,      0,      0,   8860,   8861,      0,
+		     0,      0,  13252,   9939,   9939,   6626,   6626,   3313,
+		  3313,      0,      0,      0,  -9269,  -3312,      0,      0,
+		     0,   9741,  32767,  32767,      0,  32767,      0,  32767,
+		 32767,      0,      0,      0,      0,      0,      0,      0,
+		  -597,      0,      0,  32767,      0,  32767,      0,  32767,
+		 32767,      0,      0,  32767,  32767,  32767,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,  32767,  32767,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,  -1387,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  -1773,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,      0,
+		     0,      0,      0,      0,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  -4161,   1581,   1582,  32767,  32767,   1990,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,      0,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,   1539,  32767,  32767,   6150,   6151,   6152,    411,
+		   411,    411,    411,    411,    411,    411,    411,    411,
+		   411,    411,    411,    411,    411,    411,    411,   8029,
+		  8030,   6171,   6172,    969,    969,   1013,   1013,   1013,
+		  1013,   1013,    969,    969,    969,    969,   8381,    969,
+		   969,    969,    969,    969,    969,    969,    969,    969,
+		   969,    969,    969,   6711,   6712,   6713,   6714,   6715,
+		  6716,   6717,   6718,   6719,   6720,   6721,   6722,   6723,
+		  6724,   6725,   6726,   -891,   -891,    969,    969,   6173,
+		  6174,   6131,   6132,   6133,   6134,   6135,   6180,   6181,
+		  6182,   6183,  -1228,   6185,   6186,   6187,   6188,   6189,
+		  6190,   6191,   6192,   6193,   6194,   6195,   6196,    455,
+		   455,    455,    455,    455,    455,    455,    455,    455,
+		   455,    455,    455,    455,    455,    455,    455,   8073,
+		  8074,   6215,   6216,   1013,   1013,   1057,   1057,   1057,
+		  1057,   1057,   1013,   1013,   1013,   1013,   8425,   1013,
+		  1013,   1013,   1013,   1013,   1013,   1013,   1013,   1013,
+		  1013,   1013,   1013,   6755,   6756,   6757,   6758,   6759,
+		  6760,   6761,   6762,   6763,   6764,   6765,   6766,   6767,
+		  6768,   6769,   6770,   -847,   -847,   1013,   1013,   6217,
+		  6218,   6175,   6176,   6177,   6178,   6179,   6224,   6225,
+		  6226,   6227,  -1184,   6229,   6230,   6231,   6232,   6233,
+		  6234,   6235,   6236,   6237,   6238,   6239,   6240,    499,
+		   499,    499,    499,    499,    499,    499,    499,    499,
+		   499,    499,    499,    499,    499,    499,    499,   8117,
+		  8118,   6259,   6260,   6261,   6262,   6263,      0,   6265,
+		  6266,   6267,   6268,   6269,   6270,   6271,   6272,   6273,
+		  6274,   9677,   9678,    922,    922,   9726,   9727,   9683,
+		  9684,   9685,   9686,    922,    922,   9734,   9735,   9691,
+		  9692,   9693,   9650,   9651,   9698,   9699,   9700,   9701,
+		  9702,   9703,   9704,    970,    970,    970,    970,   3402,
+		  3447,    970,    970,    970,    970, -12290,  -8975,  -8975,
+		 -5660,  -5660,  -2345,  -2345,  -2345,  -2345,  -2345,   6412,
+		  6413,  -2390,  -2390,  -2345,  -2345,  -2345,  -2345,   6420,
+		  6421,  -2390,  -2390,  -2345,  -2345,  -2345,  -2301,  -2301,
+		 -2347,  -2347,  -2347,  -2347,  -2347,  -2347,  -2347,   6388,
+		  6389,   6390,   6391,   3960,   3916,   6394,   6395,   6396,
+		  6397,  19658,  16344,  16345,  13031,  13032,   9718,   9719,
+		  6405,   6406,   6407,   6408,   6409,  -2347,  -2347,   6457,
+		  6458,   6414,   6415,   6416,   6417,  -2347,  -2347,   6465,
+		  6466,   6422,   6423,   6424,   6381,   6382,   6429,   6430,
+		  6431,   6432,   6433,   6434,   6435,  -2299,  -2299,  -2299,
+		 -2299,    133,    178,  -2299,  -2299,  -2299,  -2299, -15559,
+		-12244, -12244,  -8929,  -8929,  -5614,  -5614,  -2299,  -2299,
+		 -2299,  -2299,  -2299,   6458,   6459,  -2344,  -2344,  -2299,
+		 -2299,  -2299,  -2299,   6466,   6467,  -2344,  -2344,  -2299,
+		 -2299,  -2299,  -2299,  -2299,  -2299,  -2299,  -2299,  -2299,
+		 -2299,  -2299,  -2299,   6436,   6437,   6438,   6439,   4008,
+		  3964,   6442,   6443,   6444,   6445,  19706,  16392,  16393,
+		 13079,  13080,   9766,   9767,   6453,   6454,   6455,   6456,
+		  6457,  -2299,  -2299,   6505,   6506,   6462,   6463,   6464,
+		  6465,  -2299,  -2299,   6513,   6514,   6470,   6471,   6472,
+		  6473,   6474,   6475,   6476,   6477,   6478,   6479,   6480,
+		  6481,  -2253,  -2253,  -2253,  -2253,    179,    224,  -2253,
+		 -2253,  -2253,  -2253, -15513, -12198, -12198,  -8883,  -8883,
+		 -5568,  -5568,  -2253,  -2253,  -2253,  -2253,  -2253,   6504,
+		  6505,  -2298,  -2298,  -2253,  -2253,  -2253,  -2253,   6512,
+		  6513,  -2298,  -2298,  -2253,    402,    403,    404,    405,
+		  2836,    407,    408,  -2298,    410,  -2298,  -8255,  -2298,
+		 -8255,  -2298,   1014,   1014,   1014,  10755,   4753,  -1203,
+		  1016,  -2298,   1017,   2598,  -2298,   1019,   1019,   1019,
+		  1019,   1019,   1019,   1019,    422,   1019,   1019,  -2298,
+		  1020,  -2298,   1021,  -2298,  -2298,   1023,   6559,   6560,
+		  6561,  -2298,  -2298,   6564,   6565,   6566,  -6685,  -3371,
+		 -3370,    -56,    -55,   3259,   3260,   3261,  12531,   6575,
+		  3264,   3265,   3266,  -6474,   -471,   5486,   3268,   6583,
+		  3269,   1689,   6586,   3270,   3271,   3272,   3273,   3274,
+		  3275,   3276,   3874,   3278,   3279,   6597,   3280,   6599,
+		  3281,   6601,   6602,   3282,   3283,  32767,  32767,  32767,
+		  3284,   3285,   3286,   3287,   3288,   3289,   3290,   3291,
+		  3292,   3293,   3294,   3295,   3296,   3297,   3298,   3299,
+		  3300,   3301,   3302,   3303,   3304,   3305,   3306,   3307,
+		  3308,   3309,   3310,   3311,   3312,   3313,   3314,   3315,
+		  3316,   3317,   3318,   3319,   3320,   3321,   3322,   3323,
+		  3324,   3325,   3326,   3327,   3328,   3329,   3330,   3331,
+		  3332,   3333,   3334,   3335,   3336,   3337,   3338,   3339,
+		  3340,   3341,   3342,   3343,   3344,   3345,   3346,   3347,
+		  3348,   3349,   3350,   3351,  32767,  32767,   3352,   3353,
+		  3354,   3355,   3356,   3357,   3358,   3359,   3360,   3361,
+		  3362,   3363,   3364,   3365,   3366,   3367,   3368,   3369,
+		  3370,   3371,   3372,   3373,   3374,   3375,   3376,   3377,
+		  3378,   3379,   3380,   3381,   3382,   3383,   3384,   3385,
+		  3386,   3387,   3388,   3389,   3390,   3391,   3392,   3393,
+		  3394,   3395,   3396,   3397,   3398,   3399,   3400,   3401,
+		  3402,   3403,   3404,   3405,   3406,   3407,   4795,   3409,
+		  3410,   3411,   3412,   3413,   3414,   3415,   3416,   3417,
+		  3418,   3419,   3420,   3421,   3422,   3423,   3424,   3425,
+		  3426,   3427,   3428,   3429,   3430,   3431,   3432,   3433,
+		  3434,   3435,   3436,   3437,   3438,   3439,   3440,   3441,
+		  3442,   3443,   3444,   3445,   3446,   3447,   3448,   3449,
+		  3450,   3451,   3452,   3453,   3454,   3455,   3456,   3457,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,   3458,
+		  3459,   3460,   3461,   3462,  -8139,   3464,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,   3465,   3466,   2001,   3468,   3469,  32767,
+		 32767,  32767,  32767,  32767,   3470,   3471,   3472,   3473,
+		  3474,   3475,   3476,   3477,   3478,   3479,   3480,   3481,
+		  3482,   3483,   3484,   3485,   3486,   3487,   3488,   3489,
+		  3490,   3491,   3492,   3493,   3494,   3495,  32767,   3496,
+		  3497,   3498,   3499,   3500,  32767,   3501,  32767,   3502,
+		  3503,  32767,   3504,   3505,  32767,   3506,      0,      0,
+		  3509,   3510,   3511,   3512,   3513,   3514,   3515,   3516,
+		  3517,   3518,   3519,   3520,   3521,   3522,   3523,   3524,
+		  3525,   3526,   3527,   3528,   3529,   3530,   3531,   3532,
+		  3533,   3534,   3535,   3536,   3537,   3538,   3539,   3540,
+		  3541,   3542,   3543,   3544,   3545,   1902,   1902,   1902,
+		  1902,   9314,   1902,   1902,   1902,   1902,   1902,   1902,
+		  1902,   1902,   1902,   1902,   1902,   1902,   7644,   7645,
+		  7646,   7647,   7648,   7649,   7650,   7651,   7652,   7653,
+		  7654,   7655,   7656,   7657,   7658,   7659,     42,     42,
+		  1902,      0,      0,      0,   7067,   7068,   7069,   7070,
+		  7071,   7116,   7117,   7118,   7119,   -292,   7121,   7122,
+		  7123,   7124,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,   3614,   3615,   3616,  10892,   3618,   3619,
+		 10854,   3621,   3622,   3623,   3624,   3625,   8994,  -2751,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   3640,   3641,   2783,  -3331,
+		 -3330,   3645,   3646,      0,   6053,   6054,      0,   6056,
+		  6057,   6058,   6059,   3767,   6061,   6858,      0,      0,
+		  3659,      0,      0,   1531,   1531,   1531,   1531,   1531,
+		  1531,   1531,   1531,   1531,   1531,   1531,   1531,   1531,
+		  1531,   1531,   9149,   9150,   7291,   7292,   7293,   7294,
+		  7295,   1032,   7297,   7298,   7299,   7300,   7301,   7302,
+		  7303,   7304,      0,   7307,  10710,  10711,   1955,   1955,
+		 10759,  10760,  10716,   4548,   4549,   4550,   1952,   1952,
+		 10764,  10765,  10721,  10722,   3711,   6314,  10679,  10726,
+		 10727,  10728,  10729,  10730,   3719,   3720,   1996,   1996,
+		  1996,   1996,   4428,   4473,   4473,   3728,   1994,   1994,
+		-11266,   3732,   3733,   3734,      0,      0,      0,      0,
+		     0,      0,      0,   3742,  10755,  10756,   1953,   1953,
+		  1998,   1998,   1998,  11730,  11731,  12711,   9397,   3867,
+		 11735,   3869,   6139,   9874,   9875,   9876,   9877,   9878,
+		  9879,   9880,   6139,   -873,   -873,   7931,  -1839,  -1839,
+		  7891,   7892,  -1839,  -1839,  -2818,    497,   6028,  -1839,
+		 -1839,    -66,    -66,    -66,    -66,   2522,   2523,  -6280,
+		 -6280,  -6235,    -66,    -66,    -66,   2533,   2534,  -6277,
+		   -66,  -6231,  -6231,    781,  -1821,  -6185,  -6231,   3867,
+		 -1821,  -6231,  -1821,    782,   3076,   3873,   2511,  -8720,
+		    84,     85,     41,     42,     43,  -9688,  -9688, -10667,
+		 -7352,  -1821,  -9688,  -1821,  -4090,  -7824,  -7824,  -7824,
+		 -7824,  -7824,  -7824,  -7824,  -4082,   2931,   2932,  -5871,
+		  3900,   3901,  -5828,  -5828,   3904,   3905,   4885,   1571,
+		 -3959,   3909,   3910,   2138,   2139,   2140,   2141,   -446,
+		  -446,   8358,   8359,   8315,   2147,   2148,   2149,   -449,
+		  -449,   8363,   2153,   8319,   8320,   1309,   3912,   8277,
+		  8324,  -1773,   3916,   8327,   3918,   1316,   -977,  -1773,
+		  -410,  10822,   2019,   2019,   2064,   2064,   2064,  11796,
+		 11797,  12777,   9463,   3933,  11801,   3935,   6205,   9940,
+		  9941,   9942,   9943,   9944,   9945,   9946,   6205,   -807,
+		  -807,   7997,  -1773,  -1773,   7957,   7958,  -1773,  -1773,
+		 -2752,    563,   6094,  -1773,  -1773,      0,      0,      0,
+		     0,   2588,   2589,  -6214,  -6214,  -6169,      0,      0,
+		     0,   2599,   2600,  -6211,      0,  -6165,  -6165,    847,
+		 -1755,  -6119,  -6165,   3933,  -1755,  -6165,  -1755,    848,
+		  3142,   3939,   2577,  -8654,    150,    151,    107,    108,
+		   109,  -9622,  -9622, -10601,  -7286,  -1755,  -9622,  -1755,
+		 -4024,  -7758,  -7758,  -7758,  -7758,  -7758,  -7758,  -7758,
+		 -4016,   2997,   2998,  -5805,   3966,   3967,  -5762,  -5762,
+		  3970,   3971,   4951,   1637,  -3893,   3975,   3976,   2204,
+		  2205,   2206,   2207,   -380,   -380,   8424,   8425,   8381,
+		  2213,   2214,   2215,   -383,   -383,   8429,   2219,   8385,
+		  8386,   1375,   3978,   8343,   8390,  -1707,   3982,   8393,
+		  3984,   1382,   -911,  -1707,   -344,  10888,   2085,   2085,
+		  2130,   2130,   2130,  11862,  11863,  12843,   9529,   3999,
+		 11867,   4001,   6271,  10006,  10007,   4005,  -1951,   4007,
+		  4008,   4009,   4010,   4011,   4012,   4013,   4014,   4015,
+		  4016,   4017,   4018,   4019,   4020,   4021,   4022,   4023,
+		  4024,   4025,   4026,   4027,   4028,   4029,   4030,   4031,
+		 11943,   4033,   4034,   4035,   4036,   8637,   4038,   4039,
+		  -116,  32767,  32767,   4041,   4042,   4043,   4044,   4045,
+		  2250,   4047,   4048,   4049,   5802,   4051,   4052,   4559,
+		  6119,   4055,   4056,   4057,   4058,   4059,   4060,   4061,
+		   -47,   4063,    -46,   4065,   4066,   4067,   4068,   4069,
+		   -41, -13301,   4072,  -9985,  -6670,   4075,   4076,   4077,
+		  4078,   4079,   4080,   4081,   4082,   4083,   4084,   4085,
+		  4086,   4087,   4088,   4089,   4090,   8741,   4092,   4093,
+		   -67,  32767,  32767,  32767,  32767,  32767,   2257,  32767,
+		  2258,   2259,   2260,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,  32767,  32767,  32767,  32767,
+		 32767,  32767,  32767,  32767,   2261,  32767,   2262,  32767,
+		  2263,  32767,   2264,  32767,   2265,  32767,   2266,  32767,
+		  2267,   8737,   8738,    -26,    -26,   8786,   4100,   4101,
+		  8746,   8747,   4104,   4105,   8752,   8753,  32767,   2274,
+		 32767,   2275,  32767,  32767,  32767,  32767,  32767,  32767,
+		  2276,   2277,  32767,   2278,   2279,  32767,   2280,      0,
+		 32767,   2282,   9695,   4109,  -3486,  -3486,   4112,   4113,
+		  4114,   4115,   4116,   4117,  32767,  32767,  32767,  32767,
+		 32767,  32767,   4118,   4119,   4120,   4121,   4122,   4123,
+		  4124,   4125,   4126,   4127,   4128,   4129,   4130,   4131,
+		  4132,   4133,   4134,   4849,   4136,   4137,   4851,   4851,
+		  4140,   4852,   4142,   4143,   4144,   4145,   4146,   4147,
+		  4148,   4149,   4150,   4151,   2293,   4153,    907,  32767,
+		  2295,   4155,    909,   4157,    910,   4159,    911,   4161,
+		   912,   4163,    913,   4165,    914,  32767,    915,   4168,
+		   916,   4170,    917,   4172,   4173,    918,   4175,   4176,
+		  4177,   4178,   4179,   4180,   4181,   4182,   4183,   4184,
+		  4185,   2309,   4186,   4187,   4188,   4189,   2312,   2313,
+		 32767,   2314,   4190,   4191,  -2632,   2317,   4193,  32767,
+		  4194,   4195,   4196,   4197,   4198,   4199,   4200,   4201,
+		  4202,   4203,   4204,   4205,   4206,      0,      0,   4209,
+		  4210,   4211,   4212,   4213,   2318,   4215,   4216,   2319,
+		  2320,   2321,   2322,   4221,   4222,   4223,   2323,   2324,
+		  4226,   4227,   4228,   4229,   4230,   4231,   5551,   4233,
+		  4234,   4235,   4236,   4237,   4238,   4239,   4240,   4241,
+		  4242,   4243,   4244,   4245,   4246,   4247,   4248,   4249,
+		  4250,   4251,   4252,   4253,   4254,   4255,   4256,   4257,
+		  4258,   4259,   4260,   4261,   4262,   4263,   4264,   4265,
+		  4266,   4267,   4268,   4269,   4270,   4271,   4272,   4273,
+		  4274,   4275,  -3342,  -3342,  -3342,   4276,   4277,   2418,
+		  2419,  -2784,  -2784,  -2740,  -2740,  -2740,  -2740,  -2740,
+		 -2784,  -2784,  -2784,  -2784,   4628,  -2784,  -2784,  -2784,
+		 -2784,  -2784,  -2784,  -2784,  -2784,  -2784,  -2784,  -2784,
+		 -2784,   2958,   2959,   2960,   2961,   2962,   2963,   2964,
+		  2965,   2966,   2967,   2968,   2969,   2970,   2971,   2972,
+		  2973,  -4644,  -4644,  -2784,  -2784,   2420,   2421,   2378,
+		  2379,   2380,   2381,   2382,   2427,   2428,   2429,   2430,
+		 -4981,   2432,   2433,   2434,   2435,   2436,   2437,   2438,
+		  2439,   2440,   2441,   2442,   2443,  -3298,  -3298,  -3298,
+		 -3298,  -3298,  -3298,  -3298,  -3298,  -3298,  -3298,  -3298,
+		 -3298,  -3298,  -3298,  -3298,  -3298,   4320,   4321,   2462,
+		  4365,   4366,   4367,  -2699,  -2699,  -2699,  -2699,  -2699,
+		 -2743,  -2743,  -2743,  -2743,   4669,  -2743,  -2743,  -2743,
+		 -2743,   4382,   4383,   4384,   4385,   4386,   4387,   4388,
+		  4389,   4390,   4391,   4392,   4393,   4394,   4395,   4396,
+		  4397,   4398,   4399,   4400,   4401,   4402,   4403,   4404,
+		  4405,   4406,   4407,   4408,   4409,   4410,   4411,   4412,
+		  4413,   4414,   4415,   4416,   4417,   4418,   4419,   4420,
+		  4421,   4422,   4423,   4424,   4425,   4426,   4427,   4428,
+		  4429,    816,    816,    816,  -6459,    816,    816,  -6418,
+		   816,    816,    816,    816,    816,  -4552,   7194,   4444,
+		  4445,   4446,   4447,   4448,   4449,   4450,   4451,   4452,
+		  4453,   4454,   4455,    816,    816,   1675,   7790,   7790,
+		   816,    816,   4463,  -1589,  -1589,   4466,  -1589,  -1589,
+		 -1589,  -1589,    704,  -1589,  -2385,   4474,   4475,    817,
+		  4477,   4478,   2948,   2949,   2950,   2951,   2952,   2953,
+		  2954,   2955,   2956,   2957,   2958,   2959,   2960,   2961,
+		  2962,  -4655,  -4655,  -2795,  -2795,  -2795,  -2795,  -2795,
+		  3469,  -2795,  -2795,  -2795,  -2795,  -2795,  -2795,  -2795,
+		 -2795,   4510,  -2796,  -6198,  -6198,   2559,   2560,  -6243,
+		 -6243,  -6198,  -6198,  -6198,  -6198,   2567,   2568,  -6243,
+		 -6243,  -6198,  -6198,  -6198,  -6154,  -6154,  -6200,  -6200,
+		 -6200,  -6200,  -6200,  -6200,  -6200,   2535,   2536,   2537,
+		  2538,    107,     63,   2541,   2542,   2543,   2544,  15805,
+		 12491,  12492,  32767,   4540,   4541,   4542,   4543,   4544,
+		  4545,   4546,   2548,  -6208,  -6208,   2596,   2597,   2553,
+		  2554,   2555,   2556,  -6208,  -6208,   2604,   2605,   2561,
+		  2562,   2563,   2520,   2521,   2568,   2569,   2570,   2571,
+		  2572,   2573,   2574,  -6160,  -6160,  -6160,  -6160,  -3728,
+		 -3683,  -6160,  -6160,  -6160,  -6160, -19420, -16105, -16105,
+		-12790, -12790,  -9475,  -9475,  -6160,  -6160,  -6160,  -6160,
+		 -6160,  32767,   2597,  -6206,  -6206,  -6161,  -6161,  -6161,
+		 -6161,   2604,   2605,  -6206,  -6206,  -6161,  -6161,  -6161,
+		 -6161,  -6161,  -6161,  -6161,  -6161,  -6161,  -6161,  -6161,
+		 -6161,   2574,   2575,   2576,   2577,    146,    102,   2580,
+		  2581,   2582,   2583,  15844,  12530,  12531,   9217,   9218,
+		  5904,   5905,   2591,   2592,   2593,   2594,   2595,  -6161,
+		 -6161,   2643,   2644,   2600,   2601,   2602,   2603,  -6161,
+		 -6161,   2651,   2652,   2608,   2609,   2610,   2611,   2612,
+		  2613,   2614,   2615,   2616,   2617,   2618,   2619,  -6115,
+		 -6115,  -6115,  -6115,  -3683,  -3638,  -6115,  -6115,  -6115,
+		 -6115, -19375, -16060, -16060, -12745, -12745,  -9430,  -9430,
+		 -6115,  -6115,  -6115,  -6115,  -6115,   2642,   2643,  -6160,
+		 -6160,  -6115,  -6115,  -6115,  -6115,   2650,   2651,  -6160,
+		 -6160,  -6115,  -3460,  -3459,  -3458,  -3457,  -1026,  -3455,
+		 -3454,  -6160,  -3452,  -6160, -12117,  -6160, -12117,  -6160,
+		 -2848,  -2848,  -2848,   6893,    891,  -5065,  -2846,  -6160,
+		 -2845,  -1264,      0,   9264,   5950,   5951,   2637,   2638,
+		  2639,   2640,   2641,  -6115,  -6115,   2689,   2690,   2646,
+		  2647,   2648,   2649,  -6115,  -6115,   2697,   2698,   2654,
+		     0,      0,      0,      0,  -2430,      0,      0,   2707,
+		     0,   2709,   8667,   2711,   8669,   2713,   -598,   -597,
+		  -596, -10336,  -4333,   1624,   -594,   2721,   -593,  -2173,
+		  2724,   -592,   -591,   -590,   -589,   -588,   -587,   -586,
+		    12,   -584,   -583,   2735,   -582,   2737,   -581,   2739,
+		  2740,   -580,  -6115,  -6115,  -6115,   2745,   2746,  -6115,
+		 -6115,      0,      0,      0,   2752,   2753,   2754,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,      0,      0,      0,   6247,   6248,      0,      0,
+		     0,      0,      0,      0,      0,      0,      0,      0,
+		     0,
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 1;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 8191 + c;
+	}
+	return h[a % 13209] + h[b % 13209];
+}
+
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo =
+{
+	UnicodeDecompMain,
+	Decomp_hash_func,
+	6604
+};
diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns
index 86bdd9d6dc..f7e771a7e6 100644
--- a/src/tools/pgindent/exclude_file_patterns
+++ b/src/tools/pgindent/exclude_file_patterns
@@ -18,9 +18,10 @@ src/backend/utils/fmgrprotos\.h$
 # they match pgindent style, they'd look worse not better, so exclude them.
 kwlist_d\.h$
 #
-# This is generated by the scripts from src/common/unicode/.  It uses
+# These are generated by the scripts from src/common/unicode/.  They use
 # hash functions generated by PerfectHash.pm whose format looks worse with
 # pgindent.
+src/include/common/unicode_norm_table\.h$
 src/include/common/unicode_normprops_table\.h$
 #
 # Exclude ecpg test files to avoid breaking the ecpg regression tests
-- 
2.22.0

v2-0002-Speed-up-unicode-recomposition.patchapplication/x-patch; name=v2-0002-Speed-up-unicode-recomposition.patchDownload
From ed51e0bfa6269df197773e03f14bd13f4a373331 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
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 <<HEADER;
+/* inverse lookup array  */
+static const uint16 RecompInverseLookup[$num_recomps] =
+{
+$recomp_string
+};
+HEADER
+
+# Emit the definition of the recomp hash function.
+my $rec_funcname = 'Recomp_hash_func';
+my $rec_func        = PerfectHash::generate_hash_function(\@rec_cp_packed, $rec_funcname,
+	fixed_key_length => 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 <<HEADER;
+/* Hash lookup information for recomposition */
+static const pg_unicode_recompinfo UnicodeRecompInfo =
+{
+	RecompInverseLookup,
+	$rec_funcname,
+	$num_recomps
+};
+HEADER
+
 close $OUTPUT;
+
+sub recomp_sort
+{
+	my $a1 = hex($a->{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

#8Michael Paquier
michael@paquier.xyz
In reply to: John Naylor (#7)
Re: speed up unicode decomposition and recomposition

On Thu, Oct 15, 2020 at 01:59:38PM -0400, John Naylor wrote:

I think I've seen a trie recommended somewhere, maybe the official website.
That said, I was able to get the hash working for recomposition (split into
a separate patch, and both of them now leave frontend alone), and I'm
pleased to say it's 50-75x faster than linear search in simple tests. I'd
be curious how it compares to ICU now. Perhaps Daniel Verite would be
interested in testing again? (CC'd)

Yeah, that would be interesting to compare. Now the gains proposed by
this patch are already a good step forward, so I don't think that it
should be a blocker for a solution we have at hand as the numbers
speak by themselves here. So if something better gets proposed, we
could always change the decomposition and recomposition logic as
needed.

select count(normalize(t, NFC)) from (
select md5(i::text) as t from
generate_series(1,100000) as i
) s;

master patch
18800ms 257ms

My environment was showing HEAD as being a bit faster with 15s, while
the patch gets "only" down to 290~300ms (compiled with -O2, as I guess
you did). Nice.

+   # Then the second
+   return -1 if $a2 < $b2;
+   return 1 if $a2 > $b2;
Should say "second code point" here?
+       hashkey = pg_hton64(((uint64) start << 32) | (uint64) code);
+       h = recompinfo.hash(&hashkey);
This choice should be documented, and most likely we should have
comments on the perl and C sides to keep track of the relationship
between the two.

The binary sizes of libpgcommon_shlib.a and libpgcommon.a change
because Decomp_hash_func() gets included, impacting libpq.
Structurally, wouldn't it be better to move this part into its own,
backend-only, header? It could be possible to paint the difference
with some ifdef FRONTEND of course, or just keep things as they are
because this can be useful for some out-of-core frontend tool? But if
we keep that as a separate header then any C part can decide to
include it or not, so frontend tools could also make this choice.
Note that we don't include unicode_normprops_table.h for frontends in
unicode_norm.c, but that's the case of unicode_norm_table.h.
--
Michael

#9Daniel Verite
daniel@manitou-mail.org
In reply to: John Naylor (#7)
Re: speed up unicode decomposition and recomposition

John Naylor wrote:

I'd be curious how it compares to ICU now

I've made another run of the test in [1]/messages/by-id/2c5e8df9-43b8-41fa-88e6-286e8634f00a@manitou-mail.org with your v2 patches
from this thread against icu_ext built with ICU-67.1.
The results show the times in milliseconds to process
about 10 million short strings:

operation | unpatched | patched | icu_ext
------------+-----------+---------+---------
nfc check | 7968 | 5989 | 4076
nfc conv | 700894 | 15163 | 6808
nfd check | 16399 | 9852 | 3849
nfd conv | 17391 | 10916 | 6758
nfkc check | 8259 | 6092 | 4301
nfkc conv | 700241 | 15354 | 7034
nfkd check | 16585 | 10049 | 4038
nfkd conv | 17587 | 11109 | 7086

The ICU implementation still wins by a large margin, but
the improvements brought by the patch are gorgeous,
especially for the conversion to NFC/NFKC.
This test ran on a slower machine than what I used for [1]/messages/by-id/2c5e8df9-43b8-41fa-88e6-286e8634f00a@manitou-mail.org, so
that's why all queries take longer.

For the two queries upthread, I get this:

1)
select count(normalize(t, NFC)) from (
select md5(i::text) as t from
generate_series(1,100000) as i
) s;
count
--------
100000
(1 row)

Time: 371.043 ms

VS ICU:

select count(icu_normalize(t, 'NFC')) from (
select md5(i::text) as t from
generate_series(1,100000) as i
) s;
count
--------
100000
(1 row)

Time: 125.809 ms

2)
select count(normalize(t, NFC)) from (
select repeat(U&'\00E4\00C5\0958\00F4\1EBF\3300\1FE2\3316\2465\322D', i % 3
+ 1) as t from
generate_series(1,100000) as i
) s;
count
--------
100000
(1 row)
Time: 428.214 ms

VS ICU:

select count(icu_normalize(t, 'NFC')) from (
select repeat(U&'\00E4\00C5\0958\00F4\1EBF\3300\1FE2\3316\2465\322D', i % 3
+ 1) as t from
generate_series(1,100000) as i
) s;
count
--------
100000
(1 row)

Time: 147.713 ms

[1]: /messages/by-id/2c5e8df9-43b8-41fa-88e6-286e8634f00a@manitou-mail.org
/messages/by-id/2c5e8df9-43b8-41fa-88e6-286e8634f00a@manitou-mail.org

Best regards,
--
Daniel Vérité
PostgreSQL-powered mailer: https://www.manitou-mail.org
Twitter: @DanielVerite

#10John Naylor
john.naylor@enterprisedb.com
In reply to: Michael Paquier (#8)
Re: speed up unicode decomposition and recomposition

On Thu, Oct 15, 2020 at 11:32 PM Michael Paquier <michael@paquier.xyz>
wrote:

The binary sizes of libpgcommon_shlib.a and libpgcommon.a change
because Decomp_hash_func() gets included, impacting libpq.

I don't see any difference on gcc/Linux in those two files, nor in
unicode_norm_shlib.o -- I do see a difference in unicode_norm_srv.o as
expected. Could it depend on the compiler?

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#11John Naylor
john.naylor@enterprisedb.com
In reply to: Daniel Verite (#9)
Re: speed up unicode decomposition and recomposition

On Fri, Oct 16, 2020 at 2:08 PM Daniel Verite <daniel@manitou-mail.org>
wrote:

John Naylor wrote:

I'd be curious how it compares to ICU now

I've made another run of the test in [1] with your v2 patches
from this thread against icu_ext built with ICU-67.1.
The results show the times in milliseconds to process
about 10 million short strings:

Thanks for testing!

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#12Michael Paquier
michael@paquier.xyz
In reply to: John Naylor (#10)
Re: speed up unicode decomposition and recomposition

On Mon, Oct 19, 2020 at 10:34:33AM -0400, John Naylor wrote:

I don't see any difference on gcc/Linux in those two files, nor in
unicode_norm_shlib.o -- I do see a difference in unicode_norm_srv.o as
expected. Could it depend on the compiler?

Hmm. My guess is that you don't have --enable-debug in your set of
configure options? It is not unusual to have this one enabled for GCC
even on production systems, and the size of the libs is impacted in
this case with your patch.
--
Michael

#13John Naylor
john.naylor@enterprisedb.com
In reply to: Michael Paquier (#12)
Re: speed up unicode decomposition and recomposition

On Tue, Oct 20, 2020 at 3:22 AM Michael Paquier <michael@paquier.xyz> wrote:

On Mon, Oct 19, 2020 at 10:34:33AM -0400, John Naylor wrote:

I don't see any difference on gcc/Linux in those two files, nor in
unicode_norm_shlib.o -- I do see a difference in unicode_norm_srv.o as
expected. Could it depend on the compiler?

Hmm. My guess is that you don't have --enable-debug in your set of
configure options? It is not unusual to have this one enabled for GCC
even on production systems, and the size of the libs is impacted in
this case with your patch.

I've confirmed that. How about a new header unicode_norm_hashfunc.h which
would include unicode_norm_table.h at the top. In unicode.c, we can include
one of these depending on frontend or backend.

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#14Michael Paquier
michael@paquier.xyz
In reply to: John Naylor (#13)
Re: speed up unicode decomposition and recomposition

On Tue, Oct 20, 2020 at 08:03:12AM -0400, John Naylor wrote:

I've confirmed that. How about a new header unicode_norm_hashfunc.h which
would include unicode_norm_table.h at the top. In unicode.c, we can include
one of these depending on frontend or backend.

Sounds good to me. Looking at the code, I would just generate the
second file within generate-unicode_norm_table.pl.
--
Michael

#15John Naylor
john.naylor@enterprisedb.com
In reply to: Michael Paquier (#8)
2 attachment(s)
Re: speed up unicode decomposition and recomposition

Attached v3 addressing review points below:

On Thu, Oct 15, 2020 at 11:32 PM Michael Paquier <michael@paquier.xyz>
wrote:

+   # Then the second
+   return -1 if $a2 < $b2;
+   return 1 if $a2 > $b2;
Should say "second code point" here?

Done. Also changed the tiebreaker to the composed codepoint. Beforehand, it
was the index into DecompMain[], which is only equivalent if the list is in
order (it is but we don't want correctness to depend on that), and not very
clear.

+       hashkey = pg_hton64(((uint64) start << 32) | (uint64) code);
+       h = recompinfo.hash(&hashkey);
This choice should be documented, and most likely we should have
comments on the perl and C sides to keep track of the relationship
between the two.

Done.

<separate headers>

Done.

Other cosmetic changes:
- format recomp array comments like /* U+0045+032D -> U+1E18 */
- make sure to comment #endif's that are far from the #if
- small whitespace fixes

Note: for the new header I simply adapted from unicode_norm_table.h the
choice of "There is deliberately not an #ifndef PG_UNICODE_NORM_TABLE_H
here", although I must confess I'm not sure what the purpose of that is, in
this case.

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

Attachments:

v3-0001-Speed-up-unicode-decomposition.patchapplication/octet-stream; name=v3-0001-Speed-up-unicode-decomposition.patchDownload
From 11d36f15a7a663ed854e3eec0b3221d604fc5994 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Wed, 21 Oct 2020 18:21:19 -0400
Subject: [PATCH v3 1/2] Speed up unicode decomposition

Replace binary search in the backend with a perfect hash function.
This takes up 26kB additional bytes, so leave out of the frontend
since decomposition there is thus far only used on password-length
strings.
---
 src/common/unicode/Makefile                   |    4 +-
 .../unicode/generate-unicode_norm_table.pl    |  106 +-
 src/common/unicode_norm.c                     |   61 +-
 src/include/common/unicode_norm_hashfunc.h    | 1713 +++++++++++++++++
 src/tools/pgindent/exclude_file_patterns      |    4 +-
 5 files changed, 1849 insertions(+), 39 deletions(-)
 create mode 100644 src/include/common/unicode_norm_hashfunc.h

diff --git a/src/common/unicode/Makefile b/src/common/unicode/Makefile
index 93a9d1615f..eb14add28a 100644
--- a/src/common/unicode/Makefile
+++ b/src/common/unicode/Makefile
@@ -18,7 +18,7 @@ LIBS += $(PTHREAD_LIBS)
 # By default, do nothing.
 all:
 
-update-unicode: unicode_norm_table.h unicode_combining_table.h unicode_normprops_table.h
+update-unicode: unicode_norm_table.h unicode_combining_table.h unicode_normprops_table.h unicode_norm_hashfunc.h
 	mv $^ ../../../src/include/common/
 	$(MAKE) normalization-check
 
@@ -30,6 +30,8 @@ UnicodeData.txt DerivedNormalizationProps.txt CompositionExclusions.txt Normaliz
 
 # Generation of conversion tables used for string normalization with
 # UTF-8 strings.
+unicode_norm_hashfunc.h: unicode_norm_table.h
+
 unicode_norm_table.h: generate-unicode_norm_table.pl UnicodeData.txt CompositionExclusions.txt
 	$(PERL) generate-unicode_norm_table.pl
 
diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 7ce15e1a03..5fca88796f 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -10,7 +10,12 @@
 use strict;
 use warnings;
 
-my $output_file = "unicode_norm_table.h";
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
+my $output_table_file = "unicode_norm_table.h";
+my $output_func_file  = "unicode_norm_hashfunc.h";
 
 my $FH;
 
@@ -64,11 +69,13 @@ close $FH;
 
 my $num_characters = scalar @characters;
 
-# Start writing out the output file
-open my $OUTPUT, '>', $output_file
-  or die "Could not open output file $output_file: $!\n";
+# Start writing out the output files
+open my $OT, '>', $output_table_file
+  or die "Could not open output file $output_table_file: $!\n";
+open my $OF, '>', $output_func_file
+  or die "Could not open output file $output_func_file: $!\n";
 
-print $OUTPUT <<HEADER;
+print $OT <<HEADER;
 /*-------------------------------------------------------------------------
  *
  * unicode_norm_table.h
@@ -111,8 +118,44 @@ static const pg_unicode_decomposition UnicodeDecompMain[$num_characters] =
 {
 HEADER
 
+print $OF <<HEADER;
+/*-------------------------------------------------------------------------
+ *
+ * unicode_norm_hashfunc.h
+ *	  Perfect hash functions used for Unicode normalization
+ *
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/common/unicode_norm_hashfunc.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * File auto-generated by src/common/unicode/generate-unicode_norm_table.pl,
+ * do not edit. There is deliberately not an #ifndef PG_UNICODE_NORM_HASHFUNC_H
+ * here.
+ */
+
+#include "unicode_norm_table.h"
+
+/* Typedef for perfect hash functions */
+typedef int (*cp_hash_func) (const void *key);
+
+/* Information for lookups with perfect hash functions */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	cp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
+HEADER
+
 my $decomp_index  = 0;
 my $decomp_string = "";
+my @dec_cp_packed;
 
 my $last_code = $characters[-1]->{code};
 foreach my $char (@characters)
@@ -121,6 +164,9 @@ foreach my $char (@characters)
 	my $class  = $char->{class};
 	my $decomp = $char->{decomp};
 
+	# Save the code point bytes as a string in network order.
+	push @dec_cp_packed, pack('N', hex($char->{code}));
+
 	# The character decomposition mapping field in UnicodeData.txt is a list
 	# of unicode codepoints, separated by space. But it can be prefixed with
 	# so-called compatibility formatting tag, like "<compat>", or "<font>".
@@ -163,7 +209,7 @@ foreach my $char (@characters)
 		{
 			foreach my $lcode (@composition_exclusion_codes)
 			{
-				if ($lcode eq $char->{code})
+				if ($lcode eq $code)
 				{
 					$flags .= " | DECOMP_NO_COMPOSE";
 					$comment = "in exclusion list";
@@ -175,7 +221,7 @@ foreach my $char (@characters)
 
 	if ($decomp_size == 0)
 	{
-		print $OUTPUT "\t{0x$code, $class, 0$flags, 0}";
+		print $OT "\t{0x$code, $class, 0$flags, 0}";
 	}
 	elsif ($decomp_size == 1 && length($first_decomp) <= 4)
 	{
@@ -183,11 +229,11 @@ foreach my $char (@characters)
 		# The decomposition consists of a single codepoint, and it fits
 		# in a uint16, so we can store it "inline" in the main table.
 		$flags .= " | DECOMP_INLINE";
-		print $OUTPUT "\t{0x$code, $class, 1$flags, 0x$first_decomp}";
+		print $OT "\t{0x$code, $class, 1$flags, 0x$first_decomp}";
 	}
 	else
 	{
-		print $OUTPUT
+		print $OT
 		  "\t{0x$code, $class, $decomp_size$flags, $decomp_index}";
 
 		# Now save the decompositions into a dedicated area that will
@@ -205,25 +251,15 @@ foreach my $char (@characters)
 	}
 
 	# Print a comma after all items except the last one.
-	print $OUTPUT "," unless ($code eq $last_code);
-	if ($comment ne "")
-	{
-
-		# If the line is wide already, indent the comment with one tab,
-		# otherwise with two. This is to make the output match the way
-		# pgindent would mangle it. (This is quite hacky. To do this
-		# properly, we should actually track how long the line is so far,
-		# but this works for now.)
-		print $OUTPUT "\t" if ($decomp_index < 10);
+	print $OT "," unless ($code eq $last_code);
 
-		print $OUTPUT "\t/* $comment */" if ($comment ne "");
-	}
-	print $OUTPUT "\n";
+	print $OT "\t/* $comment */" if ($comment ne "");
+	print $OT "\n";
 }
-print $OUTPUT "\n};\n\n";
+print $OT "\n};\n\n";
 
 # Print the array of decomposed codes.
-print $OUTPUT <<HEADER;
+print $OT <<HEADER;
 /* codepoints array  */
 static const uint32 UnicodeDecomp_codepoints[$decomp_index] =
 {
@@ -231,4 +267,24 @@ $decomp_string
 };
 HEADER
 
-close $OUTPUT;
+# Emit the definition of the decomp hash function.
+my $dec_funcname = 'Decomp_hash_func';
+my $dec_func     = PerfectHash::generate_hash_function(\@dec_cp_packed,
+	$dec_funcname, fixed_key_length => 4);
+print $OF "/* Perfect hash function for decomposition */\n";
+print $OF "static $dec_func\n";
+
+# Emit the structure that wraps the hash lookup information into
+# one variable.
+print $OF <<HEADER;
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo =
+{
+	UnicodeDecompMain,
+	$dec_funcname,
+	$num_characters
+};
+HEADER
+
+close $OT;
+close $OF;
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 4bb6a0f587..7d0d23ab21 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -19,9 +19,11 @@
 #endif
 
 #include "common/unicode_norm.h"
-#include "common/unicode_norm_table.h"
 #ifndef FRONTEND
+#include "common/unicode_norm_hashfunc.h"
 #include "common/unicode_normprops_table.h"
+#else
+#include "common/unicode_norm_table.h"
 #endif
 #include "port/pg_bswap.h"
 
@@ -44,6 +46,42 @@
 #define NCOUNT		VCOUNT * TCOUNT
 #define SCOUNT		LCOUNT * NCOUNT
 
+/*
+ * Get the entry corresponding to code in the decomposition lookup table.
+ */
+#ifndef FRONTEND
+
+static const pg_unicode_decomposition *
+get_code_entry(pg_wchar code)
+{
+	int			h;
+	uint32		hashkey;
+	pg_unicode_decompinfo decompinfo = UnicodeDecompInfo;
+
+	/*
+	 * Compute the hash function. The hash key is the codepoint with the bytes
+	 * in network order.
+	 */
+	hashkey = pg_hton32(code);
+	h = decompinfo.hash(&hashkey);
+
+	/* An out-of-range result implies no match */
+	if (h < 0 || h >= decompinfo.num_decomps)
+		return NULL;
+
+	/*
+	 * Since it's a perfect hash, we need only match to the specific codepoint
+	 * it identifies.
+	 */
+	if (code != decompinfo.decomps[h].codepoint)
+		return NULL;
+
+	/* Success! */
+	return &decompinfo.decomps[h];
+}
+
+#else
+
 /* comparison routine for bsearch() of decomposition lookup table. */
 static int
 conv_compare(const void *p1, const void *p2)
@@ -56,10 +94,7 @@ conv_compare(const void *p1, const void *p2)
 	return (v1 > v2) ? 1 : ((v1 == v2) ? 0 : -1);
 }
 
-/*
- * Get the entry corresponding to code in the decomposition lookup table.
- */
-static pg_unicode_decomposition *
+static const pg_unicode_decomposition *
 get_code_entry(pg_wchar code)
 {
 	return bsearch(&(code),
@@ -69,6 +104,8 @@ get_code_entry(pg_wchar code)
 				   conv_compare);
 }
 
+#endif							/* !FRONTEND */
+
 /*
  * Given a decomposition entry looked up earlier, get the decomposed
  * characters.
@@ -77,7 +114,7 @@ get_code_entry(pg_wchar code)
  * is only valid until next call to this function!
  */
 static const pg_wchar *
-get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
+get_code_decomposition(const pg_unicode_decomposition *entry, int *dec_size)
 {
 	static pg_wchar x;
 
@@ -104,7 +141,7 @@ get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
 static int
 get_decomposed_size(pg_wchar code, bool compat)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			size = 0;
 	int			i;
 	const uint32 *decomp;
@@ -231,7 +268,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 static void
 decompose_code(pg_wchar code, bool compat, pg_wchar **result, int *current)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			i;
 	const uint32 *decomp;
 	int			dec_size;
@@ -358,8 +395,8 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 		pg_wchar	prev = decomp_chars[count - 1];
 		pg_wchar	next = decomp_chars[count];
 		pg_wchar	tmp;
-		pg_unicode_decomposition *prevEntry = get_code_entry(prev);
-		pg_unicode_decomposition *nextEntry = get_code_entry(next);
+		const pg_unicode_decomposition *prevEntry = get_code_entry(prev);
+		const pg_unicode_decomposition *nextEntry = get_code_entry(next);
 
 		/*
 		 * If no entries are found, the character used is either an Hangul
@@ -417,7 +454,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 	for (count = 1; count < decomp_size; count++)
 	{
 		pg_wchar	ch = decomp_chars[count];
-		pg_unicode_decomposition *ch_entry = get_code_entry(ch);
+		const pg_unicode_decomposition *ch_entry = get_code_entry(ch);
 		int			ch_class = (ch_entry == NULL) ? 0 : ch_entry->comb_class;
 		pg_wchar	composite;
 
@@ -458,7 +495,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 static uint8
 get_canonical_class(pg_wchar ch)
 {
-	pg_unicode_decomposition *entry = get_code_entry(ch);
+	const pg_unicode_decomposition *entry = get_code_entry(ch);
 
 	if (!entry)
 		return 0;
diff --git a/src/include/common/unicode_norm_hashfunc.h b/src/include/common/unicode_norm_hashfunc.h
new file mode 100644
index 0000000000..d2f4ad884b
--- /dev/null
+++ b/src/include/common/unicode_norm_hashfunc.h
@@ -0,0 +1,1713 @@
+/*-------------------------------------------------------------------------
+ *
+ * unicode_norm_hashfunc.h
+ *	  Perfect hash functions used for Unicode normalization
+ *
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/common/unicode_norm_hashfunc.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * File auto-generated by src/common/unicode/generate-unicode_norm_table.pl,
+ * do not edit. There is deliberately not an #ifndef PG_UNICODE_NORM_HASHFUNC_H
+ * here.
+ */
+
+#include "unicode_norm_table.h"
+
+/* Typedef for perfect hash functions */
+typedef int (*cp_hash_func) (const void *key);
+
+/* Information for lookups with perfect hash functions */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	cp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
+/* Perfect hash function for decomposition */
+static int
+Decomp_hash_func(const void *key)
+{
+	static const int16 h[13209] = {
+		0,     1515,  4744,  4745,  0,     0,     0,     0,
+		0,     0,     0,     0,     3890,  3890,  0,     0,
+		3891,  3891,  -2046, 2800,  3890,  3890,  3890,  -4396,
+		4361,  4362,  -4441, -4441, -4396, 1773,  1773,  1773,
+		4372,  4373,  -4438, -4438, -4393, -4393, 2619,  17,
+		-4347, -4393, -4393, -4393, -4393, -4393, 2619,  2619,
+		1560,  4346,  4347,  4348,  1917,  1873,  1874,  1875,
+		-7856, 4358,  17619, 2622,  2622,  2622,  6357,  6358,
+		6359,  6360,  6361,  6362,  6363,  2622,  -4390, -4390,
+		4414,  -5356, -5356, 4374,  4375,  -5356, -5356, -6335,
+		-3020, 2511,  -5356, -5356, -3583, -3583, -3583, -3583,
+		-995,  0,     0,     -9799, -9754, 2874,  2875,  2876,
+		2877,  2878,  -9830, -3591, -9756, -9756, -2744, -5346,
+		-9710, -9756, 342,   -5346, -9756, -5346, -2743, -449,
+		348,   2894,  2895,  -2853, 2897,  2898,  2899,  2900,
+		2901,  2902,  2903,  2904,  2905,  2906,  2907,  2908,
+		2909,  2910,  2911,  2912,  2913,  2914,  2915,  2916,
+		2917,  2918,  2919,  2920,  2921,  2922,  2923,  2924,
+		2925,  2926,  2927,  2928,  2929,  2930,  2931,  2932,
+		2933,  2934,  32767, 32767, 32767, 32767, 32767, 32767,
+		-8721, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1,     32767, 48,    32767, 32767, 32767, 32767, 49,
+		32767, 32767, -8687, -8687, -6255, -6210, 32767, 32767,
+		-8689, -8689, -21949,32767, -18635,-15320,-15320,32767,
+		-12006,-8691, -8691, -8691, -8691, -8691, 32767, 66,
+		-8737, -8737, -8692, -8692, -8692, -8692, 73,    74,
+		32767, -8738, -8693, -8693, -8693, -8693, -8693, 32767,
+		32767, -8695, -8695, -8695, -8695, -8695, 32767, 32767,
+		40,    41,    -2390, -2434, 44,    45,    32767, 46,
+		13307, 9993,  9994,  6680,  6681,  3367,  3368,  54,
+		0,     55,    56,    57,    -8699, -8699, 105,   32767,
+		32767, 61,    62,    63,    -8701, -8701, 32767, 111,
+		32767, 67,    68,    69,    70,    1890,  3687,  -1272,
+		3690,  75,    76,    77,    78,    79,    80,    81,
+		82,    32767, 32767, 83,    84,    85,    86,    87,
+		88,    89,    90,    91,    92,    93,    94,    95,
+		96,    97,    98,    99,    100,   101,   102,   32767,
+		32767, 103,   104,   105,   106,   107,   108,   109,
+		-8660, -8660, 32767, -8661, -8661, -8661, -8661, -8661,
+		-8661, 32767, 73,    74,    75,    76,    -2355, -2399,
+		79,    80,    32767, 32767, 13341, 10027, 10028, 6714,
+		6715,  3401,  3402,  32767, 32767, 88,    89,    90,
+		-8666, -8666, 138,   32767, 32767, 94,    95,    96,
+		-8668, -8668, 144,   145,   101,   -2553, -2553, -2553,
+		-2553, -4983, -2553, -2553, 154,   -2553, 156,   32767,
+		32767, 6114,  158,   -3153, -3152, -3151, -12891,-6888,
+		-931,  -3149, 166,   -3148, -4728, 169,   -3147, -3146,
+		-3145, -3144, -3143, -3142, -3141, -2543, -3139, -3138,
+		180,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 3314,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     3660,  3661,  2131,  2132,  2133,  2134,  2135,
+		2136,  2137,  2138,  2139,  2140,  2141,  2142,  2143,
+		2144,  2145,  -5472, -5472, -3612, -3612, -3612, -3612,
+		-3612, 2652,  -3612, -3612, -3612, -3612, -3612, -3612,
+		-3612, -3612, 3693,  -3613, -7015, -7015, 1742,  1743,
+		-7060, -7060, -7015, -846,  -846,  -846,  1753,  1754,
+		-7057, -7057, -7012, -7012, 0,     -2602, -6966, -7012,
+		-7012, -7012, -7012, -7012, 0,     0,     1725,  1726,
+		1727,  1728,  -703,  -747,  -746,  0,     1735,  1736,
+		14997, 0,     0,     0,     3735,  3736,  3737,  3738,
+		3739,  3740,  3741,  0,     -7012, -7012, 1792,  1793,
+		1749,  1750,  1751,  -7980, -7980, -8959, -5644, -113,
+		-7980, -113,  -2382, -6116, -6116, -6116, -6116, -6116,
+		-6116, -6116, -2374, 4639,  4640,  -4163, 5608,  5609,
+		-4120, -4120, 5612,  5613,  6593,  3279,  -2251, 5617,
+		5618,  3846,  3847,  3848,  3849,  1262,  1262,  10066,
+		10067, 10023, 3855,  3856,  3857,  1259,  1259,  10071,
+		3861,  10027, 10028, 3017,  5620,  9985,  10032, -65,
+		5624,  10035, 5626,  3024,  731,   -65,   1298,  12530,
+		3727,  3727,  3772,  3772,  3772,  13504, 13505, 14485,
+		11171, 5641,  13509, 5643,  7913,  11648, 11649, 11650,
+		11651, 11652, 11653, 11654, 7913,  901,   901,   9705,
+		-65,   -65,   9665,  9666,  -65,   -65,   -1044, 2271,
+		7802,  -65,   -65,   1708,  1708,  1708,  1708,  4296,
+		4297,  -4506, -4506, -4461, 1708,  1708,  1708,  4307,
+		4308,  -4503, 1708,  -4457, -4457, 2555,  -47,   -4411,
+		-4457, 5641,  -47,   -4457, -47,   2556,  4850,  5647,
+		4285,  -6946, 1858,  1859,  1815,  1816,  1817,  -7914,
+		-7914, -8893, -5578, -47,   -7914, -47,   -2316, -6050,
+		-6050, -6050, -6050, -6050, -6050, -6050, -2308, 4705,
+		4706,  -4097, 5674,  5675,  -4054, -4054, 5678,  5679,
+		6659,  3345,  -2185, 5683,  5684,  3912,  3913,  3914,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -3083, -3083, 232,   287,   233,   233,
+		233,   8990,  8991,  32767, 32767, 3668,  32767, 3667,
+		3667,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 208,   208,   208,   208,   208,   208,
+		32767, 32767, 206,   206,   206,   206,   206,   32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 304,   305,   -1274, 307,   308,
+		309,   6753,  -1374, 10488, 4486,  -1470, 4488,  316,
+		4489,  -5607, 4490,  4491,  4492,  322,   760,   324,
+		325,   326,   166,   763,   329,   -2553, 765,   332,
+		333,   334,   335,   772,   337,   6310,  339,   340,
+		341,   342,   343,   344,   345,   346,   -2542, -2542,
+		-2542, 350,   351,   352,   353,   354,   355,   356,
+		357,   358,   359,   360,   361,   362,   -6008, 364,
+		365,   366,   367,   368,   369,   370,   254,   372,
+		373,   374,   375,   376,   377,   378,   379,   380,
+		381,   382,   32767, 383,   384,   -3606, -3605, -3604,
+		-3603, 389,   -3600, -3599, -3598, 2340,  -1238, -3595,
+		-3594, -3593, 4694,  -4062, -4062, 4742,  4743,  4699,
+		-1469, -1468, -1467, -4065, -4065, 4747,  -1463, 4703,
+		4704,  -2307, 296,   32767, 0,     32767, 32767, 4708,
+		-1376, -1376, -1376, 32767, 32767, -1246, 506,   506,
+		0,     -1559, 32767, 32767, 32767, 32767, 32767, 305,
+		419,   308,   2578,  6313,  6314,  424,   32767, -6030,
+		32767, 426,   427,   428,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     32767, 0,
+		32767, 0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     32767, 429,   -5407, 431,
+		-5406, 433,   -3601, 435,   32767, -3751, 32767, 32767,
+		32767, 32767, -3755, 32767, 32767, 32767, 32767, 0,
+		32767, 32767, 32767, 32767, 0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 436,   -11425,-5422,
+		535,   -5422, 535,   -5422, 4675,  -5421, -5421, -5421,
+		-5421, -5421, 4681,  0,     0,     0,     4682,  4683,
+		4684,  4685,  4686,  4687,  0,     0,     32767, 32767,
+		0,     0,     -5684, 0,     4688,  4689,  4690,  4691,
+		4692,  4693,  4694,  4695,  -1257, -1257, 4696,  -5441,
+		-5441, 4699,  4700,  4701,  -5443, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 454,   0,     32767, 456,
+		32767, 32767, 0,     457,   32767, 32767, 32767, 0,
+		458,   459,   460,   32767, 0,     32767, 32767, 32767,
+		32767, 32767, 32767, 4703,  4704,  4705,  4706,  32767,
+		32767, 0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 4655,  4656,  4657,  4658,
+		4659,  4712,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 462,   32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 463,   464,   32767, 465,
+		32767, 32767, 32767, 466,   32767, 32767, 32767, 32767,
+		467,   468,   469,   32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 3011,  3011,  3011,
+		3011,  3011,  3011,  3011,  32767, 32767, 32767, 32767,
+		32767, 32767, 470,   471,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 472,
+		473,   474,   475,   476,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 4713,  4714,  4715,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 477,   478,   32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 479,   480,   481,   482,
+		32767, 32767, 483,   484,   32767, 32767, 485,   486,
+		487,   488,   489,   490,   32767, 32767, 491,   492,
+		493,   494,   495,   496,   32767, 32767, 0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     665,   -255,  667,   0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     693,   694,   695,   696,
+		697,   698,   699,   700,   701,   702,   703,   704,
+		705,   706,   707,   708,   709,   710,   711,   712,
+		7183,  714,   -1580, 716,   2547,  718,   7194,  720,
+		2553,  722,   723,   7204,  725,   726,   727,   728,
+		729,   730,   731,   732,   733,   734,   735,   736,
+		0,     0,     8114,  8159,  745,   -1535, 747,   748,
+		8161,  -5019, -5019, -5019, -5019, 1938,  0,     0,
+		0,     0,     0,     0,     767,   768,   0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     32767, 32767, 32767, 32767, 32767, 0,     32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, -2875, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -4271, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, 32767, -2885, 32767, -2886, -2886,
+		32767, -2887, -2887, 32767, -2888, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 563,   564,
+		565,   566,   567,   568,   569,   570,   571,   572,
+		573,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		574,   575,   576,   577,   578,   32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, -294,  -294,  -294,  -3047, 583,   584,   585,
+		-4462, -4418, -4418, -4418, -4418, -4418, -4462, -4462,
+		-4462, 595,   596,   597,   598,   599,   32767, 32767,
+		32767, 32767, -4471, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 4716,  4717,  4718,  4719,
+		4720,  4721,  4722,  4723,  4724,  4725,  4726,  4727,
+		4728,  4729,  4730,  4731,  4732,  4733,  4734,  4735,
+		3826,  4737,  4738,  4739,  4740,  4741,  4742,  3832,
+		4744,  3833,  3120,  3121,  3835,  3835,  3124,  3836,
+		3836,  4753,  4754,  4755,  4756,  4757,  4758,  4759,
+		4760,  4761,  4762,  4763,  4764,  4765,  4766,  4767,
+		4768,  4769,  4770,  4771,  4772,  4773,  4774,  4775,
+		4776,  4777,  4778,  4779,  4780,  4781,  6619,  6620,
+		6621,  11272, 6623,  6624,  4788,  4789,  4790,  3874,
+		4761,  3874,  4794,  3874,  4796,  4797,  4798,  3874,
+		4800,  32767, 0,     4802,  4803,  4804,  4805,  4806,
+		4807,  4808,  4809,  4810,  4811,  4812,  4813,  4814,
+		4815,  4816,  4817,  4818,  4819,  4820,  4821,  4822,
+		4823,  4824,  4825,  4826,  4827,  4828,  11299, 4830,
+		2536,  4832,  6663,  4834,  11310, 4836,  6669,  4838,
+		4839,  11320, 4841,  4842,  4843,  4844,  4845,  4846,
+		4847,  4848,  4849,  4850,  4851,  4852,  1188,  4854,
+		4855,  4856,  4857,  2577,  4859,  4860,  12273, -907,
+		-907,  -907,  -907,  -907,  -907,  4868,  4869,  4870,
+		4871,  32767, 4872,  4873,  32767, 32767, 4874,  32767,
+		627,   4875,  4876,  32767, 32767, 4877,  4878,  4879,
+		6722,  32767, 4881,  4882,  4883,  6730,  6731,  7446,
+		6733,  4888,  7449,  7449,  4891,  4892,  32767, 4893,
+		32767, 4894,  4895,  4896,  4897,  4898,  4899,  3512,
+		3513,  3514,  3515,  3516,  4904,  3518,  3519,  3520,
+		3521,  3522,  3523,  3524,  3525,  3526,  3527,  3528,
+		3529,  3530,  3531,  3532,  3533,  3534,  3535,  3536,
+		3537,  3538,  4926,  6797,  4928,  6800,  4930,  4931,
+		4932,  4933,  4934,  4935,  6813,  4937,  4938,  6816,
+		6817,  4941,  4942,  4943,  0,     4945,  6821,  0,
+		0,     4949,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, -127,  -127,  -127,
+		7285,  -127,  -127,  0,     -128,  -128,  -128,  -128,
+		0,     32767, -130,  4971,  -129,  5613,  5614,  5615,
+		4976,  5618,  32767, 5619,  5620,  5621,  4981,  5624,
+		4983,  4984,  32767, 5630,  5631,  -1986, -1986, -126,
+		-126,  5078,  4992,  5037,  5038,  5039,  5040,  5041,
+		5086,  5087,  5088,  5089,  -2322, 5091,  5092,  5093,
+		5094,  5095,  5096,  5097,  5098,  5099,  5100,  0,
+		5101,  -640,  -640,  -640,  0,     -641,  -641,  -641,
+		-641,  -641,  0,     -642,  0,     0,     32767, -645,
+		-645,  6973,  6974,  5115,  5116,  -87,   0,     -44,
+		-44,   -44,   -44,   -44,   -88,   -88,   -88,   -88,
+		7324,  -88,   -88,   -88,   -88,   -88,   -88,   -88,
+		-88,   -88,   -88,   -88,   -88,   5654,  5655,  5656,
+		5657,  5658,  5659,  5660,  5661,  5662,  5663,  5664,
+		5665,  5666,  5667,  5668,  5669,  -1948, -1948, -88,
+		-88,   5116,  5117,  5074,  5075,  5076,  5077,  5078,
+		5123,  5124,  5125,  5126,  -2285, 5128,  5129,  5130,
+		5131,  5132,  5133,  5134,  5135,  5136,  5137,  5138,
+		5139,  -602,  -602,  -602,  -602,  -602,  -602,  -602,
+		-602,  -602,  -602,  -602,  -602,  -602,  -602,  -602,
+		-602,  7016,  7017,  5158,  5159,  -44,   -44,   0,
+		0,     0,     0,     0,     -44,   -44,   -44,   -44,
+		7368,  -44,   -44,   -44,   -44,   -44,   -44,   -44,
+		-44,   -44,   -44,   -44,   -44,   5698,  5699,  5700,
+		5701,  5702,  5703,  5704,  5705,  5706,  5707,  5708,
+		5709,  5710,  5711,  5712,  5713,  -1904, -1904, -44,
+		-44,   5160,  5161,  5118,  5119,  5120,  5121,  5122,
+		5167,  5168,  5169,  5170,  -2241, 5172,  5173,  5174,
+		5175,  5176,  5177,  5178,  5179,  5180,  5181,  5182,
+		5183,  -558,  -558,  -558,  -558,  -558,  -558,  -558,
+		-558,  -558,  -558,  -558,  -558,  -558,  -558,  -558,
+		-558,  7060,  7061,  5202,  5203,  0,     0,     44,
+		44,    44,    44,    44,    0,     0,     0,     0,
+		7412,  0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     5742,  5743,  5744,
+		5745,  5746,  5747,  5748,  5749,  5750,  5751,  5752,
+		5753,  5754,  5755,  5756,  5757,  -1860, -1860, 0,
+		0,     0,     0,     0,     6264,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     -3402,
+		-3402, 5355,  5356,  -3447, -3447, -3402, -3402, -3402,
+		-3402, 5363,  5364,  -3447, -3447, -3402, -3402, -3402,
+		-3358, -3358, -3404, -3404, -3404, -3404, -3404, -3404,
+		-3404, 5331,  5332,  5333,  5334,  2903,  2859,  5337,
+		5338,  5339,  5340,  18601, 15287, 15288, 11974, 11975,
+		8661,  8662,  5348,  5349,  5350,  5351,  5352,  -3404,
+		-3404, 5400,  5401,  5357,  5358,  5359,  5360,  -3404,
+		-3404, 5408,  5409,  5365,  5366,  5367,  5324,  5325,
+		5372,  5373,  5374,  5375,  5376,  5377,  5378,  -3356,
+		-3356, -3356, -3356, -924,  -879,  -3356, -3356, -3356,
+		-3356, -16616,-13301,-13301,-9986, -9986, -6671, -6671,
+		-3356, -3356, -3356, -3356, -3356, 5401,  5402,  -3401,
+		-3401, -3356, -3356, -3356, -3356, 5409,  5410,  -3401,
+		-3401, -3356, -3356, -3356, -3312, -3312, -3358, -3358,
+		-3358, -3358, -3358, -3358, -3358, 5377,  5378,  5379,
+		5380,  2949,  2905,  5383,  5384,  5385,  5386,  18647,
+		15333, 15334, 12020, 12021, 8707,  8708,  5394,  5395,
+		5396,  5397,  5398,  -3358, -3358, 5446,  5447,  5403,
+		5404,  5405,  5406,  -3358, -3358, 5454,  5455,  5411,
+		5412,  5413,  5414,  5415,  5416,  5417,  5418,  5419,
+		5420,  5421,  5422,  -3312, -3312, -3312, -3312, -880,
+		-835,  -3312, -3312, -3312, -3312, -16572,-13257,-13257,
+		-9942, -9942, -6627, -6627, -3312, -3312, -3312, -3312,
+		-3312, 5445,  5446,  -3357, -3357, -3312, -3312, -3312,
+		-3312, 5453,  5454,  -3357, -3357, -3312, -3312, -3312,
+		-3312, -3312, -3312, -3312, -3312, -3312, -3312, -3312,
+		-3312, 5423,  5424,  5425,  5426,  2995,  2951,  5429,
+		5430,  5431,  5432,  18693, 15379, 15380, 12066, 12067,
+		8753,  8754,  5440,  5441,  5442,  5443,  5444,  -3312,
+		-3312, 5492,  5493,  5449,  5450,  5451,  5452,  -3312,
+		-3312, 5500,  5501,  5457,  2803,  2803,  2803,  2803,
+		373,   2803,  2803,  5510,  2803,  5512,  11470, 5514,
+		11472, 5516,  2205,  2206,  2207,  -7533, -1530, 4427,
+		2209,  5524,  2210,  630,   5527,  2211,  2212,  2213,
+		2214,  2215,  2216,  2217,  2815,  2219,  2220,  5538,
+		2221,  5540,  2222,  5542,  5543,  2223,  -3312, -3312,
+		-3312, 5548,  5549,  -3312, -3312, 2803,  2803,  2803,
+		5555,  5556,  5557,  2803,  2803,  2803,  2803,  2803,
+		2803,  2803,  2803,  2803,  2803,  2803,  2803,  2803,
+		9050,  9051,  2803,  2803,  2803,  2803,  2803,  2803,
+		2803,  2803,  2803,  2803,  2803,  2803,  4318,  7547,
+		7548,  2803,  2803,  2803,  2803,  2803,  2803,  2803,
+		2803,  6693,  6693,  2803,  2803,  6694,  6694,  757,
+		5603,  6693,  6693,  6693,  -1593, 7164,  7165,  -1638,
+		-1638, -1593, 4576,  4576,  4576,  7175,  7176,  -1635,
+		-1635, -1590, -1590, 5422,  2820,  -1544, -1590, -1590,
+		-1590, -1590, -1590, 5422,  5422,  4363,  7149,  7150,
+		7151,  4720,  4676,  4677,  4678,  -5053, 7161,  20422,
+		5425,  5425,  5425,  9160,  9161,  9162,  9163,  9164,
+		9165,  9166,  5425,  -1587, -1587, 7217,  -2553, -2553,
+		7177,  7178,  -2553, 32767, 32767, -219,  5312,  -2555,
+		-2555, -782,  -782,  -782,  -782,  1806,  2801,  2801,
+		-6998, -6953, 5675,  5676,  5677,  5678,  5679,  -7029,
+		-790,  -6955, -6955, 57,    -2545, -6909, -6955, 3143,
+		-2545, -6955, -2545, 58,    2352,  3149,  5695,  5696,
+		-52,   5698,  5699,  5700,  5701,  5702,  5703,  5704,
+		5705,  5706,  5707,  5708,  5709,  5710,  5711,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -1838, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 6927,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -973,  32767, 32767,
+		32767, 32767, 0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     4567,  4568,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -437,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -448,  32767, 32767, -450,  -450,
+		-450,  0,     32767, 32767, 32767, -2166, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     0,     32767, -464,
+		-464,  32767, 0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -514,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		5757,  5758,  5759,  0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -4186, -4186, -12097,-4186, 32767,
+		-4187, -4187, -8787, 32767, 0,     0,     5952,  0,
+		0,     -4183, -4183, -4183, 0,     -2386, -4182, 778,
+		-4183, -5935, 32767, 32767, -4690, -6249, -4184, -4184,
+		-4184, 32767, 32767, -4186, -4186, -77,   32767, -77,
+		32767, -4188, 0,     -4189, 32767, 0,     0,     0,
+		0,     32767, 0,     0,     0,     32767, 0,     0,
+		0,     0,     0,     0,     0,     32767, 0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     0,     32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     -5937, -2358, 0,     0,     0,
+		-8286, 471,   472,   32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 1747,  32767, -2126, 32767, 32767, 1748,
+		1749,  1750,  1751,  1752,  1753,  8224,  1755,  -539,
+		1757,  781,   32767, 32767, 32767, -1991, -2035, 32767,
+		32767, 782,   -3784, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 837,   32767, 32767, 32767, 32767, 32767, -4008,
+		-4008, -4008, 2949,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     -797,  1806,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 4605,  4606,
+		32767, 32767, 0,     455,   32767, 0,     32767, 32767,
+		32767, 0,     32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -4244, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		784,   32767, 32767, 2950,  2951,  32767, 32767, 32767,
+		32767, 32767, 32767, 786,   787,   32767, 1252,  1253,
+		32767, 790,   32767, 0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     32767, 0,     32767, 32767,
+		32767, 0,     32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     0,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -200,  -200,  -200,
+		-200,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		-5932, -5932, 32767, 32767, 2952,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -5387,
+		-5387, -5387, -5387, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     0,     32767, 32767,
+		0,     0,     32767, 32767, 0,     0,     0,     0,
+		0,     0,     32767, 32767, 0,     0,     0,     0,
+		0,     0,     32767, 32767, 497,   498,   499,   500,
+		501,   502,   503,   504,   505,   506,   507,   508,
+		32767, 32767, -156,  765,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -861,
+		32767, 6106,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2953,  2954,  32767, 797,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 2955,  32767, 32767, 32767, -8929,
+		32767, -8885, -8885, -8885, 32767, 32767, 32767, 32767,
+		32767, 32767, -749,  7119,  7120,  32767, 32767, 32767,
+		32767, 2760,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, -1181, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -5587, 0,     7596,
+		7597,  0,     0,     0,     0,     0,     0,     32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     -714,  0,
+		0,     -713,  -712,  0,     -711,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     1859,
+		0,     3247,  32767, 32767, 0,     3247,  0,     3248,
+		0,     3249,  0,     3250,  0,     3251,  0,     3252,
+		808,   3252,  0,     3253,  0,     3254,  0,     0,
+		3256,  0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 0,     0,     0,
+		0,     32767, 32767, 32767, 32767, 0,     0,     6824,
+		32767, 0,     32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		4207,  4208,  0,     0,     0,     0,     0,     1896,
+		0,     0,     1898,  1898,  1898,  1898,  0,     0,
+		0,     1901,  1901,  0,     0,     0,     0,     0,
+		0,     -1319, 0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     7618,  7619,  7620,
+		3,     3,     1863,  1863,  7067,  7068,  7025,  7026,
+		7027,  7028,  7029,  7074,  7075,  7076,  7077,  -334,
+		7079,  7080,  7081,  7082,  7083,  7084,  7085,  7086,
+		7087,  7088,  7089,  7090,  1349,  1349,  1349,  1349,
+		1349,  1349,  1349,  1349,  1349,  1349,  1349,  1349,
+		1349,  1349,  1349,  1349,  8967,  8968,  7109,  7110,
+		1907,  1907,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 2976,  2977,  2978,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     0,     820,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 821,
+		2381,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 2005,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 823,   32767, 824,   32767,
+		825,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 826,   32767, 32767, 32767, 32767, 32767,
+		32767, 4575,  4576,  4577,  4578,  4579,  4580,  4581,
+		4582,  4583,  4584,  4585,  32767, 32767, 829,   32767,
+		32767, 32767, 32767, 830,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		6253,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		6253,  -3848, 834,   835,   836,   -3845, -3845, -3845,
+		-3845, -3845, -3845, 843,   844,   -4280, 32767, 845,
+		846,   6531,  848,   -3839, 32767, -3840, -3840, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 1946,  32767,
+		32767, 32767, -3849, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 853,   32767, 32767, 32767,
+		32767, 854,   32767, 32767, 32767, 32767, 855,   32767,
+		32767, 32767, 32767, 856,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		857,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -3799, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 8266,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 859,   32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 860,
+		32767, 861,   -5065, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 10746, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4526,
+		32767, 4573,  4574,  4575,  32767, 32767, -2436, -1376,
+		32767, 32767, 32767, 32767, 32767, -1689, -1689, 4349,
+		-4171, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 4588,  32767,
+		4589,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4590,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4591,  4592,  32767,
+		32767, 32767, 32767, 32767, 32767, 2933,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 864,   32767, 32767, 32767,
+		0,     32767, 0,     32767, 32767, -2977, 335,   335,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2992,  2993,  2994,  2995,
+		32767, 32767, 32767, 4596,  2550,  32767, 32767, 32767,
+		-1188, 4769,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		4600,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 2997,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4601,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 2013,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -11287,32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -4664, 32767, 32767, -4711, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -4718, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4049,
+		32767, 32767, 32767, 4050,  4051,  4052,  17313, 32767,
+		32767, 32767, 10684, 7370,  7371,  4057,  4058,  4059,
+		4060,  4061,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 4603,  8793,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1283,  4897,  4898,  4899,  12175, 4901,  4902,  32767,
+		4903,  4904,  4905,  4906,  4907,  10276, -1469, 1282,
+		1282,  1282,  1282,  1282,  1282,  1282,  1282,  1282,
+		1282,  32767, 32767, 4920,  4921,  4063,  -2051, -2050,
+		4925,  4926,  32767, 7332,  7333,  32767, 7334,  7335,
+		7336,  7337,  5045,  32767, 32767, 32767, -2049, -2048,
+		32767, -8294, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     1132,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     20166, 16852, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     6908,  6909,  6910,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		-4510, -4510, -4510, -4510, -4510, -4510, -4510, 0,
+		0,     0,     0,     0,     0,     -1831, -1831, -1831,
+		-15091,-11776,-11776,-8461, 0,     0,     0,     -1834,
+		-1834, -1834, -1834, -1834, 0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     -1819, -3615, 1345,  -3616, 0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     32767, 32767, 0,
+		0,     0,     0,     0,     0,     0,     8770,  8771,
+		8772,  8773,  8774,  8775,  8776,  8777,  8778,  8779,
+		45,    45,    45,    45,    2477,  2522,  45,    45,
+		45,    45,    -13215,-9900, -9900, -6585, -6585, -3270,
+		-3270, 45,    45,    45,    45,    45,    8802,  8803,
+		0,     0,     45,    45,    45,    45,    8810,  8811,
+		0,     0,     45,    2700,  2701,  2702,  2703,  5134,
+		2705,  2706,  0,     2708,  0,     -5957, 0,     -5957,
+		0,     3312,  3312,  3312,  13053, 7051,  1095,  3314,
+		0,     3315,  4896,  0,     3317,  3317,  3317,  3317,
+		3317,  3317,  3317,  2720,  3317,  3317,  0,     3318,
+		0,     3319,  0,     0,     3321,  8857,  8858,  8859,
+		0,     0,     8862,  8863,  2749,  2750,  2751,  0,
+		0,     0,     2755,  2756,  2757,  2758,  2759,  2760,
+		2761,  2762,  2763,  2764,  2765,  2766,  2767,  -3479,
+		-3479, 2770,  2771,  2772,  2773,  2774,  2775,  2776,
+		2777,  2778,  2779,  2780,  2781,  1267,  -1961, -1961,
+		2785,  2786,  2787,  2788,  2789,  2790,  2791,  2792,
+		-1097, -1096, 2795,  2796,  -1094, -1093, 4845,  0,
+		-1089, -1088, -1087, 7200,  -1556, -1556, 7248,  7249,
+		7205,  1037,  1038,  1039,  -1559, -1559, 7253,  7254,
+		7210,  7211,  200,   2803,  7168,  7215,  7216,  7217,
+		7218,  7219,  208,   209,   1269,  -1516, -1516, -1516,
+		916,   961,   961,   961,   10693, -1520, -14780,218,
+		219,   220,   -3514, -3514, -3514, -3514, -3514, -3514,
+		-3514, 228,   7241,  7242,  -1561, 8210,  8211,  -1518,
+		-1518, 8214,  8215,  9195,  5881,  351,   8219,  8220,
+		6448,  6449,  6450,  6451,  3864,  2870,  2871,  12671,
+		12627, 0,     0,     0,     0,     0,     12709, 6471,
+		12637, 12638, 5627,  8230,  12595, 12642, 2545,  8234,
+		12645, 8236,  5634,  3341,  2545,  0,     0,     5749,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     0,     0,     11602,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     1466,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     5760,  0,     0,     0,     0,     0,     32767,
+		0,     32767, 0,     0,     32767, 0,     0,     32767,
+		0,     3507,  3508,  0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		1644,  1645,  1646,  1647,  -5764, 1649,  1650,  1651,
+		1652,  1653,  1654,  1655,  1656,  1657,  1658,  1659,
+		1660,  -4081, -4081, -4081, -4081, -4081, -4081, -4081,
+		-4081, -4081, -4081, -4081, -4081, -4081, -4081, -4081,
+		-4081, 3537,  3538,  1679,  3582,  3583,  3584,  -3482,
+		-3482, -3482, -3482, -3482, -3526, -3526, -3526, -3526,
+		3886,  -3526, -3526, -3526, -3526, 3599,  3600,  3601,
+		3602,  3603,  3604,  3605,  3606,  3607,  3608,  3609,
+		3610,  3611,  3612,  3613,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     0,
+		-7275, 0,     0,     -7234, 0,     0,     0,     0,
+		0,     -5368, 6378,  3628,  3629,  3630,  3631,  3632,
+		3633,  3634,  3635,  3636,  3637,  3638,  3639,  0,
+		0,     859,   6974,  6974,  0,     0,     3647,  -2405,
+		-2405, 3650,  -2405, -2405, -2405, -2405, -112,  -2405,
+		-3201, 3658,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     32767, 32767, 32767,
+		32767, 5280,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		4637,  4638,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 4014,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 802,   32767, 32767,
+		32767, 32767, 803,   -1055, 805,   32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 4639,  32767,
+		32767, 32767, 806,   -2445, 0,     -2443, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 810,   32767, 32767,
+		32767, 32767, 811,   812,   813,   32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -6211, -6211, -6211, -6211, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -6271, -6271,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 935,   32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, -10300,32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     0,     32767, 32767, 4640,  4641,  32767,
+		32767, 32767, 32767, 32767, 4624,  32767, 32767, 32767,
+		-4233, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1859,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 872,   32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -4568, -1253, 32767,
+		-3590, 32767, 32767, 32767, -1820, -1820, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 873,   874,   875,   3629,  0,     0,
+		0,     5048,  5005,  5006,  5007,  5008,  5009,  5054,
+		5055,  5056,  0,     0,     0,     0,     0,     32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4118,
+		32767, 32767, 32767, 32767, -4122, -4122, -4122, -4122,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4193,
+		32767, -4194, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -4209, 32767, 32767, -4211, -4211, -4211,
+		-4211, -4211, -4211, -4211, 32767, 32767, -4213, -10683,
+		-4213, -1918, -4213, -6043, 32767, 32767, -4215, -6047,
+		32767, -4216, -10696,-4216, -4216, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4646,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 876,   877,   0,     32767, 0,     32767, 0,
+		32767, 0,     32767, 0,     32767, 32767, 32767, 0,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 1844,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     -2899, 0,     32767,
+		0,     32767, 0,     32767, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     836,   0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     32767, 0,     0,     0,     879,
+		880,   881,   882,   883,   884,   885,   886,   0,
+		0,     887,   0,     920,   0,     922,   923,   924,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 5431,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 3639,  889,   890,   891,   892,   893,
+		894,   895,   896,   897,   898,   899,   900,   -2739,
+		927,   -1881, 4234,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -459,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -458,
+		-457,  904,   32767, 905,   32767, 906,   32767, 907,
+		32767, 908,   32767, 32767, 32767, 909,   32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     910,
+		0,     0,     0,     0,     0,     0,     911,   0,
+		912,   1626,  1626,  913,   914,   1626,  915,   916,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     -1837, -1837, -1837,
+		-6487, -1837, -1837, 0,     0,     0,     917,   31,
+		919,   0,     921,   0,     0,     0,     925,   0,
+		32767, 4801,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     -6470, 0,     2295,
+		0,     -1830, 0,     -6475, 0,     -1832, 0,     0,
+		-6480, 0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     3665,  0,     0,
+		0,     0,     2281,  0,     0,     -7412, 5769,  5770,
+		5771,  5772,  5773,  5774,  0,     0,     0,     0,
+		32767, 0,     0,     32767, 32767, 0,     32767, 32767,
+		0,     0,     32767, 32767, 0,     0,     0,     -1842,
+		32767, 0,     0,     0,     -1846, -1846, -2560, -1846,
+		0,     -2560, -2559, 0,     0,     32767, 0,     32767,
+		0,     0,     0,     0,     0,     0,     1388,  0,
+		1387,  1387,  1387,  0,     1387,  1387,  1387,  1387,
+		1387,  1387,  1387,  1387,  1387,  1387,  1387,  1387,
+		1387,  1387,  1387,  1387,  1387,  1387,  1387,  1387,
+		1387,  0,     -1870, 0,     -1871, 0,     0,     0,
+		0,     0,     0,     -1877, 0,     0,     -1877, -1877,
+		0,     0,     0,     4944,  0,     -1875, 4947,  4948,
+		0,     4950,  4951,  4952,  4953,  4954,  4955,  4956,
+		4957,  4958,  4959,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		32767, 32767, 0,     0,     0,     0,     32767, 32767,
+		32767, 0,     0,     931,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4650,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 5375,
+		5376,  5377,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 13180, 0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, -4011, 933,   -4011, 32767,
+		935,   936,   -4012, 938,   939,   940,   941,   942,
+		943,   944,   945,   946,   947,   32767, 1075,  1076,
+		1077,  -6334, 1079,  1080,  954,   32767, 32767, 32767,
+		32767, 955,   32767, 32767, 32767, 32767, 32767, 32767,
+		-4659, 32767, 32767, 32767, -4662, -4662, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 959,   960,   961,   32767, 962,   963,   964,
+		965,   966,   967,   968,   969,   970,   971,   972,
+		32767, 973,   974,   975,   976,   977,   978,   979,
+		980,   981,   982,   983,   984,   985,   986,   987,
+		988,   989,   990,   32767, 991,   992,   993,   994,
+		995,   996,   997,   998,   999,   1000,  1001,  1002,
+		1003,  1004,  1005,  1006,  1007,  1008,  1009,  1010,
+		1011,  1012,  1013,  1014,  1015,  1016,  1017,  -362,
+		-362,  32767, 32767, 32767, 32767, -410,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 1019,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		164,   1021,  -3551, -3551, 1024,  1025,  1026,  1027,
+		1028,  1029,  1030,  1031,  1032,  1033,  1034,  1035,
+		1036,  1037,  1038,  1039,  1040,  1041,  1042,  1043,
+		1044,  1045,  1046,  1047,  1048,  1049,  1050,  1051,
+		1052,  1053,  1054,  1055,  1056,  1057,  1058,  1059,
+		1060,  1061,  1062,  1063,  1064,  1065,  1066,  1067,
+		1068,  1069,  1070,  1071,  1072,  1073,  1074,  1075,
+		1076,  1077,  1078,  1079,  1080,  1081,  1082,  1083,
+		1084,  1085,  1086,  1087,  1088,  1089,  1090,  1091,
+		1092,  1093,  1094,  1095,  1096,  1097,  1098,  1099,
+		1100,  1101,  1102,  1103,  1104,  1105,  1106,  1107,
+		1108,  1109,  1110,  1111,  1112,  1113,  1114,  32767,
+		1115,  1116,  1117,  1118,  1119,  32767, 1120,  1121,
+		1122,  1123,  1124,  1125,  1126,  1127,  1128,  1129,
+		1130,  1131,  0,     1133,  1134,  1135,  1136,  1137,
+		1138,  1139,  1140,  1141,  1142,  1143,  1144,  1145,
+		1146,  1147,  1148,  1149,  1150,  1151,  1152,  1153,
+		1154,  1155,  1156,  1157,  1158,  1159,  1160,  1161,
+		1162,  1163,  1164,  1165,  1166,  1167,  1168,  1169,
+		1170,  1171,  1172,  1173,  1174,  1175,  1176,  1177,
+		1178,  1179,  1180,  1181,  1182,  1183,  1184,  1185,
+		1186,  1187,  1188,  1189,  1190,  1191,  1192,  1193,
+		1194,  1195,  1196,  1197,  1198,  1199,  1200,  1201,
+		1202,  1203,  1204,  1205,  1206,  1207,  1208,  1209,
+		-18956,-15641,1212,  1213,  1214,  1215,  1216,  1217,
+		1218,  1219,  1220,  1221,  1222,  1223,  1224,  1225,
+		-5682, -5682, -5682, 1229,  1230,  1231,  1232,  1233,
+		1234,  1235,  1236,  1237,  1238,  1239,  5750,  5751,
+		5752,  5753,  5754,  5755,  5756,  1247,  1248,  1249,
+		1250,  1251,  1252,  3084,  3085,  3086,  16347, 13033,
+		13034, 9720,  1260,  1261,  1262,  3097,  3098,  3099,
+		3100,  3101,  1268,  1269,  1270,  1271,  1272,  1273,
+		1274,  1275,  32767, 32767, 32767, 32767, 1276,  1277,
+		1278,  1279,  1280,  1281,  1282,  1283,  1284,  1285,
+		1286,  1287,  1288,  1289,  1290,  1291,  1292,  1293,
+		1294,  1295,  1296,  1297,  1298,  1299,  1300,  1301,
+		1302,  1303,  1304,  1305,  1306,  1307,  1308,  1309,
+		1310,  1311,  1312,  1313,  1314,  1315,  1316,  1317,
+		1318,  1319,  1320,  1321,  1322,  1323,  1324,  1325,
+		1326,  1327,  1328,  1329,  1330,  1331,  1332,  1333,
+		1334,  1335,  1336,  1337,  1338,  1339,  1340,  1341,
+		1342,  3162,  4959,  0,     4962,  1347,  1348,  1349,
+		1350,  1351,  1352,  1353,  1354,  1355,  1356,  1357,
+		1358,  1359,  1360,  1361,  1362,  1363,  1364,  1365,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 7481,
+		7482,  7483,  7484,  5053,  5009,  7487,  7488,  7489,
+		7490,  20751, 17437, 17438, 14124, 14125, 10811, 10812,
+		7498,  7499,  7500,  7501,  7502,  32767, 32767, 7548,
+		7549,  7505,  7506,  7507,  7508,  32767, 32767, 7554,
+		7555,  7511,  4857,  4857,  4857,  4857,  2427,  4857,
+		4857,  7564,  4857,  7566,  13524, 7568,  13526, 7570,
+		4259,  4260,  4261,  -5479, 524,   6481,  4263,  7578,
+		4264,  2684,  1421,  -7842, -4527, -4527, -1212, -1212,
+		-1212, -1212, -1212, 7545,  7546,  0,     0,     -1214,
+		-1214, -1214, -1214, 7551,  7552,  32767, 1610,  -1216,
+		1439,  1440,  1441,  1442,  3873,  1444,  1445,  32767,
+		1446,  32767, -7220, 32767, -7221, 0,     2047,  2047,
+		2047,  11788, 5786,  -170,  2049,  -1265, 2050,  3631,
+		-1265, 2052,  2052,  2052,  2052,  2052,  2052,  2052,
+		1455,  2052,  2052,  -1265, 2053,  -1265, 2054,  -1265,
+		-1265, 2056,  7592,  7593,  7594,  32767, 32767, 7595,
+		7596,  1482,  1483,  1484,  -1267, -1267, -1267, 1488,
+		1489,  1490,  1491,  1492,  1493,  1494,  1495,  1496,
+		1497,  1498,  1499,  1500,  -4746, -4746, 1503,  1504,
+		1505,  1506,  1507,  1508,  1509,  1510,  1511,  1512,
+		1513,  1514,  0,     -3228, -3228, 1518,  1519,  1520,
+		1521,  1522,  1523,  1524,  1525,  -2364, -2363, 1528,
+		1529,  -2361, -2360, 3578,  0,     -2357, -2356, -2355,
+		5932,  -2824, -2824, 5980,  5981,  5937,  -231,  -230,
+		-229,  -2827, -2827, 5985,  -225,  5941,  5942,  -1069,
+		1534,  5899,  5946,  5947,  5948,  5949,  5950,  -1061,
+		-1060, 0,     -2785, 0,     -355,  -355,  -310,  -310,
+		-310,  9422,  -2791, 32767, -1054, -1053, -1052, -4786,
+		-4786, -4786, -4786, -4786, -4786, -4786, -1044, 5969,
+		5970,  -2833, 6938,  6939,  -2790, -2790, 6942,  0,
+		32767, 4607,  -923,  6945,  32767, 5173,  5174,  5175,
+		5176,  2589,  1595,  1596,  11396, 11352, 32767, 32767,
+		6126,  2812,  2813,  2814,  2815,  2816,  -5940, -5940,
+		1607,  1608,  2823,  32767, 32767, 1516,  0,     -8581,
+		0,     0,     728,   1525,  163,   -11068,0,     -2262,
+		-2306, -2305, 32767, 32767, 0,     0,     1580,  0,
+		0,     0,     -6443, 1685,  -10176,-4173, 1784,  -4173,
+		0,     -4172, 5925,  -4171, -4171, -4171, 0,     -437,
+		0,     0,     0,     161,   -435,  0,     2883,  -434,
+		0,     0,     0,     0,     -436,  0,     -5972, 0,
+		0,     0,     0,     0,     0,     0,     0,     2889,
+		2890,  2891,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     6371,
+		0,     0,     0,     0,     0,     0,     0,     117,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     32767, 0,     0,     3991,  3991,
+		3991,  3991,  0,     3990,  3990,  3990,  -1947, 1632,
+		3990,  3990,  3990,  -4296, 4461,  4462,  -4341, -4341,
+		-4296, 1873,  1873,  1873,  4472,  4473,  -4338, 1873,
+		-4292, -4292, 2720,  118,   -4246, -4292, -4292, 117,
+		-4293, -4293, 2719,  2719,  1660,  4446,  1662,  2018,
+		2019,  1975,  1976,  1977,  -7754, -7754, -8733, -5418,
+		113,   0,     112,   -2157, -5891, -5891, 0,     -5892,
+		6455,  -5893, 0,     0,     0,     32767, 32767, 32767,
+		5826,  32767, 32767, 32767, 32767, 6806,  32767, -2039,
+		32767, 5829,  32767, 5830,  5831,  5832,  32767, 5833,
+		5834,  32767, 5835,  32767, 32767, -3520, 0,     5837,
+		0,     5838,  0,     4035,  0,     5840,  32767, 10251,
+		154,   1671,  10253, 1673,  1674,  947,   151,   1514,
+		12746, 1679,  3942,  3987,  3987,  3987,  13719, 13720,
+		14700, 103,   5855,  13723, 5857,  8127,  0,     11862,
+		5860,  -96,   5862,  1690,  5863,  -4233, 5864,  5865,
+		5866,  5867,  5868,  5869,  5870,  5871,  5872,  5873,
+		32767, 5874,  5875,  5876,  5877,  5878,  5879,  5880,
+		5881,  5882,  5883,  13795, 5885,  5886,  5887,  5888,
+		10489, 5890,  1703,  1704,  -4247, 1706,  1707,  5891,
+		5892,  5893,  1711,  4098,  5895,  5896,  5897,  7650,
+		32767, 5899,  6406,  7966,  5902,  5903,  5904,  5905,
+		5906,  5907,  5908,  1800,  5910,  1801,  5912,  5913,
+		5914,  5915,  32767, 1727,  1728,  1729,  1730,  32767,
+		1731,  1732,  1733,  32767, 1734,  1735,  1736,  1737,
+		1738,  1739,  1740,  32767, 1741,  1742,  1743,  1744,
+		1745,  1746,  32767, 32767, 32767, 32767, 1747,  1748,
+		1749,  1750,  1751,  32767, 32767, 32767, 32767, 32767,
+		32767, 1752,  1753,  1754,  1755,  1756,  1757,  1758,
+		1759,  1760,  1761,  1762,  1763,  1764,  1765,  1766,
+		1767,  1768,  1769,  1770,  1771,  1772,  1773,  1774,
+		1775,  1776,  1777,  1778,  1779,  1780,  1781,  1782,
+		1783,  1784,  1785,  1786,  1787,  1788,  1789,  1790,
+		1791,  7729,  4151,  1794,  1795,  1796,  10083, 1327,
+		1327,  10131, 10132, 10088, 3920,  3921,  3922,  1324,
+		1324,  10136, 3926,  10092, 10093, 3082,  5685,  10050,
+		10097, 0,     5689,  10100, 5691,  3089,  796,   0,
+		1363,  12595, 3792,  3792,  3837,  3837,  3837,  13569,
+		13570, 14550, 11236, 5706,  13574, 5708,  7978,  11713,
+		11714, 11715, 11716, 11717, 11718, 11719, 7978,  966,
+		966,   9770,  0,     0,     9730,  9731,  0,     0,
+		-979,  2336,  7867,  0,     0,     32767, 0,     0,
+		0,     32767, 0,     0,     32767, 0,     32767, 32767,
+		9356,  32767, 0,     32767, 0,     32767, 1804,  2602,
+		0,     -4364, -4410, 5688,  0,     -4410, 0,     2603,
+		4897,  5694,  4332,  -6899, 1905,  1906,  1862,  1863,
+		1864,  -7867, -7867, -8846, -5531, 0,     -7867, 0,
+		-2269, -6003, -6003, 0,     5957,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     -7911, 0,
+		0,     0,     0,     -4600, 0,     0,     4156,  32767,
+		32767, 0,     0,     0,     0,     0,     1796,  0,
+		0,     0,     -1752, 0,     0,     -506,  -2065, 0,
+		0,     0,     0,     0,     0,     0,     4109,  0,
+		4110,  0,     0,     0,     0,     0,     4111,  17372,
+		0,     14058, 10744, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     -4650, 0,     0,     4161,  32767,
+		32767, 4117,  32767, 4118,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -7946, 32767, -4632, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4642,
+		-4642, 4123,  4124,  -4687, 0,     0,     -4644, -4644,
+		0,     0,     -4646, -4646, 32767, 32767, 32767, 32767,
+		32767, 32767, 4084,  4085,  32767, 32767, 1609,  4087,
+		32767, 32767, 4088,  17349, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 10092, 4136,
+		10094, 4138,  10096, 0,     10097, 10098, 10099, 10100,
+		10101, 0,     32767, 32767, 32767, 0,     0,     0,
+		0,     0,     0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     32767, 32767, 0,     10138, 10139,
+		0,     0,     0,     10145, 32767, 32767, 32767, 32767,
+		32767, 32767, -1425, 8316,  2314,  -3642, 32767, 0,
+		32767, 32767, 32767, 32767, -1426, -1426, -1426, -1426,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 52,    52,    52,    52,    52,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 1849,  1850,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		100,   101,   102,   103,   104,   105,   106,   107,
+		108,   -5633, -5633, -5633, -5633, -5633, -5633, -5633,
+		-5633, -5633, -5633, -5633, -5633, -5633, -5633, -5633,
+		-5633, 1985,  1986,  127,   2030,  2031,  2032,  -5034,
+		32767, 32767, 32767, 32767, 32767, 0,     32767, 32767,
+		32767, 5916,  5917,  5918,  5919,  5920,  5921,  5922,
+		5923,  5924,  8824,  5926,  32767, 32767, 0,     32767,
+		0,     5927,  5928,  5929,  5930,  5931,  5932,  5933,
+		5934,  5935,  5936,  5937,  5938,  5939,  5940,  5105,
+		5942,  5943,  5944,  5945,  5946,  5947,  5948,  5949,
+		5950,  5951,  5952,  5953,  5954,  5955,  5956,  5957,
+		32767, 5958,  5959,  5960,  5082,  5082,  5082,  5082,
+		5082,  5082,  5082,  5082,  5969,  5970,  5084,  5972,
+		5053,  5974,  5053,  5053,  5053,  5978,  5979,  5980,
+		5981,  5982,  5983,  5984,  5985,  5986,  5987,  5988,
+		5989,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2552,  32767, 32767, 32767,
+		32767, 32767, 32767, 5990,  5991,  5992,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 5993,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 6936,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 1851,  1852,  1853,  1854,
+		1855,  1856,  1857,  1858,  1859,  1860,  1861,  1862,
+		1863,  1864,  1200,  2121,  1200,  1868,  1869,  1870,
+		1871,  1872,  1873,  1874,  1875,  1876,  1877,  1878,
+		1879,  1880,  1188,  1188,  1188,  1188,  1188,  1188,
+		1188,  1188,  1188,  1188,  1188,  1188,  1188,  1188,
+		1188,  1188,  1188,  1188,  1188,  1188,  -5282, 1188,
+		3483,  1188,  -642,  1188,  -5287, 1188,  -644,  1188,
+		1188,  -5292, 1188,  1188,  1188,  1188,  1188,  1188,
+		1188,  1188,  1188,  1188,  1188,  1188,  1925,  1926,
+		-6187, -6231, 1184,  3465,  1184,  1184,  -6228, 6953,
+		6954,  6955,  6956,  0,     1939,  1940,  1941,  1942,
+		1943,  1944,  1178,  1178,  1947,  1948,  1949,  1950,
+		1951,  1952,  1953,  1954,  1955,  1956,  1957,  1958,
+		1959,  1960,  1961,  1962,  1963,  1964,  1965,  1966,
+		1967,  1968,  1969,  1970,  1971,  1972,  1973,  1974,
+		1975,  1976,  1977,  1978,  1979,  1980,  1981,  1982,
+		1983,  1984,  1985,  1986,  1987,  1988,  1989,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 709,   666,   667,   668,   32767, 669,
+		714,   715,   716,   717,   -6694, 719,   720,   721,
+		32767, 722,   723,   724,   32767, 725,   726,   727,
+		728,   -5013, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 6052,  0,     0,     6055,
+		0,     0,     0,     0,     2293,  0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 1244,  1245,  1246,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4660,
+		-4660, -4660, -4660, 4097,  4098,  -4705, -4705, -4660,
+		-4660, -4660, -4660, 4105,  4106,  -4705, 32767, -4661,
+		-4661, -4661, -4617, -4617, -4663, -4663, -4663, -4663,
+		-4663, -4663, -4663, 4072,  4073,  4074,  4075,  1644,
+		1600,  4078,  4079,  4080,  4081,  17342, 14028, 14029,
+		10715, 10716, 7402,  7403,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     32767, 0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		32767, 0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     1380,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 856,   0,     4573,
+		4574,  0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 0,     0,     0,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		5204,  5161,  5162,  5163,  5164,  5165,  5210,  5211,
+		5212,  5213,  -2198, 5215,  5216,  5217,  5218,  5219,
+		5220,  5221,  5222,  5223,  5224,  5225,  5226,  -515,
+		-515,  -515,  -515,  -515,  -515,  -515,  -515,  -515,
+		-515,  -515,  -515,  -515,  -515,  -515,  -515,  7103,
+		7104,  5245,  5246,  5247,  5248,  5249,  -1014, 5251,
+		5252,  5253,  5254,  5255,  5256,  5257,  5258,  5259,
+		5260,  8663,  8664,  -92,   -92,   8712,  8713,  8669,
+		8670,  8671,  8672,  -92,   -92,   8720,  8721,  8677,
+		8678,  8679,  8636,  8637,  8684,  8685,  8686,  8687,
+		8688,  8689,  8690,  -44,   -44,   -44,   -44,   2388,
+		2433,  -44,   -44,   -44,   -44,   -13304,-9989, -9989,
+		-6674, -6674, -3359, -3359, -44,   -44,   -44,   -44,
+		-44,   8713,  8714,  -89,   -89,   -44,   -44,   -44,
+		-44,   8721,  8722,  -89,   -89,   -44,   -44,   -44,
+		0,     0,     -46,   -46,   -46,   -46,   -46,   -46,
+		-46,   8689,  8690,  8691,  8692,  6261,  6217,  8695,
+		8696,  8697,  8698,  21959, 18645, 18646, 15332, 15333,
+		12019, 12020, 8706,  8707,  8708,  8709,  8710,  -46,
+		-46,   8758,  8759,  8715,  8716,  8717,  8718,  -46,
+		-46,   8766,  8767,  8723,  8724,  8725,  8726,  8727,
+		8728,  8729,  8730,  8731,  8732,  8733,  8734,  0,
+		0,     0,     0,     2432,  2477,  0,     0,     0,
+		0,     -13260,-9945, -9945, -6630, -6630, -3315, -3315,
+		0,     0,     0,     0,     0,     8757,  8758,  -45,
+		-45,   0,     0,     0,     0,     8765,  8766,  -45,
+		-45,   0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     8735,  8736,  8737,
+		8738,  6307,  6263,  8741,  8742,  8743,  8744,  22005,
+		18691, 18692, 15378, 15379, 12065, 12066, 8752,  8753,
+		8754,  8755,  8756,  0,     0,     8804,  8805,  8761,
+		8762,  8763,  8764,  0,     0,     8812,  8813,  8769,
+		6115,  6115,  6115,  6115,  3685,  6115,  6115,  8822,
+		6115,  8824,  14782, 8826,  14784, 8828,  5517,  5518,
+		5519,  -4221, 1782,  7739,  5521,  8836,  5522,  3942,
+		8839,  5523,  5524,  5525,  5526,  5527,  5528,  5529,
+		6127,  5531,  5532,  8850,  5533,  8852,  5534,  8854,
+		8855,  5535,  0,     0,     0,     8860,  8861,  0,
+		0,     0,     13252, 9939,  9939,  6626,  6626,  3313,
+		3313,  0,     0,     0,     -9269, -3312, 0,     0,
+		0,     9741,  32767, 32767, 0,     32767, 0,     32767,
+		32767, 0,     0,     0,     0,     0,     0,     0,
+		-597,  0,     0,     32767, 0,     32767, 0,     32767,
+		32767, 0,     0,     32767, 32767, 32767, 0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     32767, 32767, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     -1387, 0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -1773, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, -4161, 1581,  1582,  32767, 32767, 1990,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 1539,  32767, 32767, 6150,  6151,  6152,  411,
+		411,   411,   411,   411,   411,   411,   411,   411,
+		411,   411,   411,   411,   411,   411,   411,   8029,
+		8030,  6171,  6172,  969,   969,   1013,  1013,  1013,
+		1013,  1013,  969,   969,   969,   969,   8381,  969,
+		969,   969,   969,   969,   969,   969,   969,   969,
+		969,   969,   969,   6711,  6712,  6713,  6714,  6715,
+		6716,  6717,  6718,  6719,  6720,  6721,  6722,  6723,
+		6724,  6725,  6726,  -891,  -891,  969,   969,   6173,
+		6174,  6131,  6132,  6133,  6134,  6135,  6180,  6181,
+		6182,  6183,  -1228, 6185,  6186,  6187,  6188,  6189,
+		6190,  6191,  6192,  6193,  6194,  6195,  6196,  455,
+		455,   455,   455,   455,   455,   455,   455,   455,
+		455,   455,   455,   455,   455,   455,   455,   8073,
+		8074,  6215,  6216,  1013,  1013,  1057,  1057,  1057,
+		1057,  1057,  1013,  1013,  1013,  1013,  8425,  1013,
+		1013,  1013,  1013,  1013,  1013,  1013,  1013,  1013,
+		1013,  1013,  1013,  6755,  6756,  6757,  6758,  6759,
+		6760,  6761,  6762,  6763,  6764,  6765,  6766,  6767,
+		6768,  6769,  6770,  -847,  -847,  1013,  1013,  6217,
+		6218,  6175,  6176,  6177,  6178,  6179,  6224,  6225,
+		6226,  6227,  -1184, 6229,  6230,  6231,  6232,  6233,
+		6234,  6235,  6236,  6237,  6238,  6239,  6240,  499,
+		499,   499,   499,   499,   499,   499,   499,   499,
+		499,   499,   499,   499,   499,   499,   499,   8117,
+		8118,  6259,  6260,  6261,  6262,  6263,  0,     6265,
+		6266,  6267,  6268,  6269,  6270,  6271,  6272,  6273,
+		6274,  9677,  9678,  922,   922,   9726,  9727,  9683,
+		9684,  9685,  9686,  922,   922,   9734,  9735,  9691,
+		9692,  9693,  9650,  9651,  9698,  9699,  9700,  9701,
+		9702,  9703,  9704,  970,   970,   970,   970,   3402,
+		3447,  970,   970,   970,   970,   -12290,-8975, -8975,
+		-5660, -5660, -2345, -2345, -2345, -2345, -2345, 6412,
+		6413,  -2390, -2390, -2345, -2345, -2345, -2345, 6420,
+		6421,  -2390, -2390, -2345, -2345, -2345, -2301, -2301,
+		-2347, -2347, -2347, -2347, -2347, -2347, -2347, 6388,
+		6389,  6390,  6391,  3960,  3916,  6394,  6395,  6396,
+		6397,  19658, 16344, 16345, 13031, 13032, 9718,  9719,
+		6405,  6406,  6407,  6408,  6409,  -2347, -2347, 6457,
+		6458,  6414,  6415,  6416,  6417,  -2347, -2347, 6465,
+		6466,  6422,  6423,  6424,  6381,  6382,  6429,  6430,
+		6431,  6432,  6433,  6434,  6435,  -2299, -2299, -2299,
+		-2299, 133,   178,   -2299, -2299, -2299, -2299, -15559,
+		-12244,-12244,-8929, -8929, -5614, -5614, -2299, -2299,
+		-2299, -2299, -2299, 6458,  6459,  -2344, -2344, -2299,
+		-2299, -2299, -2299, 6466,  6467,  -2344, -2344, -2299,
+		-2299, -2299, -2299, -2299, -2299, -2299, -2299, -2299,
+		-2299, -2299, -2299, 6436,  6437,  6438,  6439,  4008,
+		3964,  6442,  6443,  6444,  6445,  19706, 16392, 16393,
+		13079, 13080, 9766,  9767,  6453,  6454,  6455,  6456,
+		6457,  -2299, -2299, 6505,  6506,  6462,  6463,  6464,
+		6465,  -2299, -2299, 6513,  6514,  6470,  6471,  6472,
+		6473,  6474,  6475,  6476,  6477,  6478,  6479,  6480,
+		6481,  -2253, -2253, -2253, -2253, 179,   224,   -2253,
+		-2253, -2253, -2253, -15513,-12198,-12198,-8883, -8883,
+		-5568, -5568, -2253, -2253, -2253, -2253, -2253, 6504,
+		6505,  -2298, -2298, -2253, -2253, -2253, -2253, 6512,
+		6513,  -2298, -2298, -2253, 402,   403,   404,   405,
+		2836,  407,   408,   -2298, 410,   -2298, -8255, -2298,
+		-8255, -2298, 1014,  1014,  1014,  10755, 4753,  -1203,
+		1016,  -2298, 1017,  2598,  -2298, 1019,  1019,  1019,
+		1019,  1019,  1019,  1019,  422,   1019,  1019,  -2298,
+		1020,  -2298, 1021,  -2298, -2298, 1023,  6559,  6560,
+		6561,  -2298, -2298, 6564,  6565,  6566,  -6685, -3371,
+		-3370, -56,   -55,   3259,  3260,  3261,  12531, 6575,
+		3264,  3265,  3266,  -6474, -471,  5486,  3268,  6583,
+		3269,  1689,  6586,  3270,  3271,  3272,  3273,  3274,
+		3275,  3276,  3874,  3278,  3279,  6597,  3280,  6599,
+		3281,  6601,  6602,  3282,  3283,  32767, 32767, 32767,
+		3284,  3285,  3286,  3287,  3288,  3289,  3290,  3291,
+		3292,  3293,  3294,  3295,  3296,  3297,  3298,  3299,
+		3300,  3301,  3302,  3303,  3304,  3305,  3306,  3307,
+		3308,  3309,  3310,  3311,  3312,  3313,  3314,  3315,
+		3316,  3317,  3318,  3319,  3320,  3321,  3322,  3323,
+		3324,  3325,  3326,  3327,  3328,  3329,  3330,  3331,
+		3332,  3333,  3334,  3335,  3336,  3337,  3338,  3339,
+		3340,  3341,  3342,  3343,  3344,  3345,  3346,  3347,
+		3348,  3349,  3350,  3351,  32767, 32767, 3352,  3353,
+		3354,  3355,  3356,  3357,  3358,  3359,  3360,  3361,
+		3362,  3363,  3364,  3365,  3366,  3367,  3368,  3369,
+		3370,  3371,  3372,  3373,  3374,  3375,  3376,  3377,
+		3378,  3379,  3380,  3381,  3382,  3383,  3384,  3385,
+		3386,  3387,  3388,  3389,  3390,  3391,  3392,  3393,
+		3394,  3395,  3396,  3397,  3398,  3399,  3400,  3401,
+		3402,  3403,  3404,  3405,  3406,  3407,  4795,  3409,
+		3410,  3411,  3412,  3413,  3414,  3415,  3416,  3417,
+		3418,  3419,  3420,  3421,  3422,  3423,  3424,  3425,
+		3426,  3427,  3428,  3429,  3430,  3431,  3432,  3433,
+		3434,  3435,  3436,  3437,  3438,  3439,  3440,  3441,
+		3442,  3443,  3444,  3445,  3446,  3447,  3448,  3449,
+		3450,  3451,  3452,  3453,  3454,  3455,  3456,  3457,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 3458,
+		3459,  3460,  3461,  3462,  -8139, 3464,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 3465,  3466,  2001,  3468,  3469,  32767,
+		32767, 32767, 32767, 32767, 3470,  3471,  3472,  3473,
+		3474,  3475,  3476,  3477,  3478,  3479,  3480,  3481,
+		3482,  3483,  3484,  3485,  3486,  3487,  3488,  3489,
+		3490,  3491,  3492,  3493,  3494,  3495,  32767, 3496,
+		3497,  3498,  3499,  3500,  32767, 3501,  32767, 3502,
+		3503,  32767, 3504,  3505,  32767, 3506,  0,     0,
+		3509,  3510,  3511,  3512,  3513,  3514,  3515,  3516,
+		3517,  3518,  3519,  3520,  3521,  3522,  3523,  3524,
+		3525,  3526,  3527,  3528,  3529,  3530,  3531,  3532,
+		3533,  3534,  3535,  3536,  3537,  3538,  3539,  3540,
+		3541,  3542,  3543,  3544,  3545,  1902,  1902,  1902,
+		1902,  9314,  1902,  1902,  1902,  1902,  1902,  1902,
+		1902,  1902,  1902,  1902,  1902,  1902,  7644,  7645,
+		7646,  7647,  7648,  7649,  7650,  7651,  7652,  7653,
+		7654,  7655,  7656,  7657,  7658,  7659,  42,    42,
+		1902,  0,     0,     0,     7067,  7068,  7069,  7070,
+		7071,  7116,  7117,  7118,  7119,  -292,  7121,  7122,
+		7123,  7124,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     3614,  3615,  3616,  10892, 3618,  3619,
+		10854, 3621,  3622,  3623,  3624,  3625,  8994,  -2751,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     3640,  3641,  2783,  -3331,
+		-3330, 3645,  3646,  0,     6053,  6054,  0,     6056,
+		6057,  6058,  6059,  3767,  6061,  6858,  0,     0,
+		3659,  0,     0,     1531,  1531,  1531,  1531,  1531,
+		1531,  1531,  1531,  1531,  1531,  1531,  1531,  1531,
+		1531,  1531,  9149,  9150,  7291,  7292,  7293,  7294,
+		7295,  1032,  7297,  7298,  7299,  7300,  7301,  7302,
+		7303,  7304,  0,     7307,  10710, 10711, 1955,  1955,
+		10759, 10760, 10716, 4548,  4549,  4550,  1952,  1952,
+		10764, 10765, 10721, 10722, 3711,  6314,  10679, 10726,
+		10727, 10728, 10729, 10730, 3719,  3720,  1996,  1996,
+		1996,  1996,  4428,  4473,  4473,  3728,  1994,  1994,
+		-11266,3732,  3733,  3734,  0,     0,     0,     0,
+		0,     0,     0,     3742,  10755, 10756, 1953,  1953,
+		1998,  1998,  1998,  11730, 11731, 12711, 9397,  3867,
+		11735, 3869,  6139,  9874,  9875,  9876,  9877,  9878,
+		9879,  9880,  6139,  -873,  -873,  7931,  -1839, -1839,
+		7891,  7892,  -1839, -1839, -2818, 497,   6028,  -1839,
+		-1839, -66,   -66,   -66,   -66,   2522,  2523,  -6280,
+		-6280, -6235, -66,   -66,   -66,   2533,  2534,  -6277,
+		-66,   -6231, -6231, 781,   -1821, -6185, -6231, 3867,
+		-1821, -6231, -1821, 782,   3076,  3873,  2511,  -8720,
+		84,    85,    41,    42,    43,    -9688, -9688, -10667,
+		-7352, -1821, -9688, -1821, -4090, -7824, -7824, -7824,
+		-7824, -7824, -7824, -7824, -4082, 2931,  2932,  -5871,
+		3900,  3901,  -5828, -5828, 3904,  3905,  4885,  1571,
+		-3959, 3909,  3910,  2138,  2139,  2140,  2141,  -446,
+		-446,  8358,  8359,  8315,  2147,  2148,  2149,  -449,
+		-449,  8363,  2153,  8319,  8320,  1309,  3912,  8277,
+		8324,  -1773, 3916,  8327,  3918,  1316,  -977,  -1773,
+		-410,  10822, 2019,  2019,  2064,  2064,  2064,  11796,
+		11797, 12777, 9463,  3933,  11801, 3935,  6205,  9940,
+		9941,  9942,  9943,  9944,  9945,  9946,  6205,  -807,
+		-807,  7997,  -1773, -1773, 7957,  7958,  -1773, -1773,
+		-2752, 563,   6094,  -1773, -1773, 0,     0,     0,
+		0,     2588,  2589,  -6214, -6214, -6169, 0,     0,
+		0,     2599,  2600,  -6211, 0,     -6165, -6165, 847,
+		-1755, -6119, -6165, 3933,  -1755, -6165, -1755, 848,
+		3142,  3939,  2577,  -8654, 150,   151,   107,   108,
+		109,   -9622, -9622, -10601,-7286, -1755, -9622, -1755,
+		-4024, -7758, -7758, -7758, -7758, -7758, -7758, -7758,
+		-4016, 2997,  2998,  -5805, 3966,  3967,  -5762, -5762,
+		3970,  3971,  4951,  1637,  -3893, 3975,  3976,  2204,
+		2205,  2206,  2207,  -380,  -380,  8424,  8425,  8381,
+		2213,  2214,  2215,  -383,  -383,  8429,  2219,  8385,
+		8386,  1375,  3978,  8343,  8390,  -1707, 3982,  8393,
+		3984,  1382,  -911,  -1707, -344,  10888, 2085,  2085,
+		2130,  2130,  2130,  11862, 11863, 12843, 9529,  3999,
+		11867, 4001,  6271,  10006, 10007, 4005,  -1951, 4007,
+		4008,  4009,  4010,  4011,  4012,  4013,  4014,  4015,
+		4016,  4017,  4018,  4019,  4020,  4021,  4022,  4023,
+		4024,  4025,  4026,  4027,  4028,  4029,  4030,  4031,
+		11943, 4033,  4034,  4035,  4036,  8637,  4038,  4039,
+		-116,  32767, 32767, 4041,  4042,  4043,  4044,  4045,
+		2250,  4047,  4048,  4049,  5802,  4051,  4052,  4559,
+		6119,  4055,  4056,  4057,  4058,  4059,  4060,  4061,
+		-47,   4063,  -46,   4065,  4066,  4067,  4068,  4069,
+		-41,   -13301,4072,  -9985, -6670, 4075,  4076,  4077,
+		4078,  4079,  4080,  4081,  4082,  4083,  4084,  4085,
+		4086,  4087,  4088,  4089,  4090,  8741,  4092,  4093,
+		-67,   32767, 32767, 32767, 32767, 32767, 2257,  32767,
+		2258,  2259,  2260,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2261,  32767, 2262,  32767,
+		2263,  32767, 2264,  32767, 2265,  32767, 2266,  32767,
+		2267,  8737,  8738,  -26,   -26,   8786,  4100,  4101,
+		8746,  8747,  4104,  4105,  8752,  8753,  32767, 2274,
+		32767, 2275,  32767, 32767, 32767, 32767, 32767, 32767,
+		2276,  2277,  32767, 2278,  2279,  32767, 2280,  0,
+		32767, 2282,  9695,  4109,  -3486, -3486, 4112,  4113,
+		4114,  4115,  4116,  4117,  32767, 32767, 32767, 32767,
+		32767, 32767, 4118,  4119,  4120,  4121,  4122,  4123,
+		4124,  4125,  4126,  4127,  4128,  4129,  4130,  4131,
+		4132,  4133,  4134,  4849,  4136,  4137,  4851,  4851,
+		4140,  4852,  4142,  4143,  4144,  4145,  4146,  4147,
+		4148,  4149,  4150,  4151,  2293,  4153,  907,   32767,
+		2295,  4155,  909,   4157,  910,   4159,  911,   4161,
+		912,   4163,  913,   4165,  914,   32767, 915,   4168,
+		916,   4170,  917,   4172,  4173,  918,   4175,  4176,
+		4177,  4178,  4179,  4180,  4181,  4182,  4183,  4184,
+		4185,  2309,  4186,  4187,  4188,  4189,  2312,  2313,
+		32767, 2314,  4190,  4191,  -2632, 2317,  4193,  32767,
+		4194,  4195,  4196,  4197,  4198,  4199,  4200,  4201,
+		4202,  4203,  4204,  4205,  4206,  0,     0,     4209,
+		4210,  4211,  4212,  4213,  2318,  4215,  4216,  2319,
+		2320,  2321,  2322,  4221,  4222,  4223,  2323,  2324,
+		4226,  4227,  4228,  4229,  4230,  4231,  5551,  4233,
+		4234,  4235,  4236,  4237,  4238,  4239,  4240,  4241,
+		4242,  4243,  4244,  4245,  4246,  4247,  4248,  4249,
+		4250,  4251,  4252,  4253,  4254,  4255,  4256,  4257,
+		4258,  4259,  4260,  4261,  4262,  4263,  4264,  4265,
+		4266,  4267,  4268,  4269,  4270,  4271,  4272,  4273,
+		4274,  4275,  -3342, -3342, -3342, 4276,  4277,  2418,
+		2419,  -2784, -2784, -2740, -2740, -2740, -2740, -2740,
+		-2784, -2784, -2784, -2784, 4628,  -2784, -2784, -2784,
+		-2784, -2784, -2784, -2784, -2784, -2784, -2784, -2784,
+		-2784, 2958,  2959,  2960,  2961,  2962,  2963,  2964,
+		2965,  2966,  2967,  2968,  2969,  2970,  2971,  2972,
+		2973,  -4644, -4644, -2784, -2784, 2420,  2421,  2378,
+		2379,  2380,  2381,  2382,  2427,  2428,  2429,  2430,
+		-4981, 2432,  2433,  2434,  2435,  2436,  2437,  2438,
+		2439,  2440,  2441,  2442,  2443,  -3298, -3298, -3298,
+		-3298, -3298, -3298, -3298, -3298, -3298, -3298, -3298,
+		-3298, -3298, -3298, -3298, -3298, 4320,  4321,  2462,
+		4365,  4366,  4367,  -2699, -2699, -2699, -2699, -2699,
+		-2743, -2743, -2743, -2743, 4669,  -2743, -2743, -2743,
+		-2743, 4382,  4383,  4384,  4385,  4386,  4387,  4388,
+		4389,  4390,  4391,  4392,  4393,  4394,  4395,  4396,
+		4397,  4398,  4399,  4400,  4401,  4402,  4403,  4404,
+		4405,  4406,  4407,  4408,  4409,  4410,  4411,  4412,
+		4413,  4414,  4415,  4416,  4417,  4418,  4419,  4420,
+		4421,  4422,  4423,  4424,  4425,  4426,  4427,  4428,
+		4429,  816,   816,   816,   -6459, 816,   816,   -6418,
+		816,   816,   816,   816,   816,   -4552, 7194,  4444,
+		4445,  4446,  4447,  4448,  4449,  4450,  4451,  4452,
+		4453,  4454,  4455,  816,   816,   1675,  7790,  7790,
+		816,   816,   4463,  -1589, -1589, 4466,  -1589, -1589,
+		-1589, -1589, 704,   -1589, -2385, 4474,  4475,  817,
+		4477,  4478,  2948,  2949,  2950,  2951,  2952,  2953,
+		2954,  2955,  2956,  2957,  2958,  2959,  2960,  2961,
+		2962,  -4655, -4655, -2795, -2795, -2795, -2795, -2795,
+		3469,  -2795, -2795, -2795, -2795, -2795, -2795, -2795,
+		-2795, 4510,  -2796, -6198, -6198, 2559,  2560,  -6243,
+		-6243, -6198, -6198, -6198, -6198, 2567,  2568,  -6243,
+		-6243, -6198, -6198, -6198, -6154, -6154, -6200, -6200,
+		-6200, -6200, -6200, -6200, -6200, 2535,  2536,  2537,
+		2538,  107,   63,    2541,  2542,  2543,  2544,  15805,
+		12491, 12492, 32767, 4540,  4541,  4542,  4543,  4544,
+		4545,  4546,  2548,  -6208, -6208, 2596,  2597,  2553,
+		2554,  2555,  2556,  -6208, -6208, 2604,  2605,  2561,
+		2562,  2563,  2520,  2521,  2568,  2569,  2570,  2571,
+		2572,  2573,  2574,  -6160, -6160, -6160, -6160, -3728,
+		-3683, -6160, -6160, -6160, -6160, -19420,-16105,-16105,
+		-12790,-12790,-9475, -9475, -6160, -6160, -6160, -6160,
+		-6160, 32767, 2597,  -6206, -6206, -6161, -6161, -6161,
+		-6161, 2604,  2605,  -6206, -6206, -6161, -6161, -6161,
+		-6161, -6161, -6161, -6161, -6161, -6161, -6161, -6161,
+		-6161, 2574,  2575,  2576,  2577,  146,   102,   2580,
+		2581,  2582,  2583,  15844, 12530, 12531, 9217,  9218,
+		5904,  5905,  2591,  2592,  2593,  2594,  2595,  -6161,
+		-6161, 2643,  2644,  2600,  2601,  2602,  2603,  -6161,
+		-6161, 2651,  2652,  2608,  2609,  2610,  2611,  2612,
+		2613,  2614,  2615,  2616,  2617,  2618,  2619,  -6115,
+		-6115, -6115, -6115, -3683, -3638, -6115, -6115, -6115,
+		-6115, -19375,-16060,-16060,-12745,-12745,-9430, -9430,
+		-6115, -6115, -6115, -6115, -6115, 2642,  2643,  -6160,
+		-6160, -6115, -6115, -6115, -6115, 2650,  2651,  -6160,
+		-6160, -6115, -3460, -3459, -3458, -3457, -1026, -3455,
+		-3454, -6160, -3452, -6160, -12117,-6160, -12117,-6160,
+		-2848, -2848, -2848, 6893,  891,   -5065, -2846, -6160,
+		-2845, -1264, 0,     9264,  5950,  5951,  2637,  2638,
+		2639,  2640,  2641,  -6115, -6115, 2689,  2690,  2646,
+		2647,  2648,  2649,  -6115, -6115, 2697,  2698,  2654,
+		0,     0,     0,     0,     -2430, 0,     0,     2707,
+		0,     2709,  8667,  2711,  8669,  2713,  -598,  -597,
+		-596,  -10336,-4333, 1624,  -594,  2721,  -593,  -2173,
+		2724,  -592,  -591,  -590,  -589,  -588,  -587,  -586,
+		12,    -584,  -583,  2735,  -582,  2737,  -581,  2739,
+		2740,  -580,  -6115, -6115, -6115, 2745,  2746,  -6115,
+		-6115, 0,     0,     0,     2752,  2753,  2754,  0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     6247,  6248,  0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 1;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 8191 + c;
+	}
+	return h[a % 13209] + h[b % 13209];
+}
+
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo =
+{
+	UnicodeDecompMain,
+	Decomp_hash_func,
+	6604
+};
diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns
index 86bdd9d6dc..738169f6cd 100644
--- a/src/tools/pgindent/exclude_file_patterns
+++ b/src/tools/pgindent/exclude_file_patterns
@@ -18,9 +18,11 @@ src/backend/utils/fmgrprotos\.h$
 # they match pgindent style, they'd look worse not better, so exclude them.
 kwlist_d\.h$
 #
-# This is generated by the scripts from src/common/unicode/.  It uses
+# These are generated by the scripts from src/common/unicode/.  They use
 # hash functions generated by PerfectHash.pm whose format looks worse with
 # pgindent.
+src/include/common/unicode_norm_hashfunc\.h$
+src/include/common/unicode_norm_table\.h$
 src/include/common/unicode_normprops_table\.h$
 #
 # Exclude ecpg test files to avoid breaking the ecpg regression tests
-- 
2.22.0

v3-0002-Speed-up-unicode-recomposition.patchapplication/octet-stream; name=v3-0002-Speed-up-unicode-recomposition.patchDownload
From 376c450a3e0fa883d7670a3a248ed7d213b93296 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Wed, 21 Oct 2020 18:27:09 -0400
Subject: [PATCH v3 2/2] Speed up unicode recomposition.

As with 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 more than 40x 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    |  113 ++
 src/common/unicode_norm.c                     |   37 +-
 src/include/common/unicode_norm_hashfunc.h    | 1220 +++++++++++++++++
 3 files changed, 1368 insertions(+), 2 deletions(-)

diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 5fca88796f..6bbe81f17d 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -144,6 +144,7 @@ print $OF <<HEADER;
 typedef int (*cp_hash_func) (const void *key);
 
 /* Information for lookups with perfect hash functions */
+
 typedef struct
 {
 	const pg_unicode_decomposition *decomps;
@@ -151,11 +152,20 @@ typedef struct
 	int		num_decomps;
 } pg_unicode_decompinfo;
 
+typedef struct
+{
+	const uint16	*inverse_lookup;
+	cp_hash_func	hash;
+	int		num_recomps;
+} pg_unicode_recompinfo;
+
 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)
@@ -217,6 +227,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)
@@ -255,6 +277,8 @@ foreach my $char (@characters)
 
 	print $OT "\t/* $comment */" if ($comment ne "");
 	print $OT "\n";
+
+	$main_index++;
 }
 print $OT "\n};\n\n";
 
@@ -284,7 +308,96 @@ static const pg_unicode_decompinfo UnicodeDecompInfo =
 	$dec_funcname,
 	$num_characters
 };
+
+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;
+my $firstentry = 1;
+foreach my $rec (sort recomp_sort @rec_info)
+{
+	# The hash key is formed by concatenating the bytes of the two
+	# codepoints. See also recompose_code() in common/unicode_norm.c.
+	my $hashkey = (hex($rec->{first}) << 32) | hex($rec->{second});
+
+	# We are only interested in the lowest code point that decomposes
+	# to the given code pair.
+	next if $seenit{$hashkey};
+
+	# Save the hash key bytes in network order
+	push @rec_cp_packed, pack('Q>', $hashkey);
+
+	# Append inverse lookup element
+	$recomp_string .= ",\n" if ! $firstentry;
+	$recomp_string .= sprintf "\t/* U+%s+%s -> U+%s */ %s",
+		$rec->{first},
+		$rec->{second},
+		$rec->{code},
+		$rec->{main_index};
+
+	$seenit{$hashkey} = 1;
+	$firstentry = 0;
+}
+
+# Emit the inverse lookup array containing indexes into UnicodeDecompMain
+my $num_recomps = scalar @rec_cp_packed;
+print $OF <<HEADER;
+/* Inverse lookup array -- contains indexes into UnicodeDecompMain[] */
+static const uint16 RecompInverseLookup[$num_recomps] =
+{
+$recomp_string
+};
+
+HEADER
+
+# Emit the definition of the recomp hash function.
+my $rec_funcname = 'Recomp_hash_func';
+my $rec_func        = PerfectHash::generate_hash_function(\@rec_cp_packed, $rec_funcname,
+	fixed_key_length => 8);
+print $OF "/* Perfect hash function for recomposition */\n";
+print $OF "static $rec_func\n";
+
+# Emit the structure that wraps the hash lookup information into
+# one variable.
+print $OF <<HEADER;
+/* Hash lookup information for recomposition */
+static const pg_unicode_recompinfo UnicodeRecompInfo =
+{
+	RecompInverseLookup,
+	$rec_funcname,
+	$num_recomps
+};
 HEADER
 
 close $OT;
 close $OF;
+
+sub recomp_sort
+{
+	my $a1 = hex($a->{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 code point
+	return -1 if $a2 < $b2;
+	return 1 if $a2 > $b2;
+
+	# Finally by the code point that decomposes into first and second.
+
+	my $acode = hex($a->{code});
+	my $bcode = hex($b->{code});
+
+	return -1 if $acode < $bcode;
+	return -1 if $acode > $bcode;
+
+	die "found duplicate entries of recomposeable code pairs";
+}
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 7d0d23ab21..da7e6f8fa1 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -228,7 +228,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
@@ -236,9 +236,41 @@ 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;
+
+		/*
+		 * Compute the hash function. The hash key is formed by concatenating
+		 * bytes of the two codepoints in network order. See also
+		 * common/unicode/generate-unicode_norm_table.pl.
+		 */
+		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;
@@ -253,6 +285,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 				return true;
 			}
 		}
+#endif							/* !FRONTEND */
 	}
 
 	return false;
diff --git a/src/include/common/unicode_norm_hashfunc.h b/src/include/common/unicode_norm_hashfunc.h
index d2f4ad884b..39b7138f2b 100644
--- a/src/include/common/unicode_norm_hashfunc.h
+++ b/src/include/common/unicode_norm_hashfunc.h
@@ -23,6 +23,7 @@
 typedef int (*cp_hash_func) (const void *key);
 
 /* Information for lookups with perfect hash functions */
+
 typedef struct
 {
 	const pg_unicode_decomposition *decomps;
@@ -30,6 +31,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;
+
 /* Perfect hash function for decomposition */
 static int
 Decomp_hash_func(const void *key)
@@ -1711,3 +1719,1215 @@ static const pg_unicode_decompinfo UnicodeDecompInfo =
 	Decomp_hash_func,
 	6604
 };
+
+/* Inverse lookup array -- contains indexes into UnicodeDecompMain[] */
+static const uint16 RecompInverseLookup[941] =
+{
+	/* U+003C+0338 -> U+226E */ 1823,
+	/* U+003D+0338 -> U+2260 */ 1820,
+	/* U+003E+0338 -> U+226F */ 1824,
+	/* U+0041+0300 -> U+00C0 */ 14,
+	/* U+0041+0301 -> U+00C1 */ 15,
+	/* U+0041+0302 -> U+00C2 */ 16,
+	/* U+0041+0303 -> U+00C3 */ 17,
+	/* U+0041+0304 -> U+0100 */ 67,
+	/* U+0041+0306 -> U+0102 */ 69,
+	/* U+0041+0307 -> U+0226 */ 270,
+	/* U+0041+0308 -> U+00C4 */ 18,
+	/* U+0041+0309 -> U+1EA2 */ 1278,
+	/* U+0041+030A -> U+00C5 */ 19,
+	/* U+0041+030C -> U+01CD */ 194,
+	/* U+0041+030F -> U+0200 */ 240,
+	/* U+0041+0311 -> U+0202 */ 242,
+	/* U+0041+0323 -> U+1EA0 */ 1276,
+	/* U+0041+0325 -> U+1E00 */ 1120,
+	/* U+0041+0328 -> U+0104 */ 71,
+	/* U+0042+0307 -> U+1E02 */ 1122,
+	/* U+0042+0323 -> U+1E04 */ 1124,
+	/* U+0042+0331 -> U+1E06 */ 1126,
+	/* U+0043+0301 -> U+0106 */ 73,
+	/* U+0043+0302 -> U+0108 */ 75,
+	/* U+0043+0307 -> U+010A */ 77,
+	/* U+0043+030C -> U+010C */ 79,
+	/* U+0043+0327 -> U+00C7 */ 20,
+	/* U+0044+0307 -> U+1E0A */ 1130,
+	/* U+0044+030C -> U+010E */ 81,
+	/* U+0044+0323 -> U+1E0C */ 1132,
+	/* U+0044+0327 -> U+1E10 */ 1136,
+	/* U+0044+032D -> U+1E12 */ 1138,
+	/* U+0044+0331 -> U+1E0E */ 1134,
+	/* U+0045+0300 -> U+00C8 */ 21,
+	/* U+0045+0301 -> U+00C9 */ 22,
+	/* U+0045+0302 -> U+00CA */ 23,
+	/* U+0045+0303 -> U+1EBC */ 1304,
+	/* U+0045+0304 -> U+0112 */ 83,
+	/* U+0045+0306 -> U+0114 */ 85,
+	/* U+0045+0307 -> U+0116 */ 87,
+	/* U+0045+0308 -> U+00CB */ 24,
+	/* U+0045+0309 -> U+1EBA */ 1302,
+	/* U+0045+030C -> U+011A */ 91,
+	/* U+0045+030F -> U+0204 */ 244,
+	/* U+0045+0311 -> U+0206 */ 246,
+	/* U+0045+0323 -> U+1EB8 */ 1300,
+	/* U+0045+0327 -> U+0228 */ 272,
+	/* U+0045+0328 -> U+0118 */ 89,
+	/* U+0045+032D -> U+1E18 */ 1144,
+	/* U+0045+0330 -> U+1E1A */ 1146,
+	/* U+0046+0307 -> U+1E1E */ 1150,
+	/* U+0047+0301 -> U+01F4 */ 230,
+	/* U+0047+0302 -> U+011C */ 93,
+	/* U+0047+0304 -> U+1E20 */ 1152,
+	/* U+0047+0306 -> U+011E */ 95,
+	/* U+0047+0307 -> U+0120 */ 97,
+	/* U+0047+030C -> U+01E6 */ 216,
+	/* U+0047+0327 -> U+0122 */ 99,
+	/* U+0048+0302 -> U+0124 */ 101,
+	/* U+0048+0307 -> U+1E22 */ 1154,
+	/* U+0048+0308 -> U+1E26 */ 1158,
+	/* U+0048+030C -> U+021E */ 268,
+	/* U+0048+0323 -> U+1E24 */ 1156,
+	/* U+0048+0327 -> U+1E28 */ 1160,
+	/* U+0048+032E -> U+1E2A */ 1162,
+	/* U+0049+0300 -> U+00CC */ 25,
+	/* U+0049+0301 -> U+00CD */ 26,
+	/* U+0049+0302 -> U+00CE */ 27,
+	/* U+0049+0303 -> U+0128 */ 103,
+	/* U+0049+0304 -> U+012A */ 105,
+	/* U+0049+0306 -> U+012C */ 107,
+	/* U+0049+0307 -> U+0130 */ 111,
+	/* U+0049+0308 -> U+00CF */ 28,
+	/* U+0049+0309 -> U+1EC8 */ 1316,
+	/* U+0049+030C -> U+01CF */ 196,
+	/* U+0049+030F -> U+0208 */ 248,
+	/* U+0049+0311 -> U+020A */ 250,
+	/* U+0049+0323 -> U+1ECA */ 1318,
+	/* U+0049+0328 -> U+012E */ 109,
+	/* U+0049+0330 -> U+1E2C */ 1164,
+	/* U+004A+0302 -> U+0134 */ 114,
+	/* U+004B+0301 -> U+1E30 */ 1168,
+	/* U+004B+030C -> U+01E8 */ 218,
+	/* U+004B+0323 -> U+1E32 */ 1170,
+	/* U+004B+0327 -> U+0136 */ 116,
+	/* U+004B+0331 -> U+1E34 */ 1172,
+	/* U+004C+0301 -> U+0139 */ 118,
+	/* U+004C+030C -> U+013D */ 122,
+	/* U+004C+0323 -> U+1E36 */ 1174,
+	/* U+004C+0327 -> U+013B */ 120,
+	/* U+004C+032D -> U+1E3C */ 1180,
+	/* U+004C+0331 -> U+1E3A */ 1178,
+	/* U+004D+0301 -> U+1E3E */ 1182,
+	/* U+004D+0307 -> U+1E40 */ 1184,
+	/* U+004D+0323 -> U+1E42 */ 1186,
+	/* U+004E+0300 -> U+01F8 */ 232,
+	/* U+004E+0301 -> U+0143 */ 126,
+	/* U+004E+0303 -> U+00D1 */ 29,
+	/* U+004E+0307 -> U+1E44 */ 1188,
+	/* U+004E+030C -> U+0147 */ 130,
+	/* U+004E+0323 -> U+1E46 */ 1190,
+	/* U+004E+0327 -> U+0145 */ 128,
+	/* U+004E+032D -> U+1E4A */ 1194,
+	/* U+004E+0331 -> U+1E48 */ 1192,
+	/* U+004F+0300 -> U+00D2 */ 30,
+	/* U+004F+0301 -> U+00D3 */ 31,
+	/* U+004F+0302 -> U+00D4 */ 32,
+	/* U+004F+0303 -> U+00D5 */ 33,
+	/* U+004F+0304 -> U+014C */ 133,
+	/* U+004F+0306 -> U+014E */ 135,
+	/* U+004F+0307 -> U+022E */ 278,
+	/* U+004F+0308 -> U+00D6 */ 34,
+	/* U+004F+0309 -> U+1ECE */ 1322,
+	/* U+004F+030B -> U+0150 */ 137,
+	/* U+004F+030C -> U+01D1 */ 198,
+	/* U+004F+030F -> U+020C */ 252,
+	/* U+004F+0311 -> U+020E */ 254,
+	/* U+004F+031B -> U+01A0 */ 181,
+	/* U+004F+0323 -> U+1ECC */ 1320,
+	/* U+004F+0328 -> U+01EA */ 220,
+	/* U+0050+0301 -> U+1E54 */ 1204,
+	/* U+0050+0307 -> U+1E56 */ 1206,
+	/* U+0052+0301 -> U+0154 */ 139,
+	/* U+0052+0307 -> U+1E58 */ 1208,
+	/* U+0052+030C -> U+0158 */ 143,
+	/* U+0052+030F -> U+0210 */ 256,
+	/* U+0052+0311 -> U+0212 */ 258,
+	/* U+0052+0323 -> U+1E5A */ 1210,
+	/* U+0052+0327 -> U+0156 */ 141,
+	/* U+0052+0331 -> U+1E5E */ 1214,
+	/* U+0053+0301 -> U+015A */ 145,
+	/* U+0053+0302 -> U+015C */ 147,
+	/* U+0053+0307 -> U+1E60 */ 1216,
+	/* U+0053+030C -> U+0160 */ 151,
+	/* U+0053+0323 -> U+1E62 */ 1218,
+	/* U+0053+0326 -> U+0218 */ 264,
+	/* U+0053+0327 -> U+015E */ 149,
+	/* U+0054+0307 -> U+1E6A */ 1226,
+	/* U+0054+030C -> U+0164 */ 155,
+	/* U+0054+0323 -> U+1E6C */ 1228,
+	/* U+0054+0326 -> U+021A */ 266,
+	/* U+0054+0327 -> U+0162 */ 153,
+	/* U+0054+032D -> U+1E70 */ 1232,
+	/* U+0054+0331 -> U+1E6E */ 1230,
+	/* U+0055+0300 -> U+00D9 */ 35,
+	/* U+0055+0301 -> U+00DA */ 36,
+	/* U+0055+0302 -> U+00DB */ 37,
+	/* U+0055+0303 -> U+0168 */ 157,
+	/* U+0055+0304 -> U+016A */ 159,
+	/* U+0055+0306 -> U+016C */ 161,
+	/* U+0055+0308 -> U+00DC */ 38,
+	/* U+0055+0309 -> U+1EE6 */ 1346,
+	/* U+0055+030A -> U+016E */ 163,
+	/* U+0055+030B -> U+0170 */ 165,
+	/* U+0055+030C -> U+01D3 */ 200,
+	/* U+0055+030F -> U+0214 */ 260,
+	/* U+0055+0311 -> U+0216 */ 262,
+	/* U+0055+031B -> U+01AF */ 183,
+	/* U+0055+0323 -> U+1EE4 */ 1344,
+	/* U+0055+0324 -> U+1E72 */ 1234,
+	/* U+0055+0328 -> U+0172 */ 167,
+	/* U+0055+032D -> U+1E76 */ 1238,
+	/* U+0055+0330 -> U+1E74 */ 1236,
+	/* U+0056+0303 -> U+1E7C */ 1244,
+	/* U+0056+0323 -> U+1E7E */ 1246,
+	/* U+0057+0300 -> U+1E80 */ 1248,
+	/* U+0057+0301 -> U+1E82 */ 1250,
+	/* U+0057+0302 -> U+0174 */ 169,
+	/* U+0057+0307 -> U+1E86 */ 1254,
+	/* U+0057+0308 -> U+1E84 */ 1252,
+	/* U+0057+0323 -> U+1E88 */ 1256,
+	/* U+0058+0307 -> U+1E8A */ 1258,
+	/* U+0058+0308 -> U+1E8C */ 1260,
+	/* U+0059+0300 -> U+1EF2 */ 1358,
+	/* U+0059+0301 -> U+00DD */ 39,
+	/* U+0059+0302 -> U+0176 */ 171,
+	/* U+0059+0303 -> U+1EF8 */ 1364,
+	/* U+0059+0304 -> U+0232 */ 282,
+	/* U+0059+0307 -> U+1E8E */ 1262,
+	/* U+0059+0308 -> U+0178 */ 173,
+	/* U+0059+0309 -> U+1EF6 */ 1362,
+	/* U+0059+0323 -> U+1EF4 */ 1360,
+	/* U+005A+0301 -> U+0179 */ 174,
+	/* U+005A+0302 -> U+1E90 */ 1264,
+	/* U+005A+0307 -> U+017B */ 176,
+	/* U+005A+030C -> U+017D */ 178,
+	/* U+005A+0323 -> U+1E92 */ 1266,
+	/* U+005A+0331 -> U+1E94 */ 1268,
+	/* U+0061+0300 -> U+00E0 */ 40,
+	/* U+0061+0301 -> U+00E1 */ 41,
+	/* U+0061+0302 -> U+00E2 */ 42,
+	/* U+0061+0303 -> U+00E3 */ 43,
+	/* U+0061+0304 -> U+0101 */ 68,
+	/* U+0061+0306 -> U+0103 */ 70,
+	/* U+0061+0307 -> U+0227 */ 271,
+	/* U+0061+0308 -> U+00E4 */ 44,
+	/* U+0061+0309 -> U+1EA3 */ 1279,
+	/* U+0061+030A -> U+00E5 */ 45,
+	/* U+0061+030C -> U+01CE */ 195,
+	/* U+0061+030F -> U+0201 */ 241,
+	/* U+0061+0311 -> U+0203 */ 243,
+	/* U+0061+0323 -> U+1EA1 */ 1277,
+	/* U+0061+0325 -> U+1E01 */ 1121,
+	/* U+0061+0328 -> U+0105 */ 72,
+	/* U+0062+0307 -> U+1E03 */ 1123,
+	/* U+0062+0323 -> U+1E05 */ 1125,
+	/* U+0062+0331 -> U+1E07 */ 1127,
+	/* U+0063+0301 -> U+0107 */ 74,
+	/* U+0063+0302 -> U+0109 */ 76,
+	/* U+0063+0307 -> U+010B */ 78,
+	/* U+0063+030C -> U+010D */ 80,
+	/* U+0063+0327 -> U+00E7 */ 46,
+	/* U+0064+0307 -> U+1E0B */ 1131,
+	/* U+0064+030C -> U+010F */ 82,
+	/* U+0064+0323 -> U+1E0D */ 1133,
+	/* U+0064+0327 -> U+1E11 */ 1137,
+	/* U+0064+032D -> U+1E13 */ 1139,
+	/* U+0064+0331 -> U+1E0F */ 1135,
+	/* U+0065+0300 -> U+00E8 */ 47,
+	/* U+0065+0301 -> U+00E9 */ 48,
+	/* U+0065+0302 -> U+00EA */ 49,
+	/* U+0065+0303 -> U+1EBD */ 1305,
+	/* U+0065+0304 -> U+0113 */ 84,
+	/* U+0065+0306 -> U+0115 */ 86,
+	/* U+0065+0307 -> U+0117 */ 88,
+	/* U+0065+0308 -> U+00EB */ 50,
+	/* U+0065+0309 -> U+1EBB */ 1303,
+	/* U+0065+030C -> U+011B */ 92,
+	/* U+0065+030F -> U+0205 */ 245,
+	/* U+0065+0311 -> U+0207 */ 247,
+	/* U+0065+0323 -> U+1EB9 */ 1301,
+	/* U+0065+0327 -> U+0229 */ 273,
+	/* U+0065+0328 -> U+0119 */ 90,
+	/* U+0065+032D -> U+1E19 */ 1145,
+	/* U+0065+0330 -> U+1E1B */ 1147,
+	/* U+0066+0307 -> U+1E1F */ 1151,
+	/* U+0067+0301 -> U+01F5 */ 231,
+	/* U+0067+0302 -> U+011D */ 94,
+	/* U+0067+0304 -> U+1E21 */ 1153,
+	/* U+0067+0306 -> U+011F */ 96,
+	/* U+0067+0307 -> U+0121 */ 98,
+	/* U+0067+030C -> U+01E7 */ 217,
+	/* U+0067+0327 -> U+0123 */ 100,
+	/* U+0068+0302 -> U+0125 */ 102,
+	/* U+0068+0307 -> U+1E23 */ 1155,
+	/* U+0068+0308 -> U+1E27 */ 1159,
+	/* U+0068+030C -> U+021F */ 269,
+	/* U+0068+0323 -> U+1E25 */ 1157,
+	/* U+0068+0327 -> U+1E29 */ 1161,
+	/* U+0068+032E -> U+1E2B */ 1163,
+	/* U+0068+0331 -> U+1E96 */ 1270,
+	/* U+0069+0300 -> U+00EC */ 51,
+	/* U+0069+0301 -> U+00ED */ 52,
+	/* U+0069+0302 -> U+00EE */ 53,
+	/* U+0069+0303 -> U+0129 */ 104,
+	/* U+0069+0304 -> U+012B */ 106,
+	/* U+0069+0306 -> U+012D */ 108,
+	/* U+0069+0308 -> U+00EF */ 54,
+	/* U+0069+0309 -> U+1EC9 */ 1317,
+	/* U+0069+030C -> U+01D0 */ 197,
+	/* U+0069+030F -> U+0209 */ 249,
+	/* U+0069+0311 -> U+020B */ 251,
+	/* U+0069+0323 -> U+1ECB */ 1319,
+	/* U+0069+0328 -> U+012F */ 110,
+	/* U+0069+0330 -> U+1E2D */ 1165,
+	/* U+006A+0302 -> U+0135 */ 115,
+	/* U+006A+030C -> U+01F0 */ 226,
+	/* U+006B+0301 -> U+1E31 */ 1169,
+	/* U+006B+030C -> U+01E9 */ 219,
+	/* U+006B+0323 -> U+1E33 */ 1171,
+	/* U+006B+0327 -> U+0137 */ 117,
+	/* U+006B+0331 -> U+1E35 */ 1173,
+	/* U+006C+0301 -> U+013A */ 119,
+	/* U+006C+030C -> U+013E */ 123,
+	/* U+006C+0323 -> U+1E37 */ 1175,
+	/* U+006C+0327 -> U+013C */ 121,
+	/* U+006C+032D -> U+1E3D */ 1181,
+	/* U+006C+0331 -> U+1E3B */ 1179,
+	/* U+006D+0301 -> U+1E3F */ 1183,
+	/* U+006D+0307 -> U+1E41 */ 1185,
+	/* U+006D+0323 -> U+1E43 */ 1187,
+	/* U+006E+0300 -> U+01F9 */ 233,
+	/* U+006E+0301 -> U+0144 */ 127,
+	/* U+006E+0303 -> U+00F1 */ 55,
+	/* U+006E+0307 -> U+1E45 */ 1189,
+	/* U+006E+030C -> U+0148 */ 131,
+	/* U+006E+0323 -> U+1E47 */ 1191,
+	/* U+006E+0327 -> U+0146 */ 129,
+	/* U+006E+032D -> U+1E4B */ 1195,
+	/* U+006E+0331 -> U+1E49 */ 1193,
+	/* U+006F+0300 -> U+00F2 */ 56,
+	/* U+006F+0301 -> U+00F3 */ 57,
+	/* U+006F+0302 -> U+00F4 */ 58,
+	/* U+006F+0303 -> U+00F5 */ 59,
+	/* U+006F+0304 -> U+014D */ 134,
+	/* U+006F+0306 -> U+014F */ 136,
+	/* U+006F+0307 -> U+022F */ 279,
+	/* U+006F+0308 -> U+00F6 */ 60,
+	/* U+006F+0309 -> U+1ECF */ 1323,
+	/* U+006F+030B -> U+0151 */ 138,
+	/* U+006F+030C -> U+01D2 */ 199,
+	/* U+006F+030F -> U+020D */ 253,
+	/* U+006F+0311 -> U+020F */ 255,
+	/* U+006F+031B -> U+01A1 */ 182,
+	/* U+006F+0323 -> U+1ECD */ 1321,
+	/* U+006F+0328 -> U+01EB */ 221,
+	/* U+0070+0301 -> U+1E55 */ 1205,
+	/* U+0070+0307 -> U+1E57 */ 1207,
+	/* U+0072+0301 -> U+0155 */ 140,
+	/* U+0072+0307 -> U+1E59 */ 1209,
+	/* U+0072+030C -> U+0159 */ 144,
+	/* U+0072+030F -> U+0211 */ 257,
+	/* U+0072+0311 -> U+0213 */ 259,
+	/* U+0072+0323 -> U+1E5B */ 1211,
+	/* U+0072+0327 -> U+0157 */ 142,
+	/* U+0072+0331 -> U+1E5F */ 1215,
+	/* U+0073+0301 -> U+015B */ 146,
+	/* U+0073+0302 -> U+015D */ 148,
+	/* U+0073+0307 -> U+1E61 */ 1217,
+	/* U+0073+030C -> U+0161 */ 152,
+	/* U+0073+0323 -> U+1E63 */ 1219,
+	/* U+0073+0326 -> U+0219 */ 265,
+	/* U+0073+0327 -> U+015F */ 150,
+	/* U+0074+0307 -> U+1E6B */ 1227,
+	/* U+0074+0308 -> U+1E97 */ 1271,
+	/* U+0074+030C -> U+0165 */ 156,
+	/* U+0074+0323 -> U+1E6D */ 1229,
+	/* U+0074+0326 -> U+021B */ 267,
+	/* U+0074+0327 -> U+0163 */ 154,
+	/* U+0074+032D -> U+1E71 */ 1233,
+	/* U+0074+0331 -> U+1E6F */ 1231,
+	/* U+0075+0300 -> U+00F9 */ 61,
+	/* U+0075+0301 -> U+00FA */ 62,
+	/* U+0075+0302 -> U+00FB */ 63,
+	/* U+0075+0303 -> U+0169 */ 158,
+	/* U+0075+0304 -> U+016B */ 160,
+	/* U+0075+0306 -> U+016D */ 162,
+	/* U+0075+0308 -> U+00FC */ 64,
+	/* U+0075+0309 -> U+1EE7 */ 1347,
+	/* U+0075+030A -> U+016F */ 164,
+	/* U+0075+030B -> U+0171 */ 166,
+	/* U+0075+030C -> U+01D4 */ 201,
+	/* U+0075+030F -> U+0215 */ 261,
+	/* U+0075+0311 -> U+0217 */ 263,
+	/* U+0075+031B -> U+01B0 */ 184,
+	/* U+0075+0323 -> U+1EE5 */ 1345,
+	/* U+0075+0324 -> U+1E73 */ 1235,
+	/* U+0075+0328 -> U+0173 */ 168,
+	/* U+0075+032D -> U+1E77 */ 1239,
+	/* U+0075+0330 -> U+1E75 */ 1237,
+	/* U+0076+0303 -> U+1E7D */ 1245,
+	/* U+0076+0323 -> U+1E7F */ 1247,
+	/* U+0077+0300 -> U+1E81 */ 1249,
+	/* U+0077+0301 -> U+1E83 */ 1251,
+	/* U+0077+0302 -> U+0175 */ 170,
+	/* U+0077+0307 -> U+1E87 */ 1255,
+	/* U+0077+0308 -> U+1E85 */ 1253,
+	/* U+0077+030A -> U+1E98 */ 1272,
+	/* U+0077+0323 -> U+1E89 */ 1257,
+	/* U+0078+0307 -> U+1E8B */ 1259,
+	/* U+0078+0308 -> U+1E8D */ 1261,
+	/* U+0079+0300 -> U+1EF3 */ 1359,
+	/* U+0079+0301 -> U+00FD */ 65,
+	/* U+0079+0302 -> U+0177 */ 172,
+	/* U+0079+0303 -> U+1EF9 */ 1365,
+	/* U+0079+0304 -> U+0233 */ 283,
+	/* U+0079+0307 -> U+1E8F */ 1263,
+	/* U+0079+0308 -> U+00FF */ 66,
+	/* U+0079+0309 -> U+1EF7 */ 1363,
+	/* U+0079+030A -> U+1E99 */ 1273,
+	/* U+0079+0323 -> U+1EF5 */ 1361,
+	/* U+007A+0301 -> U+017A */ 175,
+	/* U+007A+0302 -> U+1E91 */ 1265,
+	/* U+007A+0307 -> U+017C */ 177,
+	/* U+007A+030C -> U+017E */ 179,
+	/* U+007A+0323 -> U+1E93 */ 1267,
+	/* U+007A+0331 -> U+1E95 */ 1269,
+	/* U+00A8+0300 -> U+1FED */ 1584,
+	/* U+00A8+0301 -> U+0385 */ 419,
+	/* U+00A8+0342 -> U+1FC1 */ 1544,
+	/* U+00C2+0300 -> U+1EA6 */ 1282,
+	/* U+00C2+0301 -> U+1EA4 */ 1280,
+	/* U+00C2+0303 -> U+1EAA */ 1286,
+	/* U+00C2+0309 -> U+1EA8 */ 1284,
+	/* U+00C4+0304 -> U+01DE */ 210,
+	/* U+00C5+0301 -> U+01FA */ 234,
+	/* U+00C6+0301 -> U+01FC */ 236,
+	/* U+00C6+0304 -> U+01E2 */ 214,
+	/* U+00C7+0301 -> U+1E08 */ 1128,
+	/* U+00CA+0300 -> U+1EC0 */ 1308,
+	/* U+00CA+0301 -> U+1EBE */ 1306,
+	/* U+00CA+0303 -> U+1EC4 */ 1312,
+	/* U+00CA+0309 -> U+1EC2 */ 1310,
+	/* U+00CF+0301 -> U+1E2E */ 1166,
+	/* U+00D4+0300 -> U+1ED2 */ 1326,
+	/* U+00D4+0301 -> U+1ED0 */ 1324,
+	/* U+00D4+0303 -> U+1ED6 */ 1330,
+	/* U+00D4+0309 -> U+1ED4 */ 1328,
+	/* U+00D5+0301 -> U+1E4C */ 1196,
+	/* U+00D5+0304 -> U+022C */ 276,
+	/* U+00D5+0308 -> U+1E4E */ 1198,
+	/* U+00D6+0304 -> U+022A */ 274,
+	/* U+00D8+0301 -> U+01FE */ 238,
+	/* U+00DC+0300 -> U+01DB */ 208,
+	/* U+00DC+0301 -> U+01D7 */ 204,
+	/* U+00DC+0304 -> U+01D5 */ 202,
+	/* U+00DC+030C -> U+01D9 */ 206,
+	/* U+00E2+0300 -> U+1EA7 */ 1283,
+	/* U+00E2+0301 -> U+1EA5 */ 1281,
+	/* U+00E2+0303 -> U+1EAB */ 1287,
+	/* U+00E2+0309 -> U+1EA9 */ 1285,
+	/* U+00E4+0304 -> U+01DF */ 211,
+	/* U+00E5+0301 -> U+01FB */ 235,
+	/* U+00E6+0301 -> U+01FD */ 237,
+	/* U+00E6+0304 -> U+01E3 */ 215,
+	/* U+00E7+0301 -> U+1E09 */ 1129,
+	/* U+00EA+0300 -> U+1EC1 */ 1309,
+	/* U+00EA+0301 -> U+1EBF */ 1307,
+	/* U+00EA+0303 -> U+1EC5 */ 1313,
+	/* U+00EA+0309 -> U+1EC3 */ 1311,
+	/* U+00EF+0301 -> U+1E2F */ 1167,
+	/* U+00F4+0300 -> U+1ED3 */ 1327,
+	/* U+00F4+0301 -> U+1ED1 */ 1325,
+	/* U+00F4+0303 -> U+1ED7 */ 1331,
+	/* U+00F4+0309 -> U+1ED5 */ 1329,
+	/* U+00F5+0301 -> U+1E4D */ 1197,
+	/* U+00F5+0304 -> U+022D */ 277,
+	/* U+00F5+0308 -> U+1E4F */ 1199,
+	/* U+00F6+0304 -> U+022B */ 275,
+	/* U+00F8+0301 -> U+01FF */ 239,
+	/* U+00FC+0300 -> U+01DC */ 209,
+	/* U+00FC+0301 -> U+01D8 */ 205,
+	/* U+00FC+0304 -> U+01D6 */ 203,
+	/* U+00FC+030C -> U+01DA */ 207,
+	/* U+0102+0300 -> U+1EB0 */ 1292,
+	/* U+0102+0301 -> U+1EAE */ 1290,
+	/* U+0102+0303 -> U+1EB4 */ 1296,
+	/* U+0102+0309 -> U+1EB2 */ 1294,
+	/* U+0103+0300 -> U+1EB1 */ 1293,
+	/* U+0103+0301 -> U+1EAF */ 1291,
+	/* U+0103+0303 -> U+1EB5 */ 1297,
+	/* U+0103+0309 -> U+1EB3 */ 1295,
+	/* U+0112+0300 -> U+1E14 */ 1140,
+	/* U+0112+0301 -> U+1E16 */ 1142,
+	/* U+0113+0300 -> U+1E15 */ 1141,
+	/* U+0113+0301 -> U+1E17 */ 1143,
+	/* U+014C+0300 -> U+1E50 */ 1200,
+	/* U+014C+0301 -> U+1E52 */ 1202,
+	/* U+014D+0300 -> U+1E51 */ 1201,
+	/* U+014D+0301 -> U+1E53 */ 1203,
+	/* U+015A+0307 -> U+1E64 */ 1220,
+	/* U+015B+0307 -> U+1E65 */ 1221,
+	/* U+0160+0307 -> U+1E66 */ 1222,
+	/* U+0161+0307 -> U+1E67 */ 1223,
+	/* U+0168+0301 -> U+1E78 */ 1240,
+	/* U+0169+0301 -> U+1E79 */ 1241,
+	/* U+016A+0308 -> U+1E7A */ 1242,
+	/* U+016B+0308 -> U+1E7B */ 1243,
+	/* U+017F+0307 -> U+1E9B */ 1275,
+	/* U+01A0+0300 -> U+1EDC */ 1336,
+	/* U+01A0+0301 -> U+1EDA */ 1334,
+	/* U+01A0+0303 -> U+1EE0 */ 1340,
+	/* U+01A0+0309 -> U+1EDE */ 1338,
+	/* U+01A0+0323 -> U+1EE2 */ 1342,
+	/* U+01A1+0300 -> U+1EDD */ 1337,
+	/* U+01A1+0301 -> U+1EDB */ 1335,
+	/* U+01A1+0303 -> U+1EE1 */ 1341,
+	/* U+01A1+0309 -> U+1EDF */ 1339,
+	/* U+01A1+0323 -> U+1EE3 */ 1343,
+	/* U+01AF+0300 -> U+1EEA */ 1350,
+	/* U+01AF+0301 -> U+1EE8 */ 1348,
+	/* U+01AF+0303 -> U+1EEE */ 1354,
+	/* U+01AF+0309 -> U+1EEC */ 1352,
+	/* U+01AF+0323 -> U+1EF0 */ 1356,
+	/* U+01B0+0300 -> U+1EEB */ 1351,
+	/* U+01B0+0301 -> U+1EE9 */ 1349,
+	/* U+01B0+0303 -> U+1EEF */ 1355,
+	/* U+01B0+0309 -> U+1EED */ 1353,
+	/* U+01B0+0323 -> U+1EF1 */ 1357,
+	/* U+01B7+030C -> U+01EE */ 224,
+	/* U+01EA+0304 -> U+01EC */ 222,
+	/* U+01EB+0304 -> U+01ED */ 223,
+	/* U+0226+0304 -> U+01E0 */ 212,
+	/* U+0227+0304 -> U+01E1 */ 213,
+	/* U+0228+0306 -> U+1E1C */ 1148,
+	/* U+0229+0306 -> U+1E1D */ 1149,
+	/* U+022E+0304 -> U+0230 */ 280,
+	/* U+022F+0304 -> U+0231 */ 281,
+	/* U+0292+030C -> U+01EF */ 225,
+	/* U+0391+0300 -> U+1FBA */ 1537,
+	/* U+0391+0301 -> U+0386 */ 420,
+	/* U+0391+0304 -> U+1FB9 */ 1536,
+	/* U+0391+0306 -> U+1FB8 */ 1535,
+	/* U+0391+0313 -> U+1F08 */ 1374,
+	/* U+0391+0314 -> U+1F09 */ 1375,
+	/* U+0391+0345 -> U+1FBC */ 1539,
+	/* U+0395+0300 -> U+1FC8 */ 1550,
+	/* U+0395+0301 -> U+0388 */ 422,
+	/* U+0395+0313 -> U+1F18 */ 1388,
+	/* U+0395+0314 -> U+1F19 */ 1389,
+	/* U+0397+0300 -> U+1FCA */ 1552,
+	/* U+0397+0301 -> U+0389 */ 423,
+	/* U+0397+0313 -> U+1F28 */ 1402,
+	/* U+0397+0314 -> U+1F29 */ 1403,
+	/* U+0397+0345 -> U+1FCC */ 1554,
+	/* U+0399+0300 -> U+1FDA */ 1566,
+	/* U+0399+0301 -> U+038A */ 424,
+	/* U+0399+0304 -> U+1FD9 */ 1565,
+	/* U+0399+0306 -> U+1FD8 */ 1564,
+	/* U+0399+0308 -> U+03AA */ 429,
+	/* U+0399+0313 -> U+1F38 */ 1418,
+	/* U+0399+0314 -> U+1F39 */ 1419,
+	/* U+039F+0300 -> U+1FF8 */ 1592,
+	/* U+039F+0301 -> U+038C */ 425,
+	/* U+039F+0313 -> U+1F48 */ 1432,
+	/* U+039F+0314 -> U+1F49 */ 1433,
+	/* U+03A1+0314 -> U+1FEC */ 1583,
+	/* U+03A5+0300 -> U+1FEA */ 1581,
+	/* U+03A5+0301 -> U+038E */ 426,
+	/* U+03A5+0304 -> U+1FE9 */ 1580,
+	/* U+03A5+0306 -> U+1FE8 */ 1579,
+	/* U+03A5+0308 -> U+03AB */ 430,
+	/* U+03A5+0314 -> U+1F59 */ 1446,
+	/* U+03A9+0300 -> U+1FFA */ 1594,
+	/* U+03A9+0301 -> U+038F */ 427,
+	/* U+03A9+0313 -> U+1F68 */ 1458,
+	/* U+03A9+0314 -> U+1F69 */ 1459,
+	/* U+03A9+0345 -> U+1FFC */ 1596,
+	/* U+03AC+0345 -> U+1FB4 */ 1532,
+	/* U+03AE+0345 -> U+1FC4 */ 1547,
+	/* U+03B1+0300 -> U+1F70 */ 1466,
+	/* U+03B1+0301 -> U+03AC */ 431,
+	/* U+03B1+0304 -> U+1FB1 */ 1529,
+	/* U+03B1+0306 -> U+1FB0 */ 1528,
+	/* U+03B1+0313 -> U+1F00 */ 1366,
+	/* U+03B1+0314 -> U+1F01 */ 1367,
+	/* U+03B1+0342 -> U+1FB6 */ 1533,
+	/* U+03B1+0345 -> U+1FB3 */ 1531,
+	/* U+03B5+0300 -> U+1F72 */ 1468,
+	/* U+03B5+0301 -> U+03AD */ 432,
+	/* U+03B5+0313 -> U+1F10 */ 1382,
+	/* U+03B5+0314 -> U+1F11 */ 1383,
+	/* U+03B7+0300 -> U+1F74 */ 1470,
+	/* U+03B7+0301 -> U+03AE */ 433,
+	/* U+03B7+0313 -> U+1F20 */ 1394,
+	/* U+03B7+0314 -> U+1F21 */ 1395,
+	/* U+03B7+0342 -> U+1FC6 */ 1548,
+	/* U+03B7+0345 -> U+1FC3 */ 1546,
+	/* U+03B9+0300 -> U+1F76 */ 1472,
+	/* U+03B9+0301 -> U+03AF */ 434,
+	/* U+03B9+0304 -> U+1FD1 */ 1559,
+	/* U+03B9+0306 -> U+1FD0 */ 1558,
+	/* U+03B9+0308 -> U+03CA */ 436,
+	/* U+03B9+0313 -> U+1F30 */ 1410,
+	/* U+03B9+0314 -> U+1F31 */ 1411,
+	/* U+03B9+0342 -> U+1FD6 */ 1562,
+	/* U+03BF+0300 -> U+1F78 */ 1474,
+	/* U+03BF+0301 -> U+03CC */ 438,
+	/* U+03BF+0313 -> U+1F40 */ 1426,
+	/* U+03BF+0314 -> U+1F41 */ 1427,
+	/* U+03C1+0313 -> U+1FE4 */ 1575,
+	/* U+03C1+0314 -> U+1FE5 */ 1576,
+	/* U+03C5+0300 -> U+1F7A */ 1476,
+	/* U+03C5+0301 -> U+03CD */ 439,
+	/* U+03C5+0304 -> U+1FE1 */ 1572,
+	/* U+03C5+0306 -> U+1FE0 */ 1571,
+	/* U+03C5+0308 -> U+03CB */ 437,
+	/* U+03C5+0313 -> U+1F50 */ 1438,
+	/* U+03C5+0314 -> U+1F51 */ 1439,
+	/* U+03C5+0342 -> U+1FE6 */ 1577,
+	/* U+03C9+0300 -> U+1F7C */ 1478,
+	/* U+03C9+0301 -> U+03CE */ 440,
+	/* U+03C9+0313 -> U+1F60 */ 1450,
+	/* U+03C9+0314 -> U+1F61 */ 1451,
+	/* U+03C9+0342 -> U+1FF6 */ 1590,
+	/* U+03C9+0345 -> U+1FF3 */ 1588,
+	/* U+03CA+0300 -> U+1FD2 */ 1560,
+	/* U+03CA+0301 -> U+0390 */ 428,
+	/* U+03CA+0342 -> U+1FD7 */ 1563,
+	/* U+03CB+0300 -> U+1FE2 */ 1573,
+	/* U+03CB+0301 -> U+03B0 */ 435,
+	/* U+03CB+0342 -> U+1FE7 */ 1578,
+	/* U+03CE+0345 -> U+1FF4 */ 1589,
+	/* U+03D2+0301 -> U+03D3 */ 444,
+	/* U+03D2+0308 -> U+03D4 */ 445,
+	/* U+0406+0308 -> U+0407 */ 457,
+	/* U+0410+0306 -> U+04D0 */ 479,
+	/* U+0410+0308 -> U+04D2 */ 481,
+	/* U+0413+0301 -> U+0403 */ 456,
+	/* U+0415+0300 -> U+0400 */ 454,
+	/* U+0415+0306 -> U+04D6 */ 483,
+	/* U+0415+0308 -> U+0401 */ 455,
+	/* U+0416+0306 -> U+04C1 */ 477,
+	/* U+0416+0308 -> U+04DC */ 487,
+	/* U+0417+0308 -> U+04DE */ 489,
+	/* U+0418+0300 -> U+040D */ 459,
+	/* U+0418+0304 -> U+04E2 */ 491,
+	/* U+0418+0306 -> U+0419 */ 461,
+	/* U+0418+0308 -> U+04E4 */ 493,
+	/* U+041A+0301 -> U+040C */ 458,
+	/* U+041E+0308 -> U+04E6 */ 495,
+	/* U+0423+0304 -> U+04EE */ 501,
+	/* U+0423+0306 -> U+040E */ 460,
+	/* U+0423+0308 -> U+04F0 */ 503,
+	/* U+0423+030B -> U+04F2 */ 505,
+	/* U+0427+0308 -> U+04F4 */ 507,
+	/* U+042B+0308 -> U+04F8 */ 509,
+	/* U+042D+0308 -> U+04EC */ 499,
+	/* U+0430+0306 -> U+04D1 */ 480,
+	/* U+0430+0308 -> U+04D3 */ 482,
+	/* U+0433+0301 -> U+0453 */ 465,
+	/* U+0435+0300 -> U+0450 */ 463,
+	/* U+0435+0306 -> U+04D7 */ 484,
+	/* U+0435+0308 -> U+0451 */ 464,
+	/* U+0436+0306 -> U+04C2 */ 478,
+	/* U+0436+0308 -> U+04DD */ 488,
+	/* U+0437+0308 -> U+04DF */ 490,
+	/* U+0438+0300 -> U+045D */ 468,
+	/* U+0438+0304 -> U+04E3 */ 492,
+	/* U+0438+0306 -> U+0439 */ 462,
+	/* U+0438+0308 -> U+04E5 */ 494,
+	/* U+043A+0301 -> U+045C */ 467,
+	/* U+043E+0308 -> U+04E7 */ 496,
+	/* U+0443+0304 -> U+04EF */ 502,
+	/* U+0443+0306 -> U+045E */ 469,
+	/* U+0443+0308 -> U+04F1 */ 504,
+	/* U+0443+030B -> U+04F3 */ 506,
+	/* U+0447+0308 -> U+04F5 */ 508,
+	/* U+044B+0308 -> U+04F9 */ 510,
+	/* U+044D+0308 -> U+04ED */ 500,
+	/* U+0456+0308 -> U+0457 */ 466,
+	/* U+0474+030F -> U+0476 */ 470,
+	/* U+0475+030F -> U+0477 */ 471,
+	/* U+04D8+0308 -> U+04DA */ 485,
+	/* U+04D9+0308 -> U+04DB */ 486,
+	/* U+04E8+0308 -> U+04EA */ 497,
+	/* U+04E9+0308 -> U+04EB */ 498,
+	/* U+0627+0653 -> U+0622 */ 574,
+	/* U+0627+0654 -> U+0623 */ 575,
+	/* U+0627+0655 -> U+0625 */ 577,
+	/* U+0648+0654 -> U+0624 */ 576,
+	/* U+064A+0654 -> U+0626 */ 578,
+	/* U+06C1+0654 -> U+06C2 */ 606,
+	/* U+06D2+0654 -> U+06D3 */ 607,
+	/* U+06D5+0654 -> U+06C0 */ 605,
+	/* U+0928+093C -> U+0929 */ 733,
+	/* U+0930+093C -> U+0931 */ 734,
+	/* U+0933+093C -> U+0934 */ 735,
+	/* U+09C7+09BE -> U+09CB */ 751,
+	/* U+09C7+09D7 -> U+09CC */ 752,
+	/* U+0B47+0B3E -> U+0B4B */ 770,
+	/* U+0B47+0B56 -> U+0B48 */ 769,
+	/* U+0B47+0B57 -> U+0B4C */ 771,
+	/* U+0B92+0BD7 -> U+0B94 */ 775,
+	/* U+0BC6+0BBE -> U+0BCA */ 776,
+	/* U+0BC6+0BD7 -> U+0BCC */ 778,
+	/* U+0BC7+0BBE -> U+0BCB */ 777,
+	/* U+0C46+0C56 -> U+0C48 */ 780,
+	/* U+0CBF+0CD5 -> U+0CC0 */ 785,
+	/* U+0CC6+0CC2 -> U+0CCA */ 788,
+	/* U+0CC6+0CD5 -> U+0CC7 */ 786,
+	/* U+0CC6+0CD6 -> U+0CC8 */ 787,
+	/* U+0CCA+0CD5 -> U+0CCB */ 789,
+	/* U+0D46+0D3E -> U+0D4A */ 793,
+	/* U+0D46+0D57 -> U+0D4C */ 795,
+	/* U+0D47+0D3E -> U+0D4B */ 794,
+	/* U+0DD9+0DCA -> U+0DDA */ 798,
+	/* U+0DD9+0DCF -> U+0DDC */ 799,
+	/* U+0DD9+0DDF -> U+0DDE */ 801,
+	/* U+0DDC+0DCA -> U+0DDD */ 800,
+	/* U+1025+102E -> U+1026 */ 859,
+	/* U+1B05+1B35 -> U+1B06 */ 904,
+	/* U+1B07+1B35 -> U+1B08 */ 905,
+	/* U+1B09+1B35 -> U+1B0A */ 906,
+	/* U+1B0B+1B35 -> U+1B0C */ 907,
+	/* U+1B0D+1B35 -> U+1B0E */ 908,
+	/* U+1B11+1B35 -> U+1B12 */ 909,
+	/* U+1B3A+1B35 -> U+1B3B */ 911,
+	/* U+1B3C+1B35 -> U+1B3D */ 912,
+	/* U+1B3E+1B35 -> U+1B40 */ 913,
+	/* U+1B3F+1B35 -> U+1B41 */ 914,
+	/* U+1B42+1B35 -> U+1B43 */ 915,
+	/* U+1E36+0304 -> U+1E38 */ 1176,
+	/* U+1E37+0304 -> U+1E39 */ 1177,
+	/* U+1E5A+0304 -> U+1E5C */ 1212,
+	/* U+1E5B+0304 -> U+1E5D */ 1213,
+	/* U+1E62+0307 -> U+1E68 */ 1224,
+	/* U+1E63+0307 -> U+1E69 */ 1225,
+	/* U+1EA0+0302 -> U+1EAC */ 1288,
+	/* U+1EA0+0306 -> U+1EB6 */ 1298,
+	/* U+1EA1+0302 -> U+1EAD */ 1289,
+	/* U+1EA1+0306 -> U+1EB7 */ 1299,
+	/* U+1EB8+0302 -> U+1EC6 */ 1314,
+	/* U+1EB9+0302 -> U+1EC7 */ 1315,
+	/* U+1ECC+0302 -> U+1ED8 */ 1332,
+	/* U+1ECD+0302 -> U+1ED9 */ 1333,
+	/* U+1F00+0300 -> U+1F02 */ 1368,
+	/* U+1F00+0301 -> U+1F04 */ 1370,
+	/* U+1F00+0342 -> U+1F06 */ 1372,
+	/* U+1F00+0345 -> U+1F80 */ 1480,
+	/* U+1F01+0300 -> U+1F03 */ 1369,
+	/* U+1F01+0301 -> U+1F05 */ 1371,
+	/* U+1F01+0342 -> U+1F07 */ 1373,
+	/* U+1F01+0345 -> U+1F81 */ 1481,
+	/* U+1F02+0345 -> U+1F82 */ 1482,
+	/* U+1F03+0345 -> U+1F83 */ 1483,
+	/* U+1F04+0345 -> U+1F84 */ 1484,
+	/* U+1F05+0345 -> U+1F85 */ 1485,
+	/* U+1F06+0345 -> U+1F86 */ 1486,
+	/* U+1F07+0345 -> U+1F87 */ 1487,
+	/* U+1F08+0300 -> U+1F0A */ 1376,
+	/* U+1F08+0301 -> U+1F0C */ 1378,
+	/* U+1F08+0342 -> U+1F0E */ 1380,
+	/* U+1F08+0345 -> U+1F88 */ 1488,
+	/* U+1F09+0300 -> U+1F0B */ 1377,
+	/* U+1F09+0301 -> U+1F0D */ 1379,
+	/* U+1F09+0342 -> U+1F0F */ 1381,
+	/* U+1F09+0345 -> U+1F89 */ 1489,
+	/* U+1F0A+0345 -> U+1F8A */ 1490,
+	/* U+1F0B+0345 -> U+1F8B */ 1491,
+	/* U+1F0C+0345 -> U+1F8C */ 1492,
+	/* U+1F0D+0345 -> U+1F8D */ 1493,
+	/* U+1F0E+0345 -> U+1F8E */ 1494,
+	/* U+1F0F+0345 -> U+1F8F */ 1495,
+	/* U+1F10+0300 -> U+1F12 */ 1384,
+	/* U+1F10+0301 -> U+1F14 */ 1386,
+	/* U+1F11+0300 -> U+1F13 */ 1385,
+	/* U+1F11+0301 -> U+1F15 */ 1387,
+	/* U+1F18+0300 -> U+1F1A */ 1390,
+	/* U+1F18+0301 -> U+1F1C */ 1392,
+	/* U+1F19+0300 -> U+1F1B */ 1391,
+	/* U+1F19+0301 -> U+1F1D */ 1393,
+	/* U+1F20+0300 -> U+1F22 */ 1396,
+	/* U+1F20+0301 -> U+1F24 */ 1398,
+	/* U+1F20+0342 -> U+1F26 */ 1400,
+	/* U+1F20+0345 -> U+1F90 */ 1496,
+	/* U+1F21+0300 -> U+1F23 */ 1397,
+	/* U+1F21+0301 -> U+1F25 */ 1399,
+	/* U+1F21+0342 -> U+1F27 */ 1401,
+	/* U+1F21+0345 -> U+1F91 */ 1497,
+	/* U+1F22+0345 -> U+1F92 */ 1498,
+	/* U+1F23+0345 -> U+1F93 */ 1499,
+	/* U+1F24+0345 -> U+1F94 */ 1500,
+	/* U+1F25+0345 -> U+1F95 */ 1501,
+	/* U+1F26+0345 -> U+1F96 */ 1502,
+	/* U+1F27+0345 -> U+1F97 */ 1503,
+	/* U+1F28+0300 -> U+1F2A */ 1404,
+	/* U+1F28+0301 -> U+1F2C */ 1406,
+	/* U+1F28+0342 -> U+1F2E */ 1408,
+	/* U+1F28+0345 -> U+1F98 */ 1504,
+	/* U+1F29+0300 -> U+1F2B */ 1405,
+	/* U+1F29+0301 -> U+1F2D */ 1407,
+	/* U+1F29+0342 -> U+1F2F */ 1409,
+	/* U+1F29+0345 -> U+1F99 */ 1505,
+	/* U+1F2A+0345 -> U+1F9A */ 1506,
+	/* U+1F2B+0345 -> U+1F9B */ 1507,
+	/* U+1F2C+0345 -> U+1F9C */ 1508,
+	/* U+1F2D+0345 -> U+1F9D */ 1509,
+	/* U+1F2E+0345 -> U+1F9E */ 1510,
+	/* U+1F2F+0345 -> U+1F9F */ 1511,
+	/* U+1F30+0300 -> U+1F32 */ 1412,
+	/* U+1F30+0301 -> U+1F34 */ 1414,
+	/* U+1F30+0342 -> U+1F36 */ 1416,
+	/* U+1F31+0300 -> U+1F33 */ 1413,
+	/* U+1F31+0301 -> U+1F35 */ 1415,
+	/* U+1F31+0342 -> U+1F37 */ 1417,
+	/* U+1F38+0300 -> U+1F3A */ 1420,
+	/* U+1F38+0301 -> U+1F3C */ 1422,
+	/* U+1F38+0342 -> U+1F3E */ 1424,
+	/* U+1F39+0300 -> U+1F3B */ 1421,
+	/* U+1F39+0301 -> U+1F3D */ 1423,
+	/* U+1F39+0342 -> U+1F3F */ 1425,
+	/* U+1F40+0300 -> U+1F42 */ 1428,
+	/* U+1F40+0301 -> U+1F44 */ 1430,
+	/* U+1F41+0300 -> U+1F43 */ 1429,
+	/* U+1F41+0301 -> U+1F45 */ 1431,
+	/* U+1F48+0300 -> U+1F4A */ 1434,
+	/* U+1F48+0301 -> U+1F4C */ 1436,
+	/* U+1F49+0300 -> U+1F4B */ 1435,
+	/* U+1F49+0301 -> U+1F4D */ 1437,
+	/* U+1F50+0300 -> U+1F52 */ 1440,
+	/* U+1F50+0301 -> U+1F54 */ 1442,
+	/* U+1F50+0342 -> U+1F56 */ 1444,
+	/* U+1F51+0300 -> U+1F53 */ 1441,
+	/* U+1F51+0301 -> U+1F55 */ 1443,
+	/* U+1F51+0342 -> U+1F57 */ 1445,
+	/* U+1F59+0300 -> U+1F5B */ 1447,
+	/* U+1F59+0301 -> U+1F5D */ 1448,
+	/* U+1F59+0342 -> U+1F5F */ 1449,
+	/* U+1F60+0300 -> U+1F62 */ 1452,
+	/* U+1F60+0301 -> U+1F64 */ 1454,
+	/* U+1F60+0342 -> U+1F66 */ 1456,
+	/* U+1F60+0345 -> U+1FA0 */ 1512,
+	/* U+1F61+0300 -> U+1F63 */ 1453,
+	/* U+1F61+0301 -> U+1F65 */ 1455,
+	/* U+1F61+0342 -> U+1F67 */ 1457,
+	/* U+1F61+0345 -> U+1FA1 */ 1513,
+	/* U+1F62+0345 -> U+1FA2 */ 1514,
+	/* U+1F63+0345 -> U+1FA3 */ 1515,
+	/* U+1F64+0345 -> U+1FA4 */ 1516,
+	/* U+1F65+0345 -> U+1FA5 */ 1517,
+	/* U+1F66+0345 -> U+1FA6 */ 1518,
+	/* U+1F67+0345 -> U+1FA7 */ 1519,
+	/* U+1F68+0300 -> U+1F6A */ 1460,
+	/* U+1F68+0301 -> U+1F6C */ 1462,
+	/* U+1F68+0342 -> U+1F6E */ 1464,
+	/* U+1F68+0345 -> U+1FA8 */ 1520,
+	/* U+1F69+0300 -> U+1F6B */ 1461,
+	/* U+1F69+0301 -> U+1F6D */ 1463,
+	/* U+1F69+0342 -> U+1F6F */ 1465,
+	/* U+1F69+0345 -> U+1FA9 */ 1521,
+	/* U+1F6A+0345 -> U+1FAA */ 1522,
+	/* U+1F6B+0345 -> U+1FAB */ 1523,
+	/* U+1F6C+0345 -> U+1FAC */ 1524,
+	/* U+1F6D+0345 -> U+1FAD */ 1525,
+	/* U+1F6E+0345 -> U+1FAE */ 1526,
+	/* U+1F6F+0345 -> U+1FAF */ 1527,
+	/* U+1F70+0345 -> U+1FB2 */ 1530,
+	/* U+1F74+0345 -> U+1FC2 */ 1545,
+	/* U+1F7C+0345 -> U+1FF2 */ 1587,
+	/* U+1FB6+0345 -> U+1FB7 */ 1534,
+	/* U+1FBF+0300 -> U+1FCD */ 1555,
+	/* U+1FBF+0301 -> U+1FCE */ 1556,
+	/* U+1FBF+0342 -> U+1FCF */ 1557,
+	/* U+1FC6+0345 -> U+1FC7 */ 1549,
+	/* U+1FF6+0345 -> U+1FF7 */ 1591,
+	/* U+1FFE+0300 -> U+1FDD */ 1568,
+	/* U+1FFE+0301 -> U+1FDE */ 1569,
+	/* U+1FFE+0342 -> U+1FDF */ 1570,
+	/* U+2190+0338 -> U+219A */ 1801,
+	/* U+2192+0338 -> U+219B */ 1802,
+	/* U+2194+0338 -> U+21AE */ 1803,
+	/* U+21D0+0338 -> U+21CD */ 1804,
+	/* U+21D2+0338 -> U+21CF */ 1806,
+	/* U+21D4+0338 -> U+21CE */ 1805,
+	/* U+2203+0338 -> U+2204 */ 1807,
+	/* U+2208+0338 -> U+2209 */ 1808,
+	/* U+220B+0338 -> U+220C */ 1809,
+	/* U+2223+0338 -> U+2224 */ 1810,
+	/* U+2225+0338 -> U+2226 */ 1811,
+	/* U+223C+0338 -> U+2241 */ 1816,
+	/* U+2243+0338 -> U+2244 */ 1817,
+	/* U+2245+0338 -> U+2247 */ 1818,
+	/* U+2248+0338 -> U+2249 */ 1819,
+	/* U+224D+0338 -> U+226D */ 1822,
+	/* U+2261+0338 -> U+2262 */ 1821,
+	/* U+2264+0338 -> U+2270 */ 1825,
+	/* U+2265+0338 -> U+2271 */ 1826,
+	/* U+2272+0338 -> U+2274 */ 1827,
+	/* U+2273+0338 -> U+2275 */ 1828,
+	/* U+2276+0338 -> U+2278 */ 1829,
+	/* U+2277+0338 -> U+2279 */ 1830,
+	/* U+227A+0338 -> U+2280 */ 1831,
+	/* U+227B+0338 -> U+2281 */ 1832,
+	/* U+227C+0338 -> U+22E0 */ 1841,
+	/* U+227D+0338 -> U+22E1 */ 1842,
+	/* U+2282+0338 -> U+2284 */ 1833,
+	/* U+2283+0338 -> U+2285 */ 1834,
+	/* U+2286+0338 -> U+2288 */ 1835,
+	/* U+2287+0338 -> U+2289 */ 1836,
+	/* U+2291+0338 -> U+22E2 */ 1843,
+	/* U+2292+0338 -> U+22E3 */ 1844,
+	/* U+22A2+0338 -> U+22AC */ 1837,
+	/* U+22A8+0338 -> U+22AD */ 1838,
+	/* U+22A9+0338 -> U+22AE */ 1839,
+	/* U+22AB+0338 -> U+22AF */ 1840,
+	/* U+22B2+0338 -> U+22EA */ 1845,
+	/* U+22B3+0338 -> U+22EB */ 1846,
+	/* U+22B4+0338 -> U+22EC */ 1847,
+	/* U+22B5+0338 -> U+22ED */ 1848,
+	/* U+3046+3099 -> U+3094 */ 2286,
+	/* U+304B+3099 -> U+304C */ 2261,
+	/* U+304D+3099 -> U+304E */ 2262,
+	/* U+304F+3099 -> U+3050 */ 2263,
+	/* U+3051+3099 -> U+3052 */ 2264,
+	/* U+3053+3099 -> U+3054 */ 2265,
+	/* U+3055+3099 -> U+3056 */ 2266,
+	/* U+3057+3099 -> U+3058 */ 2267,
+	/* U+3059+3099 -> U+305A */ 2268,
+	/* U+305B+3099 -> U+305C */ 2269,
+	/* U+305D+3099 -> U+305E */ 2270,
+	/* U+305F+3099 -> U+3060 */ 2271,
+	/* U+3061+3099 -> U+3062 */ 2272,
+	/* U+3064+3099 -> U+3065 */ 2273,
+	/* U+3066+3099 -> U+3067 */ 2274,
+	/* U+3068+3099 -> U+3069 */ 2275,
+	/* U+306F+3099 -> U+3070 */ 2276,
+	/* U+306F+309A -> U+3071 */ 2277,
+	/* U+3072+3099 -> U+3073 */ 2278,
+	/* U+3072+309A -> U+3074 */ 2279,
+	/* U+3075+3099 -> U+3076 */ 2280,
+	/* U+3075+309A -> U+3077 */ 2281,
+	/* U+3078+3099 -> U+3079 */ 2282,
+	/* U+3078+309A -> U+307A */ 2283,
+	/* U+307B+3099 -> U+307C */ 2284,
+	/* U+307B+309A -> U+307D */ 2285,
+	/* U+309D+3099 -> U+309E */ 2291,
+	/* U+30A6+3099 -> U+30F4 */ 2318,
+	/* U+30AB+3099 -> U+30AC */ 2293,
+	/* U+30AD+3099 -> U+30AE */ 2294,
+	/* U+30AF+3099 -> U+30B0 */ 2295,
+	/* U+30B1+3099 -> U+30B2 */ 2296,
+	/* U+30B3+3099 -> U+30B4 */ 2297,
+	/* U+30B5+3099 -> U+30B6 */ 2298,
+	/* U+30B7+3099 -> U+30B8 */ 2299,
+	/* U+30B9+3099 -> U+30BA */ 2300,
+	/* U+30BB+3099 -> U+30BC */ 2301,
+	/* U+30BD+3099 -> U+30BE */ 2302,
+	/* U+30BF+3099 -> U+30C0 */ 2303,
+	/* U+30C1+3099 -> U+30C2 */ 2304,
+	/* U+30C4+3099 -> U+30C5 */ 2305,
+	/* U+30C6+3099 -> U+30C7 */ 2306,
+	/* U+30C8+3099 -> U+30C9 */ 2307,
+	/* U+30CF+3099 -> U+30D0 */ 2308,
+	/* U+30CF+309A -> U+30D1 */ 2309,
+	/* U+30D2+3099 -> U+30D3 */ 2310,
+	/* U+30D2+309A -> U+30D4 */ 2311,
+	/* U+30D5+3099 -> U+30D6 */ 2312,
+	/* U+30D5+309A -> U+30D7 */ 2313,
+	/* U+30D8+3099 -> U+30D9 */ 2314,
+	/* U+30D8+309A -> U+30DA */ 2315,
+	/* U+30DB+3099 -> U+30DC */ 2316,
+	/* U+30DB+309A -> U+30DD */ 2317,
+	/* U+30EF+3099 -> U+30F7 */ 2319,
+	/* U+30F0+3099 -> U+30F8 */ 2320,
+	/* U+30F1+3099 -> U+30F9 */ 2321,
+	/* U+30F2+3099 -> U+30FA */ 2322,
+	/* U+30FD+3099 -> U+30FE */ 2323,
+	/* U+11099+110BA -> U+1109A */ 4588,
+	/* U+1109B+110BA -> U+1109C */ 4589,
+	/* U+110A5+110BA -> U+110AB */ 4590,
+	/* U+11131+11127 -> U+1112E */ 4596,
+	/* U+11132+11127 -> U+1112F */ 4597,
+	/* U+11347+1133E -> U+1134B */ 4609,
+	/* U+11347+11357 -> U+1134C */ 4610,
+	/* U+114B9+114B0 -> U+114BC */ 4628,
+	/* U+114B9+114BA -> U+114BB */ 4627,
+	/* U+114B9+114BD -> U+114BE */ 4629,
+	/* U+115B8+115AF -> U+115BA */ 4632,
+	/* U+115B9+115AF -> U+115BB */ 4633,
+	/* U+11935+11930 -> U+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

#16John Naylor
john.naylor@enterprisedb.com
In reply to: John Naylor (#15)
2 attachment(s)
Re: speed up unicode decomposition and recomposition

There was a mistake in v3 with pgindent/exclude_file_patterns, fixed in v4.

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

Attachments:

v4-0001-Speed-up-unicode-decomposition.patchapplication/octet-stream; name=v4-0001-Speed-up-unicode-decomposition.patchDownload
From 19622c50dea74aed8d881c797bc9b83b0c5fbb6b Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Wed, 21 Oct 2020 19:23:56 -0400
Subject: [PATCH v4 1/2] Speed up unicode decomposition

Replace binary search in the backend with a perfect hash function.
This takes up 26kB additional bytes, so leave out of the frontend
since decomposition there is thus far only used on password-length
strings.
---
 src/common/unicode/Makefile                   |    4 +-
 .../unicode/generate-unicode_norm_table.pl    |  106 +-
 src/common/unicode_norm.c                     |   61 +-
 src/include/common/unicode_norm_hashfunc.h    | 1713 +++++++++++++++++
 src/tools/pgindent/exclude_file_patterns      |    3 +-
 5 files changed, 1848 insertions(+), 39 deletions(-)
 create mode 100644 src/include/common/unicode_norm_hashfunc.h

diff --git a/src/common/unicode/Makefile b/src/common/unicode/Makefile
index 93a9d1615f..eb14add28a 100644
--- a/src/common/unicode/Makefile
+++ b/src/common/unicode/Makefile
@@ -18,7 +18,7 @@ LIBS += $(PTHREAD_LIBS)
 # By default, do nothing.
 all:
 
-update-unicode: unicode_norm_table.h unicode_combining_table.h unicode_normprops_table.h
+update-unicode: unicode_norm_table.h unicode_combining_table.h unicode_normprops_table.h unicode_norm_hashfunc.h
 	mv $^ ../../../src/include/common/
 	$(MAKE) normalization-check
 
@@ -30,6 +30,8 @@ UnicodeData.txt DerivedNormalizationProps.txt CompositionExclusions.txt Normaliz
 
 # Generation of conversion tables used for string normalization with
 # UTF-8 strings.
+unicode_norm_hashfunc.h: unicode_norm_table.h
+
 unicode_norm_table.h: generate-unicode_norm_table.pl UnicodeData.txt CompositionExclusions.txt
 	$(PERL) generate-unicode_norm_table.pl
 
diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 7ce15e1a03..5fca88796f 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -10,7 +10,12 @@
 use strict;
 use warnings;
 
-my $output_file = "unicode_norm_table.h";
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
+my $output_table_file = "unicode_norm_table.h";
+my $output_func_file  = "unicode_norm_hashfunc.h";
 
 my $FH;
 
@@ -64,11 +69,13 @@ close $FH;
 
 my $num_characters = scalar @characters;
 
-# Start writing out the output file
-open my $OUTPUT, '>', $output_file
-  or die "Could not open output file $output_file: $!\n";
+# Start writing out the output files
+open my $OT, '>', $output_table_file
+  or die "Could not open output file $output_table_file: $!\n";
+open my $OF, '>', $output_func_file
+  or die "Could not open output file $output_func_file: $!\n";
 
-print $OUTPUT <<HEADER;
+print $OT <<HEADER;
 /*-------------------------------------------------------------------------
  *
  * unicode_norm_table.h
@@ -111,8 +118,44 @@ static const pg_unicode_decomposition UnicodeDecompMain[$num_characters] =
 {
 HEADER
 
+print $OF <<HEADER;
+/*-------------------------------------------------------------------------
+ *
+ * unicode_norm_hashfunc.h
+ *	  Perfect hash functions used for Unicode normalization
+ *
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/common/unicode_norm_hashfunc.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * File auto-generated by src/common/unicode/generate-unicode_norm_table.pl,
+ * do not edit. There is deliberately not an #ifndef PG_UNICODE_NORM_HASHFUNC_H
+ * here.
+ */
+
+#include "unicode_norm_table.h"
+
+/* Typedef for perfect hash functions */
+typedef int (*cp_hash_func) (const void *key);
+
+/* Information for lookups with perfect hash functions */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	cp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
+HEADER
+
 my $decomp_index  = 0;
 my $decomp_string = "";
+my @dec_cp_packed;
 
 my $last_code = $characters[-1]->{code};
 foreach my $char (@characters)
@@ -121,6 +164,9 @@ foreach my $char (@characters)
 	my $class  = $char->{class};
 	my $decomp = $char->{decomp};
 
+	# Save the code point bytes as a string in network order.
+	push @dec_cp_packed, pack('N', hex($char->{code}));
+
 	# The character decomposition mapping field in UnicodeData.txt is a list
 	# of unicode codepoints, separated by space. But it can be prefixed with
 	# so-called compatibility formatting tag, like "<compat>", or "<font>".
@@ -163,7 +209,7 @@ foreach my $char (@characters)
 		{
 			foreach my $lcode (@composition_exclusion_codes)
 			{
-				if ($lcode eq $char->{code})
+				if ($lcode eq $code)
 				{
 					$flags .= " | DECOMP_NO_COMPOSE";
 					$comment = "in exclusion list";
@@ -175,7 +221,7 @@ foreach my $char (@characters)
 
 	if ($decomp_size == 0)
 	{
-		print $OUTPUT "\t{0x$code, $class, 0$flags, 0}";
+		print $OT "\t{0x$code, $class, 0$flags, 0}";
 	}
 	elsif ($decomp_size == 1 && length($first_decomp) <= 4)
 	{
@@ -183,11 +229,11 @@ foreach my $char (@characters)
 		# The decomposition consists of a single codepoint, and it fits
 		# in a uint16, so we can store it "inline" in the main table.
 		$flags .= " | DECOMP_INLINE";
-		print $OUTPUT "\t{0x$code, $class, 1$flags, 0x$first_decomp}";
+		print $OT "\t{0x$code, $class, 1$flags, 0x$first_decomp}";
 	}
 	else
 	{
-		print $OUTPUT
+		print $OT
 		  "\t{0x$code, $class, $decomp_size$flags, $decomp_index}";
 
 		# Now save the decompositions into a dedicated area that will
@@ -205,25 +251,15 @@ foreach my $char (@characters)
 	}
 
 	# Print a comma after all items except the last one.
-	print $OUTPUT "," unless ($code eq $last_code);
-	if ($comment ne "")
-	{
-
-		# If the line is wide already, indent the comment with one tab,
-		# otherwise with two. This is to make the output match the way
-		# pgindent would mangle it. (This is quite hacky. To do this
-		# properly, we should actually track how long the line is so far,
-		# but this works for now.)
-		print $OUTPUT "\t" if ($decomp_index < 10);
+	print $OT "," unless ($code eq $last_code);
 
-		print $OUTPUT "\t/* $comment */" if ($comment ne "");
-	}
-	print $OUTPUT "\n";
+	print $OT "\t/* $comment */" if ($comment ne "");
+	print $OT "\n";
 }
-print $OUTPUT "\n};\n\n";
+print $OT "\n};\n\n";
 
 # Print the array of decomposed codes.
-print $OUTPUT <<HEADER;
+print $OT <<HEADER;
 /* codepoints array  */
 static const uint32 UnicodeDecomp_codepoints[$decomp_index] =
 {
@@ -231,4 +267,24 @@ $decomp_string
 };
 HEADER
 
-close $OUTPUT;
+# Emit the definition of the decomp hash function.
+my $dec_funcname = 'Decomp_hash_func';
+my $dec_func     = PerfectHash::generate_hash_function(\@dec_cp_packed,
+	$dec_funcname, fixed_key_length => 4);
+print $OF "/* Perfect hash function for decomposition */\n";
+print $OF "static $dec_func\n";
+
+# Emit the structure that wraps the hash lookup information into
+# one variable.
+print $OF <<HEADER;
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo =
+{
+	UnicodeDecompMain,
+	$dec_funcname,
+	$num_characters
+};
+HEADER
+
+close $OT;
+close $OF;
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 4bb6a0f587..7d0d23ab21 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -19,9 +19,11 @@
 #endif
 
 #include "common/unicode_norm.h"
-#include "common/unicode_norm_table.h"
 #ifndef FRONTEND
+#include "common/unicode_norm_hashfunc.h"
 #include "common/unicode_normprops_table.h"
+#else
+#include "common/unicode_norm_table.h"
 #endif
 #include "port/pg_bswap.h"
 
@@ -44,6 +46,42 @@
 #define NCOUNT		VCOUNT * TCOUNT
 #define SCOUNT		LCOUNT * NCOUNT
 
+/*
+ * Get the entry corresponding to code in the decomposition lookup table.
+ */
+#ifndef FRONTEND
+
+static const pg_unicode_decomposition *
+get_code_entry(pg_wchar code)
+{
+	int			h;
+	uint32		hashkey;
+	pg_unicode_decompinfo decompinfo = UnicodeDecompInfo;
+
+	/*
+	 * Compute the hash function. The hash key is the codepoint with the bytes
+	 * in network order.
+	 */
+	hashkey = pg_hton32(code);
+	h = decompinfo.hash(&hashkey);
+
+	/* An out-of-range result implies no match */
+	if (h < 0 || h >= decompinfo.num_decomps)
+		return NULL;
+
+	/*
+	 * Since it's a perfect hash, we need only match to the specific codepoint
+	 * it identifies.
+	 */
+	if (code != decompinfo.decomps[h].codepoint)
+		return NULL;
+
+	/* Success! */
+	return &decompinfo.decomps[h];
+}
+
+#else
+
 /* comparison routine for bsearch() of decomposition lookup table. */
 static int
 conv_compare(const void *p1, const void *p2)
@@ -56,10 +94,7 @@ conv_compare(const void *p1, const void *p2)
 	return (v1 > v2) ? 1 : ((v1 == v2) ? 0 : -1);
 }
 
-/*
- * Get the entry corresponding to code in the decomposition lookup table.
- */
-static pg_unicode_decomposition *
+static const pg_unicode_decomposition *
 get_code_entry(pg_wchar code)
 {
 	return bsearch(&(code),
@@ -69,6 +104,8 @@ get_code_entry(pg_wchar code)
 				   conv_compare);
 }
 
+#endif							/* !FRONTEND */
+
 /*
  * Given a decomposition entry looked up earlier, get the decomposed
  * characters.
@@ -77,7 +114,7 @@ get_code_entry(pg_wchar code)
  * is only valid until next call to this function!
  */
 static const pg_wchar *
-get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
+get_code_decomposition(const pg_unicode_decomposition *entry, int *dec_size)
 {
 	static pg_wchar x;
 
@@ -104,7 +141,7 @@ get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
 static int
 get_decomposed_size(pg_wchar code, bool compat)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			size = 0;
 	int			i;
 	const uint32 *decomp;
@@ -231,7 +268,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 static void
 decompose_code(pg_wchar code, bool compat, pg_wchar **result, int *current)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			i;
 	const uint32 *decomp;
 	int			dec_size;
@@ -358,8 +395,8 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 		pg_wchar	prev = decomp_chars[count - 1];
 		pg_wchar	next = decomp_chars[count];
 		pg_wchar	tmp;
-		pg_unicode_decomposition *prevEntry = get_code_entry(prev);
-		pg_unicode_decomposition *nextEntry = get_code_entry(next);
+		const pg_unicode_decomposition *prevEntry = get_code_entry(prev);
+		const pg_unicode_decomposition *nextEntry = get_code_entry(next);
 
 		/*
 		 * If no entries are found, the character used is either an Hangul
@@ -417,7 +454,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 	for (count = 1; count < decomp_size; count++)
 	{
 		pg_wchar	ch = decomp_chars[count];
-		pg_unicode_decomposition *ch_entry = get_code_entry(ch);
+		const pg_unicode_decomposition *ch_entry = get_code_entry(ch);
 		int			ch_class = (ch_entry == NULL) ? 0 : ch_entry->comb_class;
 		pg_wchar	composite;
 
@@ -458,7 +495,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 static uint8
 get_canonical_class(pg_wchar ch)
 {
-	pg_unicode_decomposition *entry = get_code_entry(ch);
+	const pg_unicode_decomposition *entry = get_code_entry(ch);
 
 	if (!entry)
 		return 0;
diff --git a/src/include/common/unicode_norm_hashfunc.h b/src/include/common/unicode_norm_hashfunc.h
new file mode 100644
index 0000000000..d2f4ad884b
--- /dev/null
+++ b/src/include/common/unicode_norm_hashfunc.h
@@ -0,0 +1,1713 @@
+/*-------------------------------------------------------------------------
+ *
+ * unicode_norm_hashfunc.h
+ *	  Perfect hash functions used for Unicode normalization
+ *
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/common/unicode_norm_hashfunc.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * File auto-generated by src/common/unicode/generate-unicode_norm_table.pl,
+ * do not edit. There is deliberately not an #ifndef PG_UNICODE_NORM_HASHFUNC_H
+ * here.
+ */
+
+#include "unicode_norm_table.h"
+
+/* Typedef for perfect hash functions */
+typedef int (*cp_hash_func) (const void *key);
+
+/* Information for lookups with perfect hash functions */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	cp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
+/* Perfect hash function for decomposition */
+static int
+Decomp_hash_func(const void *key)
+{
+	static const int16 h[13209] = {
+		0,     1515,  4744,  4745,  0,     0,     0,     0,
+		0,     0,     0,     0,     3890,  3890,  0,     0,
+		3891,  3891,  -2046, 2800,  3890,  3890,  3890,  -4396,
+		4361,  4362,  -4441, -4441, -4396, 1773,  1773,  1773,
+		4372,  4373,  -4438, -4438, -4393, -4393, 2619,  17,
+		-4347, -4393, -4393, -4393, -4393, -4393, 2619,  2619,
+		1560,  4346,  4347,  4348,  1917,  1873,  1874,  1875,
+		-7856, 4358,  17619, 2622,  2622,  2622,  6357,  6358,
+		6359,  6360,  6361,  6362,  6363,  2622,  -4390, -4390,
+		4414,  -5356, -5356, 4374,  4375,  -5356, -5356, -6335,
+		-3020, 2511,  -5356, -5356, -3583, -3583, -3583, -3583,
+		-995,  0,     0,     -9799, -9754, 2874,  2875,  2876,
+		2877,  2878,  -9830, -3591, -9756, -9756, -2744, -5346,
+		-9710, -9756, 342,   -5346, -9756, -5346, -2743, -449,
+		348,   2894,  2895,  -2853, 2897,  2898,  2899,  2900,
+		2901,  2902,  2903,  2904,  2905,  2906,  2907,  2908,
+		2909,  2910,  2911,  2912,  2913,  2914,  2915,  2916,
+		2917,  2918,  2919,  2920,  2921,  2922,  2923,  2924,
+		2925,  2926,  2927,  2928,  2929,  2930,  2931,  2932,
+		2933,  2934,  32767, 32767, 32767, 32767, 32767, 32767,
+		-8721, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1,     32767, 48,    32767, 32767, 32767, 32767, 49,
+		32767, 32767, -8687, -8687, -6255, -6210, 32767, 32767,
+		-8689, -8689, -21949,32767, -18635,-15320,-15320,32767,
+		-12006,-8691, -8691, -8691, -8691, -8691, 32767, 66,
+		-8737, -8737, -8692, -8692, -8692, -8692, 73,    74,
+		32767, -8738, -8693, -8693, -8693, -8693, -8693, 32767,
+		32767, -8695, -8695, -8695, -8695, -8695, 32767, 32767,
+		40,    41,    -2390, -2434, 44,    45,    32767, 46,
+		13307, 9993,  9994,  6680,  6681,  3367,  3368,  54,
+		0,     55,    56,    57,    -8699, -8699, 105,   32767,
+		32767, 61,    62,    63,    -8701, -8701, 32767, 111,
+		32767, 67,    68,    69,    70,    1890,  3687,  -1272,
+		3690,  75,    76,    77,    78,    79,    80,    81,
+		82,    32767, 32767, 83,    84,    85,    86,    87,
+		88,    89,    90,    91,    92,    93,    94,    95,
+		96,    97,    98,    99,    100,   101,   102,   32767,
+		32767, 103,   104,   105,   106,   107,   108,   109,
+		-8660, -8660, 32767, -8661, -8661, -8661, -8661, -8661,
+		-8661, 32767, 73,    74,    75,    76,    -2355, -2399,
+		79,    80,    32767, 32767, 13341, 10027, 10028, 6714,
+		6715,  3401,  3402,  32767, 32767, 88,    89,    90,
+		-8666, -8666, 138,   32767, 32767, 94,    95,    96,
+		-8668, -8668, 144,   145,   101,   -2553, -2553, -2553,
+		-2553, -4983, -2553, -2553, 154,   -2553, 156,   32767,
+		32767, 6114,  158,   -3153, -3152, -3151, -12891,-6888,
+		-931,  -3149, 166,   -3148, -4728, 169,   -3147, -3146,
+		-3145, -3144, -3143, -3142, -3141, -2543, -3139, -3138,
+		180,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 3314,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     3660,  3661,  2131,  2132,  2133,  2134,  2135,
+		2136,  2137,  2138,  2139,  2140,  2141,  2142,  2143,
+		2144,  2145,  -5472, -5472, -3612, -3612, -3612, -3612,
+		-3612, 2652,  -3612, -3612, -3612, -3612, -3612, -3612,
+		-3612, -3612, 3693,  -3613, -7015, -7015, 1742,  1743,
+		-7060, -7060, -7015, -846,  -846,  -846,  1753,  1754,
+		-7057, -7057, -7012, -7012, 0,     -2602, -6966, -7012,
+		-7012, -7012, -7012, -7012, 0,     0,     1725,  1726,
+		1727,  1728,  -703,  -747,  -746,  0,     1735,  1736,
+		14997, 0,     0,     0,     3735,  3736,  3737,  3738,
+		3739,  3740,  3741,  0,     -7012, -7012, 1792,  1793,
+		1749,  1750,  1751,  -7980, -7980, -8959, -5644, -113,
+		-7980, -113,  -2382, -6116, -6116, -6116, -6116, -6116,
+		-6116, -6116, -2374, 4639,  4640,  -4163, 5608,  5609,
+		-4120, -4120, 5612,  5613,  6593,  3279,  -2251, 5617,
+		5618,  3846,  3847,  3848,  3849,  1262,  1262,  10066,
+		10067, 10023, 3855,  3856,  3857,  1259,  1259,  10071,
+		3861,  10027, 10028, 3017,  5620,  9985,  10032, -65,
+		5624,  10035, 5626,  3024,  731,   -65,   1298,  12530,
+		3727,  3727,  3772,  3772,  3772,  13504, 13505, 14485,
+		11171, 5641,  13509, 5643,  7913,  11648, 11649, 11650,
+		11651, 11652, 11653, 11654, 7913,  901,   901,   9705,
+		-65,   -65,   9665,  9666,  -65,   -65,   -1044, 2271,
+		7802,  -65,   -65,   1708,  1708,  1708,  1708,  4296,
+		4297,  -4506, -4506, -4461, 1708,  1708,  1708,  4307,
+		4308,  -4503, 1708,  -4457, -4457, 2555,  -47,   -4411,
+		-4457, 5641,  -47,   -4457, -47,   2556,  4850,  5647,
+		4285,  -6946, 1858,  1859,  1815,  1816,  1817,  -7914,
+		-7914, -8893, -5578, -47,   -7914, -47,   -2316, -6050,
+		-6050, -6050, -6050, -6050, -6050, -6050, -2308, 4705,
+		4706,  -4097, 5674,  5675,  -4054, -4054, 5678,  5679,
+		6659,  3345,  -2185, 5683,  5684,  3912,  3913,  3914,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -3083, -3083, 232,   287,   233,   233,
+		233,   8990,  8991,  32767, 32767, 3668,  32767, 3667,
+		3667,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 208,   208,   208,   208,   208,   208,
+		32767, 32767, 206,   206,   206,   206,   206,   32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 304,   305,   -1274, 307,   308,
+		309,   6753,  -1374, 10488, 4486,  -1470, 4488,  316,
+		4489,  -5607, 4490,  4491,  4492,  322,   760,   324,
+		325,   326,   166,   763,   329,   -2553, 765,   332,
+		333,   334,   335,   772,   337,   6310,  339,   340,
+		341,   342,   343,   344,   345,   346,   -2542, -2542,
+		-2542, 350,   351,   352,   353,   354,   355,   356,
+		357,   358,   359,   360,   361,   362,   -6008, 364,
+		365,   366,   367,   368,   369,   370,   254,   372,
+		373,   374,   375,   376,   377,   378,   379,   380,
+		381,   382,   32767, 383,   384,   -3606, -3605, -3604,
+		-3603, 389,   -3600, -3599, -3598, 2340,  -1238, -3595,
+		-3594, -3593, 4694,  -4062, -4062, 4742,  4743,  4699,
+		-1469, -1468, -1467, -4065, -4065, 4747,  -1463, 4703,
+		4704,  -2307, 296,   32767, 0,     32767, 32767, 4708,
+		-1376, -1376, -1376, 32767, 32767, -1246, 506,   506,
+		0,     -1559, 32767, 32767, 32767, 32767, 32767, 305,
+		419,   308,   2578,  6313,  6314,  424,   32767, -6030,
+		32767, 426,   427,   428,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     32767, 0,
+		32767, 0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     32767, 429,   -5407, 431,
+		-5406, 433,   -3601, 435,   32767, -3751, 32767, 32767,
+		32767, 32767, -3755, 32767, 32767, 32767, 32767, 0,
+		32767, 32767, 32767, 32767, 0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 436,   -11425,-5422,
+		535,   -5422, 535,   -5422, 4675,  -5421, -5421, -5421,
+		-5421, -5421, 4681,  0,     0,     0,     4682,  4683,
+		4684,  4685,  4686,  4687,  0,     0,     32767, 32767,
+		0,     0,     -5684, 0,     4688,  4689,  4690,  4691,
+		4692,  4693,  4694,  4695,  -1257, -1257, 4696,  -5441,
+		-5441, 4699,  4700,  4701,  -5443, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 454,   0,     32767, 456,
+		32767, 32767, 0,     457,   32767, 32767, 32767, 0,
+		458,   459,   460,   32767, 0,     32767, 32767, 32767,
+		32767, 32767, 32767, 4703,  4704,  4705,  4706,  32767,
+		32767, 0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 4655,  4656,  4657,  4658,
+		4659,  4712,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 462,   32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 463,   464,   32767, 465,
+		32767, 32767, 32767, 466,   32767, 32767, 32767, 32767,
+		467,   468,   469,   32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 3011,  3011,  3011,
+		3011,  3011,  3011,  3011,  32767, 32767, 32767, 32767,
+		32767, 32767, 470,   471,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 472,
+		473,   474,   475,   476,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 4713,  4714,  4715,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 477,   478,   32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 479,   480,   481,   482,
+		32767, 32767, 483,   484,   32767, 32767, 485,   486,
+		487,   488,   489,   490,   32767, 32767, 491,   492,
+		493,   494,   495,   496,   32767, 32767, 0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     665,   -255,  667,   0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     693,   694,   695,   696,
+		697,   698,   699,   700,   701,   702,   703,   704,
+		705,   706,   707,   708,   709,   710,   711,   712,
+		7183,  714,   -1580, 716,   2547,  718,   7194,  720,
+		2553,  722,   723,   7204,  725,   726,   727,   728,
+		729,   730,   731,   732,   733,   734,   735,   736,
+		0,     0,     8114,  8159,  745,   -1535, 747,   748,
+		8161,  -5019, -5019, -5019, -5019, 1938,  0,     0,
+		0,     0,     0,     0,     767,   768,   0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     32767, 32767, 32767, 32767, 32767, 0,     32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, -2875, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -4271, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, 32767, -2885, 32767, -2886, -2886,
+		32767, -2887, -2887, 32767, -2888, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 563,   564,
+		565,   566,   567,   568,   569,   570,   571,   572,
+		573,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		574,   575,   576,   577,   578,   32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, -294,  -294,  -294,  -3047, 583,   584,   585,
+		-4462, -4418, -4418, -4418, -4418, -4418, -4462, -4462,
+		-4462, 595,   596,   597,   598,   599,   32767, 32767,
+		32767, 32767, -4471, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 4716,  4717,  4718,  4719,
+		4720,  4721,  4722,  4723,  4724,  4725,  4726,  4727,
+		4728,  4729,  4730,  4731,  4732,  4733,  4734,  4735,
+		3826,  4737,  4738,  4739,  4740,  4741,  4742,  3832,
+		4744,  3833,  3120,  3121,  3835,  3835,  3124,  3836,
+		3836,  4753,  4754,  4755,  4756,  4757,  4758,  4759,
+		4760,  4761,  4762,  4763,  4764,  4765,  4766,  4767,
+		4768,  4769,  4770,  4771,  4772,  4773,  4774,  4775,
+		4776,  4777,  4778,  4779,  4780,  4781,  6619,  6620,
+		6621,  11272, 6623,  6624,  4788,  4789,  4790,  3874,
+		4761,  3874,  4794,  3874,  4796,  4797,  4798,  3874,
+		4800,  32767, 0,     4802,  4803,  4804,  4805,  4806,
+		4807,  4808,  4809,  4810,  4811,  4812,  4813,  4814,
+		4815,  4816,  4817,  4818,  4819,  4820,  4821,  4822,
+		4823,  4824,  4825,  4826,  4827,  4828,  11299, 4830,
+		2536,  4832,  6663,  4834,  11310, 4836,  6669,  4838,
+		4839,  11320, 4841,  4842,  4843,  4844,  4845,  4846,
+		4847,  4848,  4849,  4850,  4851,  4852,  1188,  4854,
+		4855,  4856,  4857,  2577,  4859,  4860,  12273, -907,
+		-907,  -907,  -907,  -907,  -907,  4868,  4869,  4870,
+		4871,  32767, 4872,  4873,  32767, 32767, 4874,  32767,
+		627,   4875,  4876,  32767, 32767, 4877,  4878,  4879,
+		6722,  32767, 4881,  4882,  4883,  6730,  6731,  7446,
+		6733,  4888,  7449,  7449,  4891,  4892,  32767, 4893,
+		32767, 4894,  4895,  4896,  4897,  4898,  4899,  3512,
+		3513,  3514,  3515,  3516,  4904,  3518,  3519,  3520,
+		3521,  3522,  3523,  3524,  3525,  3526,  3527,  3528,
+		3529,  3530,  3531,  3532,  3533,  3534,  3535,  3536,
+		3537,  3538,  4926,  6797,  4928,  6800,  4930,  4931,
+		4932,  4933,  4934,  4935,  6813,  4937,  4938,  6816,
+		6817,  4941,  4942,  4943,  0,     4945,  6821,  0,
+		0,     4949,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, -127,  -127,  -127,
+		7285,  -127,  -127,  0,     -128,  -128,  -128,  -128,
+		0,     32767, -130,  4971,  -129,  5613,  5614,  5615,
+		4976,  5618,  32767, 5619,  5620,  5621,  4981,  5624,
+		4983,  4984,  32767, 5630,  5631,  -1986, -1986, -126,
+		-126,  5078,  4992,  5037,  5038,  5039,  5040,  5041,
+		5086,  5087,  5088,  5089,  -2322, 5091,  5092,  5093,
+		5094,  5095,  5096,  5097,  5098,  5099,  5100,  0,
+		5101,  -640,  -640,  -640,  0,     -641,  -641,  -641,
+		-641,  -641,  0,     -642,  0,     0,     32767, -645,
+		-645,  6973,  6974,  5115,  5116,  -87,   0,     -44,
+		-44,   -44,   -44,   -44,   -88,   -88,   -88,   -88,
+		7324,  -88,   -88,   -88,   -88,   -88,   -88,   -88,
+		-88,   -88,   -88,   -88,   -88,   5654,  5655,  5656,
+		5657,  5658,  5659,  5660,  5661,  5662,  5663,  5664,
+		5665,  5666,  5667,  5668,  5669,  -1948, -1948, -88,
+		-88,   5116,  5117,  5074,  5075,  5076,  5077,  5078,
+		5123,  5124,  5125,  5126,  -2285, 5128,  5129,  5130,
+		5131,  5132,  5133,  5134,  5135,  5136,  5137,  5138,
+		5139,  -602,  -602,  -602,  -602,  -602,  -602,  -602,
+		-602,  -602,  -602,  -602,  -602,  -602,  -602,  -602,
+		-602,  7016,  7017,  5158,  5159,  -44,   -44,   0,
+		0,     0,     0,     0,     -44,   -44,   -44,   -44,
+		7368,  -44,   -44,   -44,   -44,   -44,   -44,   -44,
+		-44,   -44,   -44,   -44,   -44,   5698,  5699,  5700,
+		5701,  5702,  5703,  5704,  5705,  5706,  5707,  5708,
+		5709,  5710,  5711,  5712,  5713,  -1904, -1904, -44,
+		-44,   5160,  5161,  5118,  5119,  5120,  5121,  5122,
+		5167,  5168,  5169,  5170,  -2241, 5172,  5173,  5174,
+		5175,  5176,  5177,  5178,  5179,  5180,  5181,  5182,
+		5183,  -558,  -558,  -558,  -558,  -558,  -558,  -558,
+		-558,  -558,  -558,  -558,  -558,  -558,  -558,  -558,
+		-558,  7060,  7061,  5202,  5203,  0,     0,     44,
+		44,    44,    44,    44,    0,     0,     0,     0,
+		7412,  0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     5742,  5743,  5744,
+		5745,  5746,  5747,  5748,  5749,  5750,  5751,  5752,
+		5753,  5754,  5755,  5756,  5757,  -1860, -1860, 0,
+		0,     0,     0,     0,     6264,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     -3402,
+		-3402, 5355,  5356,  -3447, -3447, -3402, -3402, -3402,
+		-3402, 5363,  5364,  -3447, -3447, -3402, -3402, -3402,
+		-3358, -3358, -3404, -3404, -3404, -3404, -3404, -3404,
+		-3404, 5331,  5332,  5333,  5334,  2903,  2859,  5337,
+		5338,  5339,  5340,  18601, 15287, 15288, 11974, 11975,
+		8661,  8662,  5348,  5349,  5350,  5351,  5352,  -3404,
+		-3404, 5400,  5401,  5357,  5358,  5359,  5360,  -3404,
+		-3404, 5408,  5409,  5365,  5366,  5367,  5324,  5325,
+		5372,  5373,  5374,  5375,  5376,  5377,  5378,  -3356,
+		-3356, -3356, -3356, -924,  -879,  -3356, -3356, -3356,
+		-3356, -16616,-13301,-13301,-9986, -9986, -6671, -6671,
+		-3356, -3356, -3356, -3356, -3356, 5401,  5402,  -3401,
+		-3401, -3356, -3356, -3356, -3356, 5409,  5410,  -3401,
+		-3401, -3356, -3356, -3356, -3312, -3312, -3358, -3358,
+		-3358, -3358, -3358, -3358, -3358, 5377,  5378,  5379,
+		5380,  2949,  2905,  5383,  5384,  5385,  5386,  18647,
+		15333, 15334, 12020, 12021, 8707,  8708,  5394,  5395,
+		5396,  5397,  5398,  -3358, -3358, 5446,  5447,  5403,
+		5404,  5405,  5406,  -3358, -3358, 5454,  5455,  5411,
+		5412,  5413,  5414,  5415,  5416,  5417,  5418,  5419,
+		5420,  5421,  5422,  -3312, -3312, -3312, -3312, -880,
+		-835,  -3312, -3312, -3312, -3312, -16572,-13257,-13257,
+		-9942, -9942, -6627, -6627, -3312, -3312, -3312, -3312,
+		-3312, 5445,  5446,  -3357, -3357, -3312, -3312, -3312,
+		-3312, 5453,  5454,  -3357, -3357, -3312, -3312, -3312,
+		-3312, -3312, -3312, -3312, -3312, -3312, -3312, -3312,
+		-3312, 5423,  5424,  5425,  5426,  2995,  2951,  5429,
+		5430,  5431,  5432,  18693, 15379, 15380, 12066, 12067,
+		8753,  8754,  5440,  5441,  5442,  5443,  5444,  -3312,
+		-3312, 5492,  5493,  5449,  5450,  5451,  5452,  -3312,
+		-3312, 5500,  5501,  5457,  2803,  2803,  2803,  2803,
+		373,   2803,  2803,  5510,  2803,  5512,  11470, 5514,
+		11472, 5516,  2205,  2206,  2207,  -7533, -1530, 4427,
+		2209,  5524,  2210,  630,   5527,  2211,  2212,  2213,
+		2214,  2215,  2216,  2217,  2815,  2219,  2220,  5538,
+		2221,  5540,  2222,  5542,  5543,  2223,  -3312, -3312,
+		-3312, 5548,  5549,  -3312, -3312, 2803,  2803,  2803,
+		5555,  5556,  5557,  2803,  2803,  2803,  2803,  2803,
+		2803,  2803,  2803,  2803,  2803,  2803,  2803,  2803,
+		9050,  9051,  2803,  2803,  2803,  2803,  2803,  2803,
+		2803,  2803,  2803,  2803,  2803,  2803,  4318,  7547,
+		7548,  2803,  2803,  2803,  2803,  2803,  2803,  2803,
+		2803,  6693,  6693,  2803,  2803,  6694,  6694,  757,
+		5603,  6693,  6693,  6693,  -1593, 7164,  7165,  -1638,
+		-1638, -1593, 4576,  4576,  4576,  7175,  7176,  -1635,
+		-1635, -1590, -1590, 5422,  2820,  -1544, -1590, -1590,
+		-1590, -1590, -1590, 5422,  5422,  4363,  7149,  7150,
+		7151,  4720,  4676,  4677,  4678,  -5053, 7161,  20422,
+		5425,  5425,  5425,  9160,  9161,  9162,  9163,  9164,
+		9165,  9166,  5425,  -1587, -1587, 7217,  -2553, -2553,
+		7177,  7178,  -2553, 32767, 32767, -219,  5312,  -2555,
+		-2555, -782,  -782,  -782,  -782,  1806,  2801,  2801,
+		-6998, -6953, 5675,  5676,  5677,  5678,  5679,  -7029,
+		-790,  -6955, -6955, 57,    -2545, -6909, -6955, 3143,
+		-2545, -6955, -2545, 58,    2352,  3149,  5695,  5696,
+		-52,   5698,  5699,  5700,  5701,  5702,  5703,  5704,
+		5705,  5706,  5707,  5708,  5709,  5710,  5711,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -1838, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 6927,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -973,  32767, 32767,
+		32767, 32767, 0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     4567,  4568,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -437,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -448,  32767, 32767, -450,  -450,
+		-450,  0,     32767, 32767, 32767, -2166, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     0,     32767, -464,
+		-464,  32767, 0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -514,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		5757,  5758,  5759,  0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -4186, -4186, -12097,-4186, 32767,
+		-4187, -4187, -8787, 32767, 0,     0,     5952,  0,
+		0,     -4183, -4183, -4183, 0,     -2386, -4182, 778,
+		-4183, -5935, 32767, 32767, -4690, -6249, -4184, -4184,
+		-4184, 32767, 32767, -4186, -4186, -77,   32767, -77,
+		32767, -4188, 0,     -4189, 32767, 0,     0,     0,
+		0,     32767, 0,     0,     0,     32767, 0,     0,
+		0,     0,     0,     0,     0,     32767, 0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     0,     32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     -5937, -2358, 0,     0,     0,
+		-8286, 471,   472,   32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 1747,  32767, -2126, 32767, 32767, 1748,
+		1749,  1750,  1751,  1752,  1753,  8224,  1755,  -539,
+		1757,  781,   32767, 32767, 32767, -1991, -2035, 32767,
+		32767, 782,   -3784, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 837,   32767, 32767, 32767, 32767, 32767, -4008,
+		-4008, -4008, 2949,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     -797,  1806,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 4605,  4606,
+		32767, 32767, 0,     455,   32767, 0,     32767, 32767,
+		32767, 0,     32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -4244, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		784,   32767, 32767, 2950,  2951,  32767, 32767, 32767,
+		32767, 32767, 32767, 786,   787,   32767, 1252,  1253,
+		32767, 790,   32767, 0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     32767, 0,     32767, 32767,
+		32767, 0,     32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     0,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -200,  -200,  -200,
+		-200,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		-5932, -5932, 32767, 32767, 2952,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -5387,
+		-5387, -5387, -5387, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     0,     32767, 32767,
+		0,     0,     32767, 32767, 0,     0,     0,     0,
+		0,     0,     32767, 32767, 0,     0,     0,     0,
+		0,     0,     32767, 32767, 497,   498,   499,   500,
+		501,   502,   503,   504,   505,   506,   507,   508,
+		32767, 32767, -156,  765,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -861,
+		32767, 6106,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2953,  2954,  32767, 797,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 2955,  32767, 32767, 32767, -8929,
+		32767, -8885, -8885, -8885, 32767, 32767, 32767, 32767,
+		32767, 32767, -749,  7119,  7120,  32767, 32767, 32767,
+		32767, 2760,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, -1181, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -5587, 0,     7596,
+		7597,  0,     0,     0,     0,     0,     0,     32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     -714,  0,
+		0,     -713,  -712,  0,     -711,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     1859,
+		0,     3247,  32767, 32767, 0,     3247,  0,     3248,
+		0,     3249,  0,     3250,  0,     3251,  0,     3252,
+		808,   3252,  0,     3253,  0,     3254,  0,     0,
+		3256,  0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 0,     0,     0,
+		0,     32767, 32767, 32767, 32767, 0,     0,     6824,
+		32767, 0,     32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		4207,  4208,  0,     0,     0,     0,     0,     1896,
+		0,     0,     1898,  1898,  1898,  1898,  0,     0,
+		0,     1901,  1901,  0,     0,     0,     0,     0,
+		0,     -1319, 0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     7618,  7619,  7620,
+		3,     3,     1863,  1863,  7067,  7068,  7025,  7026,
+		7027,  7028,  7029,  7074,  7075,  7076,  7077,  -334,
+		7079,  7080,  7081,  7082,  7083,  7084,  7085,  7086,
+		7087,  7088,  7089,  7090,  1349,  1349,  1349,  1349,
+		1349,  1349,  1349,  1349,  1349,  1349,  1349,  1349,
+		1349,  1349,  1349,  1349,  8967,  8968,  7109,  7110,
+		1907,  1907,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 2976,  2977,  2978,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     0,     820,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 821,
+		2381,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 2005,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 823,   32767, 824,   32767,
+		825,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 826,   32767, 32767, 32767, 32767, 32767,
+		32767, 4575,  4576,  4577,  4578,  4579,  4580,  4581,
+		4582,  4583,  4584,  4585,  32767, 32767, 829,   32767,
+		32767, 32767, 32767, 830,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		6253,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		6253,  -3848, 834,   835,   836,   -3845, -3845, -3845,
+		-3845, -3845, -3845, 843,   844,   -4280, 32767, 845,
+		846,   6531,  848,   -3839, 32767, -3840, -3840, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 1946,  32767,
+		32767, 32767, -3849, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 853,   32767, 32767, 32767,
+		32767, 854,   32767, 32767, 32767, 32767, 855,   32767,
+		32767, 32767, 32767, 856,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		857,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -3799, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 8266,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 859,   32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 860,
+		32767, 861,   -5065, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 10746, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4526,
+		32767, 4573,  4574,  4575,  32767, 32767, -2436, -1376,
+		32767, 32767, 32767, 32767, 32767, -1689, -1689, 4349,
+		-4171, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 4588,  32767,
+		4589,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4590,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4591,  4592,  32767,
+		32767, 32767, 32767, 32767, 32767, 2933,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 864,   32767, 32767, 32767,
+		0,     32767, 0,     32767, 32767, -2977, 335,   335,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2992,  2993,  2994,  2995,
+		32767, 32767, 32767, 4596,  2550,  32767, 32767, 32767,
+		-1188, 4769,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		4600,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 2997,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4601,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 2013,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -11287,32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -4664, 32767, 32767, -4711, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -4718, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4049,
+		32767, 32767, 32767, 4050,  4051,  4052,  17313, 32767,
+		32767, 32767, 10684, 7370,  7371,  4057,  4058,  4059,
+		4060,  4061,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 4603,  8793,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1283,  4897,  4898,  4899,  12175, 4901,  4902,  32767,
+		4903,  4904,  4905,  4906,  4907,  10276, -1469, 1282,
+		1282,  1282,  1282,  1282,  1282,  1282,  1282,  1282,
+		1282,  32767, 32767, 4920,  4921,  4063,  -2051, -2050,
+		4925,  4926,  32767, 7332,  7333,  32767, 7334,  7335,
+		7336,  7337,  5045,  32767, 32767, 32767, -2049, -2048,
+		32767, -8294, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     1132,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     20166, 16852, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     6908,  6909,  6910,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		-4510, -4510, -4510, -4510, -4510, -4510, -4510, 0,
+		0,     0,     0,     0,     0,     -1831, -1831, -1831,
+		-15091,-11776,-11776,-8461, 0,     0,     0,     -1834,
+		-1834, -1834, -1834, -1834, 0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     -1819, -3615, 1345,  -3616, 0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     32767, 32767, 0,
+		0,     0,     0,     0,     0,     0,     8770,  8771,
+		8772,  8773,  8774,  8775,  8776,  8777,  8778,  8779,
+		45,    45,    45,    45,    2477,  2522,  45,    45,
+		45,    45,    -13215,-9900, -9900, -6585, -6585, -3270,
+		-3270, 45,    45,    45,    45,    45,    8802,  8803,
+		0,     0,     45,    45,    45,    45,    8810,  8811,
+		0,     0,     45,    2700,  2701,  2702,  2703,  5134,
+		2705,  2706,  0,     2708,  0,     -5957, 0,     -5957,
+		0,     3312,  3312,  3312,  13053, 7051,  1095,  3314,
+		0,     3315,  4896,  0,     3317,  3317,  3317,  3317,
+		3317,  3317,  3317,  2720,  3317,  3317,  0,     3318,
+		0,     3319,  0,     0,     3321,  8857,  8858,  8859,
+		0,     0,     8862,  8863,  2749,  2750,  2751,  0,
+		0,     0,     2755,  2756,  2757,  2758,  2759,  2760,
+		2761,  2762,  2763,  2764,  2765,  2766,  2767,  -3479,
+		-3479, 2770,  2771,  2772,  2773,  2774,  2775,  2776,
+		2777,  2778,  2779,  2780,  2781,  1267,  -1961, -1961,
+		2785,  2786,  2787,  2788,  2789,  2790,  2791,  2792,
+		-1097, -1096, 2795,  2796,  -1094, -1093, 4845,  0,
+		-1089, -1088, -1087, 7200,  -1556, -1556, 7248,  7249,
+		7205,  1037,  1038,  1039,  -1559, -1559, 7253,  7254,
+		7210,  7211,  200,   2803,  7168,  7215,  7216,  7217,
+		7218,  7219,  208,   209,   1269,  -1516, -1516, -1516,
+		916,   961,   961,   961,   10693, -1520, -14780,218,
+		219,   220,   -3514, -3514, -3514, -3514, -3514, -3514,
+		-3514, 228,   7241,  7242,  -1561, 8210,  8211,  -1518,
+		-1518, 8214,  8215,  9195,  5881,  351,   8219,  8220,
+		6448,  6449,  6450,  6451,  3864,  2870,  2871,  12671,
+		12627, 0,     0,     0,     0,     0,     12709, 6471,
+		12637, 12638, 5627,  8230,  12595, 12642, 2545,  8234,
+		12645, 8236,  5634,  3341,  2545,  0,     0,     5749,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     0,     0,     11602,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     1466,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     5760,  0,     0,     0,     0,     0,     32767,
+		0,     32767, 0,     0,     32767, 0,     0,     32767,
+		0,     3507,  3508,  0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		1644,  1645,  1646,  1647,  -5764, 1649,  1650,  1651,
+		1652,  1653,  1654,  1655,  1656,  1657,  1658,  1659,
+		1660,  -4081, -4081, -4081, -4081, -4081, -4081, -4081,
+		-4081, -4081, -4081, -4081, -4081, -4081, -4081, -4081,
+		-4081, 3537,  3538,  1679,  3582,  3583,  3584,  -3482,
+		-3482, -3482, -3482, -3482, -3526, -3526, -3526, -3526,
+		3886,  -3526, -3526, -3526, -3526, 3599,  3600,  3601,
+		3602,  3603,  3604,  3605,  3606,  3607,  3608,  3609,
+		3610,  3611,  3612,  3613,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     0,
+		-7275, 0,     0,     -7234, 0,     0,     0,     0,
+		0,     -5368, 6378,  3628,  3629,  3630,  3631,  3632,
+		3633,  3634,  3635,  3636,  3637,  3638,  3639,  0,
+		0,     859,   6974,  6974,  0,     0,     3647,  -2405,
+		-2405, 3650,  -2405, -2405, -2405, -2405, -112,  -2405,
+		-3201, 3658,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     32767, 32767, 32767,
+		32767, 5280,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		4637,  4638,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 4014,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 802,   32767, 32767,
+		32767, 32767, 803,   -1055, 805,   32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 4639,  32767,
+		32767, 32767, 806,   -2445, 0,     -2443, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 810,   32767, 32767,
+		32767, 32767, 811,   812,   813,   32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -6211, -6211, -6211, -6211, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -6271, -6271,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 935,   32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, -10300,32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     0,     32767, 32767, 4640,  4641,  32767,
+		32767, 32767, 32767, 32767, 4624,  32767, 32767, 32767,
+		-4233, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1859,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 872,   32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -4568, -1253, 32767,
+		-3590, 32767, 32767, 32767, -1820, -1820, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 873,   874,   875,   3629,  0,     0,
+		0,     5048,  5005,  5006,  5007,  5008,  5009,  5054,
+		5055,  5056,  0,     0,     0,     0,     0,     32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4118,
+		32767, 32767, 32767, 32767, -4122, -4122, -4122, -4122,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4193,
+		32767, -4194, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -4209, 32767, 32767, -4211, -4211, -4211,
+		-4211, -4211, -4211, -4211, 32767, 32767, -4213, -10683,
+		-4213, -1918, -4213, -6043, 32767, 32767, -4215, -6047,
+		32767, -4216, -10696,-4216, -4216, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4646,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 876,   877,   0,     32767, 0,     32767, 0,
+		32767, 0,     32767, 0,     32767, 32767, 32767, 0,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 1844,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     -2899, 0,     32767,
+		0,     32767, 0,     32767, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     836,   0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     32767, 0,     0,     0,     879,
+		880,   881,   882,   883,   884,   885,   886,   0,
+		0,     887,   0,     920,   0,     922,   923,   924,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 5431,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 3639,  889,   890,   891,   892,   893,
+		894,   895,   896,   897,   898,   899,   900,   -2739,
+		927,   -1881, 4234,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -459,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -458,
+		-457,  904,   32767, 905,   32767, 906,   32767, 907,
+		32767, 908,   32767, 32767, 32767, 909,   32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     910,
+		0,     0,     0,     0,     0,     0,     911,   0,
+		912,   1626,  1626,  913,   914,   1626,  915,   916,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     -1837, -1837, -1837,
+		-6487, -1837, -1837, 0,     0,     0,     917,   31,
+		919,   0,     921,   0,     0,     0,     925,   0,
+		32767, 4801,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     -6470, 0,     2295,
+		0,     -1830, 0,     -6475, 0,     -1832, 0,     0,
+		-6480, 0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     3665,  0,     0,
+		0,     0,     2281,  0,     0,     -7412, 5769,  5770,
+		5771,  5772,  5773,  5774,  0,     0,     0,     0,
+		32767, 0,     0,     32767, 32767, 0,     32767, 32767,
+		0,     0,     32767, 32767, 0,     0,     0,     -1842,
+		32767, 0,     0,     0,     -1846, -1846, -2560, -1846,
+		0,     -2560, -2559, 0,     0,     32767, 0,     32767,
+		0,     0,     0,     0,     0,     0,     1388,  0,
+		1387,  1387,  1387,  0,     1387,  1387,  1387,  1387,
+		1387,  1387,  1387,  1387,  1387,  1387,  1387,  1387,
+		1387,  1387,  1387,  1387,  1387,  1387,  1387,  1387,
+		1387,  0,     -1870, 0,     -1871, 0,     0,     0,
+		0,     0,     0,     -1877, 0,     0,     -1877, -1877,
+		0,     0,     0,     4944,  0,     -1875, 4947,  4948,
+		0,     4950,  4951,  4952,  4953,  4954,  4955,  4956,
+		4957,  4958,  4959,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		32767, 32767, 0,     0,     0,     0,     32767, 32767,
+		32767, 0,     0,     931,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4650,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 5375,
+		5376,  5377,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 13180, 0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, -4011, 933,   -4011, 32767,
+		935,   936,   -4012, 938,   939,   940,   941,   942,
+		943,   944,   945,   946,   947,   32767, 1075,  1076,
+		1077,  -6334, 1079,  1080,  954,   32767, 32767, 32767,
+		32767, 955,   32767, 32767, 32767, 32767, 32767, 32767,
+		-4659, 32767, 32767, 32767, -4662, -4662, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 959,   960,   961,   32767, 962,   963,   964,
+		965,   966,   967,   968,   969,   970,   971,   972,
+		32767, 973,   974,   975,   976,   977,   978,   979,
+		980,   981,   982,   983,   984,   985,   986,   987,
+		988,   989,   990,   32767, 991,   992,   993,   994,
+		995,   996,   997,   998,   999,   1000,  1001,  1002,
+		1003,  1004,  1005,  1006,  1007,  1008,  1009,  1010,
+		1011,  1012,  1013,  1014,  1015,  1016,  1017,  -362,
+		-362,  32767, 32767, 32767, 32767, -410,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 1019,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		164,   1021,  -3551, -3551, 1024,  1025,  1026,  1027,
+		1028,  1029,  1030,  1031,  1032,  1033,  1034,  1035,
+		1036,  1037,  1038,  1039,  1040,  1041,  1042,  1043,
+		1044,  1045,  1046,  1047,  1048,  1049,  1050,  1051,
+		1052,  1053,  1054,  1055,  1056,  1057,  1058,  1059,
+		1060,  1061,  1062,  1063,  1064,  1065,  1066,  1067,
+		1068,  1069,  1070,  1071,  1072,  1073,  1074,  1075,
+		1076,  1077,  1078,  1079,  1080,  1081,  1082,  1083,
+		1084,  1085,  1086,  1087,  1088,  1089,  1090,  1091,
+		1092,  1093,  1094,  1095,  1096,  1097,  1098,  1099,
+		1100,  1101,  1102,  1103,  1104,  1105,  1106,  1107,
+		1108,  1109,  1110,  1111,  1112,  1113,  1114,  32767,
+		1115,  1116,  1117,  1118,  1119,  32767, 1120,  1121,
+		1122,  1123,  1124,  1125,  1126,  1127,  1128,  1129,
+		1130,  1131,  0,     1133,  1134,  1135,  1136,  1137,
+		1138,  1139,  1140,  1141,  1142,  1143,  1144,  1145,
+		1146,  1147,  1148,  1149,  1150,  1151,  1152,  1153,
+		1154,  1155,  1156,  1157,  1158,  1159,  1160,  1161,
+		1162,  1163,  1164,  1165,  1166,  1167,  1168,  1169,
+		1170,  1171,  1172,  1173,  1174,  1175,  1176,  1177,
+		1178,  1179,  1180,  1181,  1182,  1183,  1184,  1185,
+		1186,  1187,  1188,  1189,  1190,  1191,  1192,  1193,
+		1194,  1195,  1196,  1197,  1198,  1199,  1200,  1201,
+		1202,  1203,  1204,  1205,  1206,  1207,  1208,  1209,
+		-18956,-15641,1212,  1213,  1214,  1215,  1216,  1217,
+		1218,  1219,  1220,  1221,  1222,  1223,  1224,  1225,
+		-5682, -5682, -5682, 1229,  1230,  1231,  1232,  1233,
+		1234,  1235,  1236,  1237,  1238,  1239,  5750,  5751,
+		5752,  5753,  5754,  5755,  5756,  1247,  1248,  1249,
+		1250,  1251,  1252,  3084,  3085,  3086,  16347, 13033,
+		13034, 9720,  1260,  1261,  1262,  3097,  3098,  3099,
+		3100,  3101,  1268,  1269,  1270,  1271,  1272,  1273,
+		1274,  1275,  32767, 32767, 32767, 32767, 1276,  1277,
+		1278,  1279,  1280,  1281,  1282,  1283,  1284,  1285,
+		1286,  1287,  1288,  1289,  1290,  1291,  1292,  1293,
+		1294,  1295,  1296,  1297,  1298,  1299,  1300,  1301,
+		1302,  1303,  1304,  1305,  1306,  1307,  1308,  1309,
+		1310,  1311,  1312,  1313,  1314,  1315,  1316,  1317,
+		1318,  1319,  1320,  1321,  1322,  1323,  1324,  1325,
+		1326,  1327,  1328,  1329,  1330,  1331,  1332,  1333,
+		1334,  1335,  1336,  1337,  1338,  1339,  1340,  1341,
+		1342,  3162,  4959,  0,     4962,  1347,  1348,  1349,
+		1350,  1351,  1352,  1353,  1354,  1355,  1356,  1357,
+		1358,  1359,  1360,  1361,  1362,  1363,  1364,  1365,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 7481,
+		7482,  7483,  7484,  5053,  5009,  7487,  7488,  7489,
+		7490,  20751, 17437, 17438, 14124, 14125, 10811, 10812,
+		7498,  7499,  7500,  7501,  7502,  32767, 32767, 7548,
+		7549,  7505,  7506,  7507,  7508,  32767, 32767, 7554,
+		7555,  7511,  4857,  4857,  4857,  4857,  2427,  4857,
+		4857,  7564,  4857,  7566,  13524, 7568,  13526, 7570,
+		4259,  4260,  4261,  -5479, 524,   6481,  4263,  7578,
+		4264,  2684,  1421,  -7842, -4527, -4527, -1212, -1212,
+		-1212, -1212, -1212, 7545,  7546,  0,     0,     -1214,
+		-1214, -1214, -1214, 7551,  7552,  32767, 1610,  -1216,
+		1439,  1440,  1441,  1442,  3873,  1444,  1445,  32767,
+		1446,  32767, -7220, 32767, -7221, 0,     2047,  2047,
+		2047,  11788, 5786,  -170,  2049,  -1265, 2050,  3631,
+		-1265, 2052,  2052,  2052,  2052,  2052,  2052,  2052,
+		1455,  2052,  2052,  -1265, 2053,  -1265, 2054,  -1265,
+		-1265, 2056,  7592,  7593,  7594,  32767, 32767, 7595,
+		7596,  1482,  1483,  1484,  -1267, -1267, -1267, 1488,
+		1489,  1490,  1491,  1492,  1493,  1494,  1495,  1496,
+		1497,  1498,  1499,  1500,  -4746, -4746, 1503,  1504,
+		1505,  1506,  1507,  1508,  1509,  1510,  1511,  1512,
+		1513,  1514,  0,     -3228, -3228, 1518,  1519,  1520,
+		1521,  1522,  1523,  1524,  1525,  -2364, -2363, 1528,
+		1529,  -2361, -2360, 3578,  0,     -2357, -2356, -2355,
+		5932,  -2824, -2824, 5980,  5981,  5937,  -231,  -230,
+		-229,  -2827, -2827, 5985,  -225,  5941,  5942,  -1069,
+		1534,  5899,  5946,  5947,  5948,  5949,  5950,  -1061,
+		-1060, 0,     -2785, 0,     -355,  -355,  -310,  -310,
+		-310,  9422,  -2791, 32767, -1054, -1053, -1052, -4786,
+		-4786, -4786, -4786, -4786, -4786, -4786, -1044, 5969,
+		5970,  -2833, 6938,  6939,  -2790, -2790, 6942,  0,
+		32767, 4607,  -923,  6945,  32767, 5173,  5174,  5175,
+		5176,  2589,  1595,  1596,  11396, 11352, 32767, 32767,
+		6126,  2812,  2813,  2814,  2815,  2816,  -5940, -5940,
+		1607,  1608,  2823,  32767, 32767, 1516,  0,     -8581,
+		0,     0,     728,   1525,  163,   -11068,0,     -2262,
+		-2306, -2305, 32767, 32767, 0,     0,     1580,  0,
+		0,     0,     -6443, 1685,  -10176,-4173, 1784,  -4173,
+		0,     -4172, 5925,  -4171, -4171, -4171, 0,     -437,
+		0,     0,     0,     161,   -435,  0,     2883,  -434,
+		0,     0,     0,     0,     -436,  0,     -5972, 0,
+		0,     0,     0,     0,     0,     0,     0,     2889,
+		2890,  2891,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     6371,
+		0,     0,     0,     0,     0,     0,     0,     117,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     32767, 0,     0,     3991,  3991,
+		3991,  3991,  0,     3990,  3990,  3990,  -1947, 1632,
+		3990,  3990,  3990,  -4296, 4461,  4462,  -4341, -4341,
+		-4296, 1873,  1873,  1873,  4472,  4473,  -4338, 1873,
+		-4292, -4292, 2720,  118,   -4246, -4292, -4292, 117,
+		-4293, -4293, 2719,  2719,  1660,  4446,  1662,  2018,
+		2019,  1975,  1976,  1977,  -7754, -7754, -8733, -5418,
+		113,   0,     112,   -2157, -5891, -5891, 0,     -5892,
+		6455,  -5893, 0,     0,     0,     32767, 32767, 32767,
+		5826,  32767, 32767, 32767, 32767, 6806,  32767, -2039,
+		32767, 5829,  32767, 5830,  5831,  5832,  32767, 5833,
+		5834,  32767, 5835,  32767, 32767, -3520, 0,     5837,
+		0,     5838,  0,     4035,  0,     5840,  32767, 10251,
+		154,   1671,  10253, 1673,  1674,  947,   151,   1514,
+		12746, 1679,  3942,  3987,  3987,  3987,  13719, 13720,
+		14700, 103,   5855,  13723, 5857,  8127,  0,     11862,
+		5860,  -96,   5862,  1690,  5863,  -4233, 5864,  5865,
+		5866,  5867,  5868,  5869,  5870,  5871,  5872,  5873,
+		32767, 5874,  5875,  5876,  5877,  5878,  5879,  5880,
+		5881,  5882,  5883,  13795, 5885,  5886,  5887,  5888,
+		10489, 5890,  1703,  1704,  -4247, 1706,  1707,  5891,
+		5892,  5893,  1711,  4098,  5895,  5896,  5897,  7650,
+		32767, 5899,  6406,  7966,  5902,  5903,  5904,  5905,
+		5906,  5907,  5908,  1800,  5910,  1801,  5912,  5913,
+		5914,  5915,  32767, 1727,  1728,  1729,  1730,  32767,
+		1731,  1732,  1733,  32767, 1734,  1735,  1736,  1737,
+		1738,  1739,  1740,  32767, 1741,  1742,  1743,  1744,
+		1745,  1746,  32767, 32767, 32767, 32767, 1747,  1748,
+		1749,  1750,  1751,  32767, 32767, 32767, 32767, 32767,
+		32767, 1752,  1753,  1754,  1755,  1756,  1757,  1758,
+		1759,  1760,  1761,  1762,  1763,  1764,  1765,  1766,
+		1767,  1768,  1769,  1770,  1771,  1772,  1773,  1774,
+		1775,  1776,  1777,  1778,  1779,  1780,  1781,  1782,
+		1783,  1784,  1785,  1786,  1787,  1788,  1789,  1790,
+		1791,  7729,  4151,  1794,  1795,  1796,  10083, 1327,
+		1327,  10131, 10132, 10088, 3920,  3921,  3922,  1324,
+		1324,  10136, 3926,  10092, 10093, 3082,  5685,  10050,
+		10097, 0,     5689,  10100, 5691,  3089,  796,   0,
+		1363,  12595, 3792,  3792,  3837,  3837,  3837,  13569,
+		13570, 14550, 11236, 5706,  13574, 5708,  7978,  11713,
+		11714, 11715, 11716, 11717, 11718, 11719, 7978,  966,
+		966,   9770,  0,     0,     9730,  9731,  0,     0,
+		-979,  2336,  7867,  0,     0,     32767, 0,     0,
+		0,     32767, 0,     0,     32767, 0,     32767, 32767,
+		9356,  32767, 0,     32767, 0,     32767, 1804,  2602,
+		0,     -4364, -4410, 5688,  0,     -4410, 0,     2603,
+		4897,  5694,  4332,  -6899, 1905,  1906,  1862,  1863,
+		1864,  -7867, -7867, -8846, -5531, 0,     -7867, 0,
+		-2269, -6003, -6003, 0,     5957,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     -7911, 0,
+		0,     0,     0,     -4600, 0,     0,     4156,  32767,
+		32767, 0,     0,     0,     0,     0,     1796,  0,
+		0,     0,     -1752, 0,     0,     -506,  -2065, 0,
+		0,     0,     0,     0,     0,     0,     4109,  0,
+		4110,  0,     0,     0,     0,     0,     4111,  17372,
+		0,     14058, 10744, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     -4650, 0,     0,     4161,  32767,
+		32767, 4117,  32767, 4118,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -7946, 32767, -4632, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4642,
+		-4642, 4123,  4124,  -4687, 0,     0,     -4644, -4644,
+		0,     0,     -4646, -4646, 32767, 32767, 32767, 32767,
+		32767, 32767, 4084,  4085,  32767, 32767, 1609,  4087,
+		32767, 32767, 4088,  17349, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 10092, 4136,
+		10094, 4138,  10096, 0,     10097, 10098, 10099, 10100,
+		10101, 0,     32767, 32767, 32767, 0,     0,     0,
+		0,     0,     0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     32767, 32767, 0,     10138, 10139,
+		0,     0,     0,     10145, 32767, 32767, 32767, 32767,
+		32767, 32767, -1425, 8316,  2314,  -3642, 32767, 0,
+		32767, 32767, 32767, 32767, -1426, -1426, -1426, -1426,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 52,    52,    52,    52,    52,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 1849,  1850,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		100,   101,   102,   103,   104,   105,   106,   107,
+		108,   -5633, -5633, -5633, -5633, -5633, -5633, -5633,
+		-5633, -5633, -5633, -5633, -5633, -5633, -5633, -5633,
+		-5633, 1985,  1986,  127,   2030,  2031,  2032,  -5034,
+		32767, 32767, 32767, 32767, 32767, 0,     32767, 32767,
+		32767, 5916,  5917,  5918,  5919,  5920,  5921,  5922,
+		5923,  5924,  8824,  5926,  32767, 32767, 0,     32767,
+		0,     5927,  5928,  5929,  5930,  5931,  5932,  5933,
+		5934,  5935,  5936,  5937,  5938,  5939,  5940,  5105,
+		5942,  5943,  5944,  5945,  5946,  5947,  5948,  5949,
+		5950,  5951,  5952,  5953,  5954,  5955,  5956,  5957,
+		32767, 5958,  5959,  5960,  5082,  5082,  5082,  5082,
+		5082,  5082,  5082,  5082,  5969,  5970,  5084,  5972,
+		5053,  5974,  5053,  5053,  5053,  5978,  5979,  5980,
+		5981,  5982,  5983,  5984,  5985,  5986,  5987,  5988,
+		5989,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2552,  32767, 32767, 32767,
+		32767, 32767, 32767, 5990,  5991,  5992,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 5993,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 6936,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 1851,  1852,  1853,  1854,
+		1855,  1856,  1857,  1858,  1859,  1860,  1861,  1862,
+		1863,  1864,  1200,  2121,  1200,  1868,  1869,  1870,
+		1871,  1872,  1873,  1874,  1875,  1876,  1877,  1878,
+		1879,  1880,  1188,  1188,  1188,  1188,  1188,  1188,
+		1188,  1188,  1188,  1188,  1188,  1188,  1188,  1188,
+		1188,  1188,  1188,  1188,  1188,  1188,  -5282, 1188,
+		3483,  1188,  -642,  1188,  -5287, 1188,  -644,  1188,
+		1188,  -5292, 1188,  1188,  1188,  1188,  1188,  1188,
+		1188,  1188,  1188,  1188,  1188,  1188,  1925,  1926,
+		-6187, -6231, 1184,  3465,  1184,  1184,  -6228, 6953,
+		6954,  6955,  6956,  0,     1939,  1940,  1941,  1942,
+		1943,  1944,  1178,  1178,  1947,  1948,  1949,  1950,
+		1951,  1952,  1953,  1954,  1955,  1956,  1957,  1958,
+		1959,  1960,  1961,  1962,  1963,  1964,  1965,  1966,
+		1967,  1968,  1969,  1970,  1971,  1972,  1973,  1974,
+		1975,  1976,  1977,  1978,  1979,  1980,  1981,  1982,
+		1983,  1984,  1985,  1986,  1987,  1988,  1989,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 709,   666,   667,   668,   32767, 669,
+		714,   715,   716,   717,   -6694, 719,   720,   721,
+		32767, 722,   723,   724,   32767, 725,   726,   727,
+		728,   -5013, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 6052,  0,     0,     6055,
+		0,     0,     0,     0,     2293,  0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 1244,  1245,  1246,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4660,
+		-4660, -4660, -4660, 4097,  4098,  -4705, -4705, -4660,
+		-4660, -4660, -4660, 4105,  4106,  -4705, 32767, -4661,
+		-4661, -4661, -4617, -4617, -4663, -4663, -4663, -4663,
+		-4663, -4663, -4663, 4072,  4073,  4074,  4075,  1644,
+		1600,  4078,  4079,  4080,  4081,  17342, 14028, 14029,
+		10715, 10716, 7402,  7403,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     32767, 0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		32767, 0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     1380,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 856,   0,     4573,
+		4574,  0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 0,     0,     0,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		5204,  5161,  5162,  5163,  5164,  5165,  5210,  5211,
+		5212,  5213,  -2198, 5215,  5216,  5217,  5218,  5219,
+		5220,  5221,  5222,  5223,  5224,  5225,  5226,  -515,
+		-515,  -515,  -515,  -515,  -515,  -515,  -515,  -515,
+		-515,  -515,  -515,  -515,  -515,  -515,  -515,  7103,
+		7104,  5245,  5246,  5247,  5248,  5249,  -1014, 5251,
+		5252,  5253,  5254,  5255,  5256,  5257,  5258,  5259,
+		5260,  8663,  8664,  -92,   -92,   8712,  8713,  8669,
+		8670,  8671,  8672,  -92,   -92,   8720,  8721,  8677,
+		8678,  8679,  8636,  8637,  8684,  8685,  8686,  8687,
+		8688,  8689,  8690,  -44,   -44,   -44,   -44,   2388,
+		2433,  -44,   -44,   -44,   -44,   -13304,-9989, -9989,
+		-6674, -6674, -3359, -3359, -44,   -44,   -44,   -44,
+		-44,   8713,  8714,  -89,   -89,   -44,   -44,   -44,
+		-44,   8721,  8722,  -89,   -89,   -44,   -44,   -44,
+		0,     0,     -46,   -46,   -46,   -46,   -46,   -46,
+		-46,   8689,  8690,  8691,  8692,  6261,  6217,  8695,
+		8696,  8697,  8698,  21959, 18645, 18646, 15332, 15333,
+		12019, 12020, 8706,  8707,  8708,  8709,  8710,  -46,
+		-46,   8758,  8759,  8715,  8716,  8717,  8718,  -46,
+		-46,   8766,  8767,  8723,  8724,  8725,  8726,  8727,
+		8728,  8729,  8730,  8731,  8732,  8733,  8734,  0,
+		0,     0,     0,     2432,  2477,  0,     0,     0,
+		0,     -13260,-9945, -9945, -6630, -6630, -3315, -3315,
+		0,     0,     0,     0,     0,     8757,  8758,  -45,
+		-45,   0,     0,     0,     0,     8765,  8766,  -45,
+		-45,   0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     8735,  8736,  8737,
+		8738,  6307,  6263,  8741,  8742,  8743,  8744,  22005,
+		18691, 18692, 15378, 15379, 12065, 12066, 8752,  8753,
+		8754,  8755,  8756,  0,     0,     8804,  8805,  8761,
+		8762,  8763,  8764,  0,     0,     8812,  8813,  8769,
+		6115,  6115,  6115,  6115,  3685,  6115,  6115,  8822,
+		6115,  8824,  14782, 8826,  14784, 8828,  5517,  5518,
+		5519,  -4221, 1782,  7739,  5521,  8836,  5522,  3942,
+		8839,  5523,  5524,  5525,  5526,  5527,  5528,  5529,
+		6127,  5531,  5532,  8850,  5533,  8852,  5534,  8854,
+		8855,  5535,  0,     0,     0,     8860,  8861,  0,
+		0,     0,     13252, 9939,  9939,  6626,  6626,  3313,
+		3313,  0,     0,     0,     -9269, -3312, 0,     0,
+		0,     9741,  32767, 32767, 0,     32767, 0,     32767,
+		32767, 0,     0,     0,     0,     0,     0,     0,
+		-597,  0,     0,     32767, 0,     32767, 0,     32767,
+		32767, 0,     0,     32767, 32767, 32767, 0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     32767, 32767, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     -1387, 0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -1773, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, -4161, 1581,  1582,  32767, 32767, 1990,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 1539,  32767, 32767, 6150,  6151,  6152,  411,
+		411,   411,   411,   411,   411,   411,   411,   411,
+		411,   411,   411,   411,   411,   411,   411,   8029,
+		8030,  6171,  6172,  969,   969,   1013,  1013,  1013,
+		1013,  1013,  969,   969,   969,   969,   8381,  969,
+		969,   969,   969,   969,   969,   969,   969,   969,
+		969,   969,   969,   6711,  6712,  6713,  6714,  6715,
+		6716,  6717,  6718,  6719,  6720,  6721,  6722,  6723,
+		6724,  6725,  6726,  -891,  -891,  969,   969,   6173,
+		6174,  6131,  6132,  6133,  6134,  6135,  6180,  6181,
+		6182,  6183,  -1228, 6185,  6186,  6187,  6188,  6189,
+		6190,  6191,  6192,  6193,  6194,  6195,  6196,  455,
+		455,   455,   455,   455,   455,   455,   455,   455,
+		455,   455,   455,   455,   455,   455,   455,   8073,
+		8074,  6215,  6216,  1013,  1013,  1057,  1057,  1057,
+		1057,  1057,  1013,  1013,  1013,  1013,  8425,  1013,
+		1013,  1013,  1013,  1013,  1013,  1013,  1013,  1013,
+		1013,  1013,  1013,  6755,  6756,  6757,  6758,  6759,
+		6760,  6761,  6762,  6763,  6764,  6765,  6766,  6767,
+		6768,  6769,  6770,  -847,  -847,  1013,  1013,  6217,
+		6218,  6175,  6176,  6177,  6178,  6179,  6224,  6225,
+		6226,  6227,  -1184, 6229,  6230,  6231,  6232,  6233,
+		6234,  6235,  6236,  6237,  6238,  6239,  6240,  499,
+		499,   499,   499,   499,   499,   499,   499,   499,
+		499,   499,   499,   499,   499,   499,   499,   8117,
+		8118,  6259,  6260,  6261,  6262,  6263,  0,     6265,
+		6266,  6267,  6268,  6269,  6270,  6271,  6272,  6273,
+		6274,  9677,  9678,  922,   922,   9726,  9727,  9683,
+		9684,  9685,  9686,  922,   922,   9734,  9735,  9691,
+		9692,  9693,  9650,  9651,  9698,  9699,  9700,  9701,
+		9702,  9703,  9704,  970,   970,   970,   970,   3402,
+		3447,  970,   970,   970,   970,   -12290,-8975, -8975,
+		-5660, -5660, -2345, -2345, -2345, -2345, -2345, 6412,
+		6413,  -2390, -2390, -2345, -2345, -2345, -2345, 6420,
+		6421,  -2390, -2390, -2345, -2345, -2345, -2301, -2301,
+		-2347, -2347, -2347, -2347, -2347, -2347, -2347, 6388,
+		6389,  6390,  6391,  3960,  3916,  6394,  6395,  6396,
+		6397,  19658, 16344, 16345, 13031, 13032, 9718,  9719,
+		6405,  6406,  6407,  6408,  6409,  -2347, -2347, 6457,
+		6458,  6414,  6415,  6416,  6417,  -2347, -2347, 6465,
+		6466,  6422,  6423,  6424,  6381,  6382,  6429,  6430,
+		6431,  6432,  6433,  6434,  6435,  -2299, -2299, -2299,
+		-2299, 133,   178,   -2299, -2299, -2299, -2299, -15559,
+		-12244,-12244,-8929, -8929, -5614, -5614, -2299, -2299,
+		-2299, -2299, -2299, 6458,  6459,  -2344, -2344, -2299,
+		-2299, -2299, -2299, 6466,  6467,  -2344, -2344, -2299,
+		-2299, -2299, -2299, -2299, -2299, -2299, -2299, -2299,
+		-2299, -2299, -2299, 6436,  6437,  6438,  6439,  4008,
+		3964,  6442,  6443,  6444,  6445,  19706, 16392, 16393,
+		13079, 13080, 9766,  9767,  6453,  6454,  6455,  6456,
+		6457,  -2299, -2299, 6505,  6506,  6462,  6463,  6464,
+		6465,  -2299, -2299, 6513,  6514,  6470,  6471,  6472,
+		6473,  6474,  6475,  6476,  6477,  6478,  6479,  6480,
+		6481,  -2253, -2253, -2253, -2253, 179,   224,   -2253,
+		-2253, -2253, -2253, -15513,-12198,-12198,-8883, -8883,
+		-5568, -5568, -2253, -2253, -2253, -2253, -2253, 6504,
+		6505,  -2298, -2298, -2253, -2253, -2253, -2253, 6512,
+		6513,  -2298, -2298, -2253, 402,   403,   404,   405,
+		2836,  407,   408,   -2298, 410,   -2298, -8255, -2298,
+		-8255, -2298, 1014,  1014,  1014,  10755, 4753,  -1203,
+		1016,  -2298, 1017,  2598,  -2298, 1019,  1019,  1019,
+		1019,  1019,  1019,  1019,  422,   1019,  1019,  -2298,
+		1020,  -2298, 1021,  -2298, -2298, 1023,  6559,  6560,
+		6561,  -2298, -2298, 6564,  6565,  6566,  -6685, -3371,
+		-3370, -56,   -55,   3259,  3260,  3261,  12531, 6575,
+		3264,  3265,  3266,  -6474, -471,  5486,  3268,  6583,
+		3269,  1689,  6586,  3270,  3271,  3272,  3273,  3274,
+		3275,  3276,  3874,  3278,  3279,  6597,  3280,  6599,
+		3281,  6601,  6602,  3282,  3283,  32767, 32767, 32767,
+		3284,  3285,  3286,  3287,  3288,  3289,  3290,  3291,
+		3292,  3293,  3294,  3295,  3296,  3297,  3298,  3299,
+		3300,  3301,  3302,  3303,  3304,  3305,  3306,  3307,
+		3308,  3309,  3310,  3311,  3312,  3313,  3314,  3315,
+		3316,  3317,  3318,  3319,  3320,  3321,  3322,  3323,
+		3324,  3325,  3326,  3327,  3328,  3329,  3330,  3331,
+		3332,  3333,  3334,  3335,  3336,  3337,  3338,  3339,
+		3340,  3341,  3342,  3343,  3344,  3345,  3346,  3347,
+		3348,  3349,  3350,  3351,  32767, 32767, 3352,  3353,
+		3354,  3355,  3356,  3357,  3358,  3359,  3360,  3361,
+		3362,  3363,  3364,  3365,  3366,  3367,  3368,  3369,
+		3370,  3371,  3372,  3373,  3374,  3375,  3376,  3377,
+		3378,  3379,  3380,  3381,  3382,  3383,  3384,  3385,
+		3386,  3387,  3388,  3389,  3390,  3391,  3392,  3393,
+		3394,  3395,  3396,  3397,  3398,  3399,  3400,  3401,
+		3402,  3403,  3404,  3405,  3406,  3407,  4795,  3409,
+		3410,  3411,  3412,  3413,  3414,  3415,  3416,  3417,
+		3418,  3419,  3420,  3421,  3422,  3423,  3424,  3425,
+		3426,  3427,  3428,  3429,  3430,  3431,  3432,  3433,
+		3434,  3435,  3436,  3437,  3438,  3439,  3440,  3441,
+		3442,  3443,  3444,  3445,  3446,  3447,  3448,  3449,
+		3450,  3451,  3452,  3453,  3454,  3455,  3456,  3457,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 3458,
+		3459,  3460,  3461,  3462,  -8139, 3464,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 3465,  3466,  2001,  3468,  3469,  32767,
+		32767, 32767, 32767, 32767, 3470,  3471,  3472,  3473,
+		3474,  3475,  3476,  3477,  3478,  3479,  3480,  3481,
+		3482,  3483,  3484,  3485,  3486,  3487,  3488,  3489,
+		3490,  3491,  3492,  3493,  3494,  3495,  32767, 3496,
+		3497,  3498,  3499,  3500,  32767, 3501,  32767, 3502,
+		3503,  32767, 3504,  3505,  32767, 3506,  0,     0,
+		3509,  3510,  3511,  3512,  3513,  3514,  3515,  3516,
+		3517,  3518,  3519,  3520,  3521,  3522,  3523,  3524,
+		3525,  3526,  3527,  3528,  3529,  3530,  3531,  3532,
+		3533,  3534,  3535,  3536,  3537,  3538,  3539,  3540,
+		3541,  3542,  3543,  3544,  3545,  1902,  1902,  1902,
+		1902,  9314,  1902,  1902,  1902,  1902,  1902,  1902,
+		1902,  1902,  1902,  1902,  1902,  1902,  7644,  7645,
+		7646,  7647,  7648,  7649,  7650,  7651,  7652,  7653,
+		7654,  7655,  7656,  7657,  7658,  7659,  42,    42,
+		1902,  0,     0,     0,     7067,  7068,  7069,  7070,
+		7071,  7116,  7117,  7118,  7119,  -292,  7121,  7122,
+		7123,  7124,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     3614,  3615,  3616,  10892, 3618,  3619,
+		10854, 3621,  3622,  3623,  3624,  3625,  8994,  -2751,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     3640,  3641,  2783,  -3331,
+		-3330, 3645,  3646,  0,     6053,  6054,  0,     6056,
+		6057,  6058,  6059,  3767,  6061,  6858,  0,     0,
+		3659,  0,     0,     1531,  1531,  1531,  1531,  1531,
+		1531,  1531,  1531,  1531,  1531,  1531,  1531,  1531,
+		1531,  1531,  9149,  9150,  7291,  7292,  7293,  7294,
+		7295,  1032,  7297,  7298,  7299,  7300,  7301,  7302,
+		7303,  7304,  0,     7307,  10710, 10711, 1955,  1955,
+		10759, 10760, 10716, 4548,  4549,  4550,  1952,  1952,
+		10764, 10765, 10721, 10722, 3711,  6314,  10679, 10726,
+		10727, 10728, 10729, 10730, 3719,  3720,  1996,  1996,
+		1996,  1996,  4428,  4473,  4473,  3728,  1994,  1994,
+		-11266,3732,  3733,  3734,  0,     0,     0,     0,
+		0,     0,     0,     3742,  10755, 10756, 1953,  1953,
+		1998,  1998,  1998,  11730, 11731, 12711, 9397,  3867,
+		11735, 3869,  6139,  9874,  9875,  9876,  9877,  9878,
+		9879,  9880,  6139,  -873,  -873,  7931,  -1839, -1839,
+		7891,  7892,  -1839, -1839, -2818, 497,   6028,  -1839,
+		-1839, -66,   -66,   -66,   -66,   2522,  2523,  -6280,
+		-6280, -6235, -66,   -66,   -66,   2533,  2534,  -6277,
+		-66,   -6231, -6231, 781,   -1821, -6185, -6231, 3867,
+		-1821, -6231, -1821, 782,   3076,  3873,  2511,  -8720,
+		84,    85,    41,    42,    43,    -9688, -9688, -10667,
+		-7352, -1821, -9688, -1821, -4090, -7824, -7824, -7824,
+		-7824, -7824, -7824, -7824, -4082, 2931,  2932,  -5871,
+		3900,  3901,  -5828, -5828, 3904,  3905,  4885,  1571,
+		-3959, 3909,  3910,  2138,  2139,  2140,  2141,  -446,
+		-446,  8358,  8359,  8315,  2147,  2148,  2149,  -449,
+		-449,  8363,  2153,  8319,  8320,  1309,  3912,  8277,
+		8324,  -1773, 3916,  8327,  3918,  1316,  -977,  -1773,
+		-410,  10822, 2019,  2019,  2064,  2064,  2064,  11796,
+		11797, 12777, 9463,  3933,  11801, 3935,  6205,  9940,
+		9941,  9942,  9943,  9944,  9945,  9946,  6205,  -807,
+		-807,  7997,  -1773, -1773, 7957,  7958,  -1773, -1773,
+		-2752, 563,   6094,  -1773, -1773, 0,     0,     0,
+		0,     2588,  2589,  -6214, -6214, -6169, 0,     0,
+		0,     2599,  2600,  -6211, 0,     -6165, -6165, 847,
+		-1755, -6119, -6165, 3933,  -1755, -6165, -1755, 848,
+		3142,  3939,  2577,  -8654, 150,   151,   107,   108,
+		109,   -9622, -9622, -10601,-7286, -1755, -9622, -1755,
+		-4024, -7758, -7758, -7758, -7758, -7758, -7758, -7758,
+		-4016, 2997,  2998,  -5805, 3966,  3967,  -5762, -5762,
+		3970,  3971,  4951,  1637,  -3893, 3975,  3976,  2204,
+		2205,  2206,  2207,  -380,  -380,  8424,  8425,  8381,
+		2213,  2214,  2215,  -383,  -383,  8429,  2219,  8385,
+		8386,  1375,  3978,  8343,  8390,  -1707, 3982,  8393,
+		3984,  1382,  -911,  -1707, -344,  10888, 2085,  2085,
+		2130,  2130,  2130,  11862, 11863, 12843, 9529,  3999,
+		11867, 4001,  6271,  10006, 10007, 4005,  -1951, 4007,
+		4008,  4009,  4010,  4011,  4012,  4013,  4014,  4015,
+		4016,  4017,  4018,  4019,  4020,  4021,  4022,  4023,
+		4024,  4025,  4026,  4027,  4028,  4029,  4030,  4031,
+		11943, 4033,  4034,  4035,  4036,  8637,  4038,  4039,
+		-116,  32767, 32767, 4041,  4042,  4043,  4044,  4045,
+		2250,  4047,  4048,  4049,  5802,  4051,  4052,  4559,
+		6119,  4055,  4056,  4057,  4058,  4059,  4060,  4061,
+		-47,   4063,  -46,   4065,  4066,  4067,  4068,  4069,
+		-41,   -13301,4072,  -9985, -6670, 4075,  4076,  4077,
+		4078,  4079,  4080,  4081,  4082,  4083,  4084,  4085,
+		4086,  4087,  4088,  4089,  4090,  8741,  4092,  4093,
+		-67,   32767, 32767, 32767, 32767, 32767, 2257,  32767,
+		2258,  2259,  2260,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2261,  32767, 2262,  32767,
+		2263,  32767, 2264,  32767, 2265,  32767, 2266,  32767,
+		2267,  8737,  8738,  -26,   -26,   8786,  4100,  4101,
+		8746,  8747,  4104,  4105,  8752,  8753,  32767, 2274,
+		32767, 2275,  32767, 32767, 32767, 32767, 32767, 32767,
+		2276,  2277,  32767, 2278,  2279,  32767, 2280,  0,
+		32767, 2282,  9695,  4109,  -3486, -3486, 4112,  4113,
+		4114,  4115,  4116,  4117,  32767, 32767, 32767, 32767,
+		32767, 32767, 4118,  4119,  4120,  4121,  4122,  4123,
+		4124,  4125,  4126,  4127,  4128,  4129,  4130,  4131,
+		4132,  4133,  4134,  4849,  4136,  4137,  4851,  4851,
+		4140,  4852,  4142,  4143,  4144,  4145,  4146,  4147,
+		4148,  4149,  4150,  4151,  2293,  4153,  907,   32767,
+		2295,  4155,  909,   4157,  910,   4159,  911,   4161,
+		912,   4163,  913,   4165,  914,   32767, 915,   4168,
+		916,   4170,  917,   4172,  4173,  918,   4175,  4176,
+		4177,  4178,  4179,  4180,  4181,  4182,  4183,  4184,
+		4185,  2309,  4186,  4187,  4188,  4189,  2312,  2313,
+		32767, 2314,  4190,  4191,  -2632, 2317,  4193,  32767,
+		4194,  4195,  4196,  4197,  4198,  4199,  4200,  4201,
+		4202,  4203,  4204,  4205,  4206,  0,     0,     4209,
+		4210,  4211,  4212,  4213,  2318,  4215,  4216,  2319,
+		2320,  2321,  2322,  4221,  4222,  4223,  2323,  2324,
+		4226,  4227,  4228,  4229,  4230,  4231,  5551,  4233,
+		4234,  4235,  4236,  4237,  4238,  4239,  4240,  4241,
+		4242,  4243,  4244,  4245,  4246,  4247,  4248,  4249,
+		4250,  4251,  4252,  4253,  4254,  4255,  4256,  4257,
+		4258,  4259,  4260,  4261,  4262,  4263,  4264,  4265,
+		4266,  4267,  4268,  4269,  4270,  4271,  4272,  4273,
+		4274,  4275,  -3342, -3342, -3342, 4276,  4277,  2418,
+		2419,  -2784, -2784, -2740, -2740, -2740, -2740, -2740,
+		-2784, -2784, -2784, -2784, 4628,  -2784, -2784, -2784,
+		-2784, -2784, -2784, -2784, -2784, -2784, -2784, -2784,
+		-2784, 2958,  2959,  2960,  2961,  2962,  2963,  2964,
+		2965,  2966,  2967,  2968,  2969,  2970,  2971,  2972,
+		2973,  -4644, -4644, -2784, -2784, 2420,  2421,  2378,
+		2379,  2380,  2381,  2382,  2427,  2428,  2429,  2430,
+		-4981, 2432,  2433,  2434,  2435,  2436,  2437,  2438,
+		2439,  2440,  2441,  2442,  2443,  -3298, -3298, -3298,
+		-3298, -3298, -3298, -3298, -3298, -3298, -3298, -3298,
+		-3298, -3298, -3298, -3298, -3298, 4320,  4321,  2462,
+		4365,  4366,  4367,  -2699, -2699, -2699, -2699, -2699,
+		-2743, -2743, -2743, -2743, 4669,  -2743, -2743, -2743,
+		-2743, 4382,  4383,  4384,  4385,  4386,  4387,  4388,
+		4389,  4390,  4391,  4392,  4393,  4394,  4395,  4396,
+		4397,  4398,  4399,  4400,  4401,  4402,  4403,  4404,
+		4405,  4406,  4407,  4408,  4409,  4410,  4411,  4412,
+		4413,  4414,  4415,  4416,  4417,  4418,  4419,  4420,
+		4421,  4422,  4423,  4424,  4425,  4426,  4427,  4428,
+		4429,  816,   816,   816,   -6459, 816,   816,   -6418,
+		816,   816,   816,   816,   816,   -4552, 7194,  4444,
+		4445,  4446,  4447,  4448,  4449,  4450,  4451,  4452,
+		4453,  4454,  4455,  816,   816,   1675,  7790,  7790,
+		816,   816,   4463,  -1589, -1589, 4466,  -1589, -1589,
+		-1589, -1589, 704,   -1589, -2385, 4474,  4475,  817,
+		4477,  4478,  2948,  2949,  2950,  2951,  2952,  2953,
+		2954,  2955,  2956,  2957,  2958,  2959,  2960,  2961,
+		2962,  -4655, -4655, -2795, -2795, -2795, -2795, -2795,
+		3469,  -2795, -2795, -2795, -2795, -2795, -2795, -2795,
+		-2795, 4510,  -2796, -6198, -6198, 2559,  2560,  -6243,
+		-6243, -6198, -6198, -6198, -6198, 2567,  2568,  -6243,
+		-6243, -6198, -6198, -6198, -6154, -6154, -6200, -6200,
+		-6200, -6200, -6200, -6200, -6200, 2535,  2536,  2537,
+		2538,  107,   63,    2541,  2542,  2543,  2544,  15805,
+		12491, 12492, 32767, 4540,  4541,  4542,  4543,  4544,
+		4545,  4546,  2548,  -6208, -6208, 2596,  2597,  2553,
+		2554,  2555,  2556,  -6208, -6208, 2604,  2605,  2561,
+		2562,  2563,  2520,  2521,  2568,  2569,  2570,  2571,
+		2572,  2573,  2574,  -6160, -6160, -6160, -6160, -3728,
+		-3683, -6160, -6160, -6160, -6160, -19420,-16105,-16105,
+		-12790,-12790,-9475, -9475, -6160, -6160, -6160, -6160,
+		-6160, 32767, 2597,  -6206, -6206, -6161, -6161, -6161,
+		-6161, 2604,  2605,  -6206, -6206, -6161, -6161, -6161,
+		-6161, -6161, -6161, -6161, -6161, -6161, -6161, -6161,
+		-6161, 2574,  2575,  2576,  2577,  146,   102,   2580,
+		2581,  2582,  2583,  15844, 12530, 12531, 9217,  9218,
+		5904,  5905,  2591,  2592,  2593,  2594,  2595,  -6161,
+		-6161, 2643,  2644,  2600,  2601,  2602,  2603,  -6161,
+		-6161, 2651,  2652,  2608,  2609,  2610,  2611,  2612,
+		2613,  2614,  2615,  2616,  2617,  2618,  2619,  -6115,
+		-6115, -6115, -6115, -3683, -3638, -6115, -6115, -6115,
+		-6115, -19375,-16060,-16060,-12745,-12745,-9430, -9430,
+		-6115, -6115, -6115, -6115, -6115, 2642,  2643,  -6160,
+		-6160, -6115, -6115, -6115, -6115, 2650,  2651,  -6160,
+		-6160, -6115, -3460, -3459, -3458, -3457, -1026, -3455,
+		-3454, -6160, -3452, -6160, -12117,-6160, -12117,-6160,
+		-2848, -2848, -2848, 6893,  891,   -5065, -2846, -6160,
+		-2845, -1264, 0,     9264,  5950,  5951,  2637,  2638,
+		2639,  2640,  2641,  -6115, -6115, 2689,  2690,  2646,
+		2647,  2648,  2649,  -6115, -6115, 2697,  2698,  2654,
+		0,     0,     0,     0,     -2430, 0,     0,     2707,
+		0,     2709,  8667,  2711,  8669,  2713,  -598,  -597,
+		-596,  -10336,-4333, 1624,  -594,  2721,  -593,  -2173,
+		2724,  -592,  -591,  -590,  -589,  -588,  -587,  -586,
+		12,    -584,  -583,  2735,  -582,  2737,  -581,  2739,
+		2740,  -580,  -6115, -6115, -6115, 2745,  2746,  -6115,
+		-6115, 0,     0,     0,     2752,  2753,  2754,  0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     6247,  6248,  0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 1;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 8191 + c;
+	}
+	return h[a % 13209] + h[b % 13209];
+}
+
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo =
+{
+	UnicodeDecompMain,
+	Decomp_hash_func,
+	6604
+};
diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns
index 86bdd9d6dc..f08180b0d0 100644
--- a/src/tools/pgindent/exclude_file_patterns
+++ b/src/tools/pgindent/exclude_file_patterns
@@ -18,9 +18,10 @@ src/backend/utils/fmgrprotos\.h$
 # they match pgindent style, they'd look worse not better, so exclude them.
 kwlist_d\.h$
 #
-# This is generated by the scripts from src/common/unicode/.  It uses
+# These are generated by the scripts from src/common/unicode/.  They use
 # hash functions generated by PerfectHash.pm whose format looks worse with
 # pgindent.
+src/include/common/unicode_norm_hashfunc\.h$
 src/include/common/unicode_normprops_table\.h$
 #
 # Exclude ecpg test files to avoid breaking the ecpg regression tests
-- 
2.22.0

v4-0002-Speed-up-unicode-recomposition.patchapplication/octet-stream; name=v4-0002-Speed-up-unicode-recomposition.patchDownload
From f1c7408f66dc946609384933f883cf6f542e0f17 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@2ndquadrant.com>
Date: Wed, 21 Oct 2020 18:27:09 -0400
Subject: [PATCH v4 2/2] Speed up unicode recomposition.

As with 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 more than 40x 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    |  113 ++
 src/common/unicode_norm.c                     |   37 +-
 src/include/common/unicode_norm_hashfunc.h    | 1220 +++++++++++++++++
 3 files changed, 1368 insertions(+), 2 deletions(-)

diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 5fca88796f..6bbe81f17d 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -144,6 +144,7 @@ print $OF <<HEADER;
 typedef int (*cp_hash_func) (const void *key);
 
 /* Information for lookups with perfect hash functions */
+
 typedef struct
 {
 	const pg_unicode_decomposition *decomps;
@@ -151,11 +152,20 @@ typedef struct
 	int		num_decomps;
 } pg_unicode_decompinfo;
 
+typedef struct
+{
+	const uint16	*inverse_lookup;
+	cp_hash_func	hash;
+	int		num_recomps;
+} pg_unicode_recompinfo;
+
 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)
@@ -217,6 +227,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)
@@ -255,6 +277,8 @@ foreach my $char (@characters)
 
 	print $OT "\t/* $comment */" if ($comment ne "");
 	print $OT "\n";
+
+	$main_index++;
 }
 print $OT "\n};\n\n";
 
@@ -284,7 +308,96 @@ static const pg_unicode_decompinfo UnicodeDecompInfo =
 	$dec_funcname,
 	$num_characters
 };
+
+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;
+my $firstentry = 1;
+foreach my $rec (sort recomp_sort @rec_info)
+{
+	# The hash key is formed by concatenating the bytes of the two
+	# codepoints. See also recompose_code() in common/unicode_norm.c.
+	my $hashkey = (hex($rec->{first}) << 32) | hex($rec->{second});
+
+	# We are only interested in the lowest code point that decomposes
+	# to the given code pair.
+	next if $seenit{$hashkey};
+
+	# Save the hash key bytes in network order
+	push @rec_cp_packed, pack('Q>', $hashkey);
+
+	# Append inverse lookup element
+	$recomp_string .= ",\n" if ! $firstentry;
+	$recomp_string .= sprintf "\t/* U+%s+%s -> U+%s */ %s",
+		$rec->{first},
+		$rec->{second},
+		$rec->{code},
+		$rec->{main_index};
+
+	$seenit{$hashkey} = 1;
+	$firstentry = 0;
+}
+
+# Emit the inverse lookup array containing indexes into UnicodeDecompMain
+my $num_recomps = scalar @rec_cp_packed;
+print $OF <<HEADER;
+/* Inverse lookup array -- contains indexes into UnicodeDecompMain[] */
+static const uint16 RecompInverseLookup[$num_recomps] =
+{
+$recomp_string
+};
+
+HEADER
+
+# Emit the definition of the recomp hash function.
+my $rec_funcname = 'Recomp_hash_func';
+my $rec_func        = PerfectHash::generate_hash_function(\@rec_cp_packed, $rec_funcname,
+	fixed_key_length => 8);
+print $OF "/* Perfect hash function for recomposition */\n";
+print $OF "static $rec_func\n";
+
+# Emit the structure that wraps the hash lookup information into
+# one variable.
+print $OF <<HEADER;
+/* Hash lookup information for recomposition */
+static const pg_unicode_recompinfo UnicodeRecompInfo =
+{
+	RecompInverseLookup,
+	$rec_funcname,
+	$num_recomps
+};
 HEADER
 
 close $OT;
 close $OF;
+
+sub recomp_sort
+{
+	my $a1 = hex($a->{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 code point
+	return -1 if $a2 < $b2;
+	return 1 if $a2 > $b2;
+
+	# Finally by the code point that decomposes into first and second.
+
+	my $acode = hex($a->{code});
+	my $bcode = hex($b->{code});
+
+	return -1 if $acode < $bcode;
+	return -1 if $acode > $bcode;
+
+	die "found duplicate entries of recomposeable code pairs";
+}
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 7d0d23ab21..da7e6f8fa1 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -228,7 +228,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
@@ -236,9 +236,41 @@ 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;
+
+		/*
+		 * Compute the hash function. The hash key is formed by concatenating
+		 * bytes of the two codepoints in network order. See also
+		 * common/unicode/generate-unicode_norm_table.pl.
+		 */
+		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;
@@ -253,6 +285,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 				return true;
 			}
 		}
+#endif							/* !FRONTEND */
 	}
 
 	return false;
diff --git a/src/include/common/unicode_norm_hashfunc.h b/src/include/common/unicode_norm_hashfunc.h
index d2f4ad884b..39b7138f2b 100644
--- a/src/include/common/unicode_norm_hashfunc.h
+++ b/src/include/common/unicode_norm_hashfunc.h
@@ -23,6 +23,7 @@
 typedef int (*cp_hash_func) (const void *key);
 
 /* Information for lookups with perfect hash functions */
+
 typedef struct
 {
 	const pg_unicode_decomposition *decomps;
@@ -30,6 +31,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;
+
 /* Perfect hash function for decomposition */
 static int
 Decomp_hash_func(const void *key)
@@ -1711,3 +1719,1215 @@ static const pg_unicode_decompinfo UnicodeDecompInfo =
 	Decomp_hash_func,
 	6604
 };
+
+/* Inverse lookup array -- contains indexes into UnicodeDecompMain[] */
+static const uint16 RecompInverseLookup[941] =
+{
+	/* U+003C+0338 -> U+226E */ 1823,
+	/* U+003D+0338 -> U+2260 */ 1820,
+	/* U+003E+0338 -> U+226F */ 1824,
+	/* U+0041+0300 -> U+00C0 */ 14,
+	/* U+0041+0301 -> U+00C1 */ 15,
+	/* U+0041+0302 -> U+00C2 */ 16,
+	/* U+0041+0303 -> U+00C3 */ 17,
+	/* U+0041+0304 -> U+0100 */ 67,
+	/* U+0041+0306 -> U+0102 */ 69,
+	/* U+0041+0307 -> U+0226 */ 270,
+	/* U+0041+0308 -> U+00C4 */ 18,
+	/* U+0041+0309 -> U+1EA2 */ 1278,
+	/* U+0041+030A -> U+00C5 */ 19,
+	/* U+0041+030C -> U+01CD */ 194,
+	/* U+0041+030F -> U+0200 */ 240,
+	/* U+0041+0311 -> U+0202 */ 242,
+	/* U+0041+0323 -> U+1EA0 */ 1276,
+	/* U+0041+0325 -> U+1E00 */ 1120,
+	/* U+0041+0328 -> U+0104 */ 71,
+	/* U+0042+0307 -> U+1E02 */ 1122,
+	/* U+0042+0323 -> U+1E04 */ 1124,
+	/* U+0042+0331 -> U+1E06 */ 1126,
+	/* U+0043+0301 -> U+0106 */ 73,
+	/* U+0043+0302 -> U+0108 */ 75,
+	/* U+0043+0307 -> U+010A */ 77,
+	/* U+0043+030C -> U+010C */ 79,
+	/* U+0043+0327 -> U+00C7 */ 20,
+	/* U+0044+0307 -> U+1E0A */ 1130,
+	/* U+0044+030C -> U+010E */ 81,
+	/* U+0044+0323 -> U+1E0C */ 1132,
+	/* U+0044+0327 -> U+1E10 */ 1136,
+	/* U+0044+032D -> U+1E12 */ 1138,
+	/* U+0044+0331 -> U+1E0E */ 1134,
+	/* U+0045+0300 -> U+00C8 */ 21,
+	/* U+0045+0301 -> U+00C9 */ 22,
+	/* U+0045+0302 -> U+00CA */ 23,
+	/* U+0045+0303 -> U+1EBC */ 1304,
+	/* U+0045+0304 -> U+0112 */ 83,
+	/* U+0045+0306 -> U+0114 */ 85,
+	/* U+0045+0307 -> U+0116 */ 87,
+	/* U+0045+0308 -> U+00CB */ 24,
+	/* U+0045+0309 -> U+1EBA */ 1302,
+	/* U+0045+030C -> U+011A */ 91,
+	/* U+0045+030F -> U+0204 */ 244,
+	/* U+0045+0311 -> U+0206 */ 246,
+	/* U+0045+0323 -> U+1EB8 */ 1300,
+	/* U+0045+0327 -> U+0228 */ 272,
+	/* U+0045+0328 -> U+0118 */ 89,
+	/* U+0045+032D -> U+1E18 */ 1144,
+	/* U+0045+0330 -> U+1E1A */ 1146,
+	/* U+0046+0307 -> U+1E1E */ 1150,
+	/* U+0047+0301 -> U+01F4 */ 230,
+	/* U+0047+0302 -> U+011C */ 93,
+	/* U+0047+0304 -> U+1E20 */ 1152,
+	/* U+0047+0306 -> U+011E */ 95,
+	/* U+0047+0307 -> U+0120 */ 97,
+	/* U+0047+030C -> U+01E6 */ 216,
+	/* U+0047+0327 -> U+0122 */ 99,
+	/* U+0048+0302 -> U+0124 */ 101,
+	/* U+0048+0307 -> U+1E22 */ 1154,
+	/* U+0048+0308 -> U+1E26 */ 1158,
+	/* U+0048+030C -> U+021E */ 268,
+	/* U+0048+0323 -> U+1E24 */ 1156,
+	/* U+0048+0327 -> U+1E28 */ 1160,
+	/* U+0048+032E -> U+1E2A */ 1162,
+	/* U+0049+0300 -> U+00CC */ 25,
+	/* U+0049+0301 -> U+00CD */ 26,
+	/* U+0049+0302 -> U+00CE */ 27,
+	/* U+0049+0303 -> U+0128 */ 103,
+	/* U+0049+0304 -> U+012A */ 105,
+	/* U+0049+0306 -> U+012C */ 107,
+	/* U+0049+0307 -> U+0130 */ 111,
+	/* U+0049+0308 -> U+00CF */ 28,
+	/* U+0049+0309 -> U+1EC8 */ 1316,
+	/* U+0049+030C -> U+01CF */ 196,
+	/* U+0049+030F -> U+0208 */ 248,
+	/* U+0049+0311 -> U+020A */ 250,
+	/* U+0049+0323 -> U+1ECA */ 1318,
+	/* U+0049+0328 -> U+012E */ 109,
+	/* U+0049+0330 -> U+1E2C */ 1164,
+	/* U+004A+0302 -> U+0134 */ 114,
+	/* U+004B+0301 -> U+1E30 */ 1168,
+	/* U+004B+030C -> U+01E8 */ 218,
+	/* U+004B+0323 -> U+1E32 */ 1170,
+	/* U+004B+0327 -> U+0136 */ 116,
+	/* U+004B+0331 -> U+1E34 */ 1172,
+	/* U+004C+0301 -> U+0139 */ 118,
+	/* U+004C+030C -> U+013D */ 122,
+	/* U+004C+0323 -> U+1E36 */ 1174,
+	/* U+004C+0327 -> U+013B */ 120,
+	/* U+004C+032D -> U+1E3C */ 1180,
+	/* U+004C+0331 -> U+1E3A */ 1178,
+	/* U+004D+0301 -> U+1E3E */ 1182,
+	/* U+004D+0307 -> U+1E40 */ 1184,
+	/* U+004D+0323 -> U+1E42 */ 1186,
+	/* U+004E+0300 -> U+01F8 */ 232,
+	/* U+004E+0301 -> U+0143 */ 126,
+	/* U+004E+0303 -> U+00D1 */ 29,
+	/* U+004E+0307 -> U+1E44 */ 1188,
+	/* U+004E+030C -> U+0147 */ 130,
+	/* U+004E+0323 -> U+1E46 */ 1190,
+	/* U+004E+0327 -> U+0145 */ 128,
+	/* U+004E+032D -> U+1E4A */ 1194,
+	/* U+004E+0331 -> U+1E48 */ 1192,
+	/* U+004F+0300 -> U+00D2 */ 30,
+	/* U+004F+0301 -> U+00D3 */ 31,
+	/* U+004F+0302 -> U+00D4 */ 32,
+	/* U+004F+0303 -> U+00D5 */ 33,
+	/* U+004F+0304 -> U+014C */ 133,
+	/* U+004F+0306 -> U+014E */ 135,
+	/* U+004F+0307 -> U+022E */ 278,
+	/* U+004F+0308 -> U+00D6 */ 34,
+	/* U+004F+0309 -> U+1ECE */ 1322,
+	/* U+004F+030B -> U+0150 */ 137,
+	/* U+004F+030C -> U+01D1 */ 198,
+	/* U+004F+030F -> U+020C */ 252,
+	/* U+004F+0311 -> U+020E */ 254,
+	/* U+004F+031B -> U+01A0 */ 181,
+	/* U+004F+0323 -> U+1ECC */ 1320,
+	/* U+004F+0328 -> U+01EA */ 220,
+	/* U+0050+0301 -> U+1E54 */ 1204,
+	/* U+0050+0307 -> U+1E56 */ 1206,
+	/* U+0052+0301 -> U+0154 */ 139,
+	/* U+0052+0307 -> U+1E58 */ 1208,
+	/* U+0052+030C -> U+0158 */ 143,
+	/* U+0052+030F -> U+0210 */ 256,
+	/* U+0052+0311 -> U+0212 */ 258,
+	/* U+0052+0323 -> U+1E5A */ 1210,
+	/* U+0052+0327 -> U+0156 */ 141,
+	/* U+0052+0331 -> U+1E5E */ 1214,
+	/* U+0053+0301 -> U+015A */ 145,
+	/* U+0053+0302 -> U+015C */ 147,
+	/* U+0053+0307 -> U+1E60 */ 1216,
+	/* U+0053+030C -> U+0160 */ 151,
+	/* U+0053+0323 -> U+1E62 */ 1218,
+	/* U+0053+0326 -> U+0218 */ 264,
+	/* U+0053+0327 -> U+015E */ 149,
+	/* U+0054+0307 -> U+1E6A */ 1226,
+	/* U+0054+030C -> U+0164 */ 155,
+	/* U+0054+0323 -> U+1E6C */ 1228,
+	/* U+0054+0326 -> U+021A */ 266,
+	/* U+0054+0327 -> U+0162 */ 153,
+	/* U+0054+032D -> U+1E70 */ 1232,
+	/* U+0054+0331 -> U+1E6E */ 1230,
+	/* U+0055+0300 -> U+00D9 */ 35,
+	/* U+0055+0301 -> U+00DA */ 36,
+	/* U+0055+0302 -> U+00DB */ 37,
+	/* U+0055+0303 -> U+0168 */ 157,
+	/* U+0055+0304 -> U+016A */ 159,
+	/* U+0055+0306 -> U+016C */ 161,
+	/* U+0055+0308 -> U+00DC */ 38,
+	/* U+0055+0309 -> U+1EE6 */ 1346,
+	/* U+0055+030A -> U+016E */ 163,
+	/* U+0055+030B -> U+0170 */ 165,
+	/* U+0055+030C -> U+01D3 */ 200,
+	/* U+0055+030F -> U+0214 */ 260,
+	/* U+0055+0311 -> U+0216 */ 262,
+	/* U+0055+031B -> U+01AF */ 183,
+	/* U+0055+0323 -> U+1EE4 */ 1344,
+	/* U+0055+0324 -> U+1E72 */ 1234,
+	/* U+0055+0328 -> U+0172 */ 167,
+	/* U+0055+032D -> U+1E76 */ 1238,
+	/* U+0055+0330 -> U+1E74 */ 1236,
+	/* U+0056+0303 -> U+1E7C */ 1244,
+	/* U+0056+0323 -> U+1E7E */ 1246,
+	/* U+0057+0300 -> U+1E80 */ 1248,
+	/* U+0057+0301 -> U+1E82 */ 1250,
+	/* U+0057+0302 -> U+0174 */ 169,
+	/* U+0057+0307 -> U+1E86 */ 1254,
+	/* U+0057+0308 -> U+1E84 */ 1252,
+	/* U+0057+0323 -> U+1E88 */ 1256,
+	/* U+0058+0307 -> U+1E8A */ 1258,
+	/* U+0058+0308 -> U+1E8C */ 1260,
+	/* U+0059+0300 -> U+1EF2 */ 1358,
+	/* U+0059+0301 -> U+00DD */ 39,
+	/* U+0059+0302 -> U+0176 */ 171,
+	/* U+0059+0303 -> U+1EF8 */ 1364,
+	/* U+0059+0304 -> U+0232 */ 282,
+	/* U+0059+0307 -> U+1E8E */ 1262,
+	/* U+0059+0308 -> U+0178 */ 173,
+	/* U+0059+0309 -> U+1EF6 */ 1362,
+	/* U+0059+0323 -> U+1EF4 */ 1360,
+	/* U+005A+0301 -> U+0179 */ 174,
+	/* U+005A+0302 -> U+1E90 */ 1264,
+	/* U+005A+0307 -> U+017B */ 176,
+	/* U+005A+030C -> U+017D */ 178,
+	/* U+005A+0323 -> U+1E92 */ 1266,
+	/* U+005A+0331 -> U+1E94 */ 1268,
+	/* U+0061+0300 -> U+00E0 */ 40,
+	/* U+0061+0301 -> U+00E1 */ 41,
+	/* U+0061+0302 -> U+00E2 */ 42,
+	/* U+0061+0303 -> U+00E3 */ 43,
+	/* U+0061+0304 -> U+0101 */ 68,
+	/* U+0061+0306 -> U+0103 */ 70,
+	/* U+0061+0307 -> U+0227 */ 271,
+	/* U+0061+0308 -> U+00E4 */ 44,
+	/* U+0061+0309 -> U+1EA3 */ 1279,
+	/* U+0061+030A -> U+00E5 */ 45,
+	/* U+0061+030C -> U+01CE */ 195,
+	/* U+0061+030F -> U+0201 */ 241,
+	/* U+0061+0311 -> U+0203 */ 243,
+	/* U+0061+0323 -> U+1EA1 */ 1277,
+	/* U+0061+0325 -> U+1E01 */ 1121,
+	/* U+0061+0328 -> U+0105 */ 72,
+	/* U+0062+0307 -> U+1E03 */ 1123,
+	/* U+0062+0323 -> U+1E05 */ 1125,
+	/* U+0062+0331 -> U+1E07 */ 1127,
+	/* U+0063+0301 -> U+0107 */ 74,
+	/* U+0063+0302 -> U+0109 */ 76,
+	/* U+0063+0307 -> U+010B */ 78,
+	/* U+0063+030C -> U+010D */ 80,
+	/* U+0063+0327 -> U+00E7 */ 46,
+	/* U+0064+0307 -> U+1E0B */ 1131,
+	/* U+0064+030C -> U+010F */ 82,
+	/* U+0064+0323 -> U+1E0D */ 1133,
+	/* U+0064+0327 -> U+1E11 */ 1137,
+	/* U+0064+032D -> U+1E13 */ 1139,
+	/* U+0064+0331 -> U+1E0F */ 1135,
+	/* U+0065+0300 -> U+00E8 */ 47,
+	/* U+0065+0301 -> U+00E9 */ 48,
+	/* U+0065+0302 -> U+00EA */ 49,
+	/* U+0065+0303 -> U+1EBD */ 1305,
+	/* U+0065+0304 -> U+0113 */ 84,
+	/* U+0065+0306 -> U+0115 */ 86,
+	/* U+0065+0307 -> U+0117 */ 88,
+	/* U+0065+0308 -> U+00EB */ 50,
+	/* U+0065+0309 -> U+1EBB */ 1303,
+	/* U+0065+030C -> U+011B */ 92,
+	/* U+0065+030F -> U+0205 */ 245,
+	/* U+0065+0311 -> U+0207 */ 247,
+	/* U+0065+0323 -> U+1EB9 */ 1301,
+	/* U+0065+0327 -> U+0229 */ 273,
+	/* U+0065+0328 -> U+0119 */ 90,
+	/* U+0065+032D -> U+1E19 */ 1145,
+	/* U+0065+0330 -> U+1E1B */ 1147,
+	/* U+0066+0307 -> U+1E1F */ 1151,
+	/* U+0067+0301 -> U+01F5 */ 231,
+	/* U+0067+0302 -> U+011D */ 94,
+	/* U+0067+0304 -> U+1E21 */ 1153,
+	/* U+0067+0306 -> U+011F */ 96,
+	/* U+0067+0307 -> U+0121 */ 98,
+	/* U+0067+030C -> U+01E7 */ 217,
+	/* U+0067+0327 -> U+0123 */ 100,
+	/* U+0068+0302 -> U+0125 */ 102,
+	/* U+0068+0307 -> U+1E23 */ 1155,
+	/* U+0068+0308 -> U+1E27 */ 1159,
+	/* U+0068+030C -> U+021F */ 269,
+	/* U+0068+0323 -> U+1E25 */ 1157,
+	/* U+0068+0327 -> U+1E29 */ 1161,
+	/* U+0068+032E -> U+1E2B */ 1163,
+	/* U+0068+0331 -> U+1E96 */ 1270,
+	/* U+0069+0300 -> U+00EC */ 51,
+	/* U+0069+0301 -> U+00ED */ 52,
+	/* U+0069+0302 -> U+00EE */ 53,
+	/* U+0069+0303 -> U+0129 */ 104,
+	/* U+0069+0304 -> U+012B */ 106,
+	/* U+0069+0306 -> U+012D */ 108,
+	/* U+0069+0308 -> U+00EF */ 54,
+	/* U+0069+0309 -> U+1EC9 */ 1317,
+	/* U+0069+030C -> U+01D0 */ 197,
+	/* U+0069+030F -> U+0209 */ 249,
+	/* U+0069+0311 -> U+020B */ 251,
+	/* U+0069+0323 -> U+1ECB */ 1319,
+	/* U+0069+0328 -> U+012F */ 110,
+	/* U+0069+0330 -> U+1E2D */ 1165,
+	/* U+006A+0302 -> U+0135 */ 115,
+	/* U+006A+030C -> U+01F0 */ 226,
+	/* U+006B+0301 -> U+1E31 */ 1169,
+	/* U+006B+030C -> U+01E9 */ 219,
+	/* U+006B+0323 -> U+1E33 */ 1171,
+	/* U+006B+0327 -> U+0137 */ 117,
+	/* U+006B+0331 -> U+1E35 */ 1173,
+	/* U+006C+0301 -> U+013A */ 119,
+	/* U+006C+030C -> U+013E */ 123,
+	/* U+006C+0323 -> U+1E37 */ 1175,
+	/* U+006C+0327 -> U+013C */ 121,
+	/* U+006C+032D -> U+1E3D */ 1181,
+	/* U+006C+0331 -> U+1E3B */ 1179,
+	/* U+006D+0301 -> U+1E3F */ 1183,
+	/* U+006D+0307 -> U+1E41 */ 1185,
+	/* U+006D+0323 -> U+1E43 */ 1187,
+	/* U+006E+0300 -> U+01F9 */ 233,
+	/* U+006E+0301 -> U+0144 */ 127,
+	/* U+006E+0303 -> U+00F1 */ 55,
+	/* U+006E+0307 -> U+1E45 */ 1189,
+	/* U+006E+030C -> U+0148 */ 131,
+	/* U+006E+0323 -> U+1E47 */ 1191,
+	/* U+006E+0327 -> U+0146 */ 129,
+	/* U+006E+032D -> U+1E4B */ 1195,
+	/* U+006E+0331 -> U+1E49 */ 1193,
+	/* U+006F+0300 -> U+00F2 */ 56,
+	/* U+006F+0301 -> U+00F3 */ 57,
+	/* U+006F+0302 -> U+00F4 */ 58,
+	/* U+006F+0303 -> U+00F5 */ 59,
+	/* U+006F+0304 -> U+014D */ 134,
+	/* U+006F+0306 -> U+014F */ 136,
+	/* U+006F+0307 -> U+022F */ 279,
+	/* U+006F+0308 -> U+00F6 */ 60,
+	/* U+006F+0309 -> U+1ECF */ 1323,
+	/* U+006F+030B -> U+0151 */ 138,
+	/* U+006F+030C -> U+01D2 */ 199,
+	/* U+006F+030F -> U+020D */ 253,
+	/* U+006F+0311 -> U+020F */ 255,
+	/* U+006F+031B -> U+01A1 */ 182,
+	/* U+006F+0323 -> U+1ECD */ 1321,
+	/* U+006F+0328 -> U+01EB */ 221,
+	/* U+0070+0301 -> U+1E55 */ 1205,
+	/* U+0070+0307 -> U+1E57 */ 1207,
+	/* U+0072+0301 -> U+0155 */ 140,
+	/* U+0072+0307 -> U+1E59 */ 1209,
+	/* U+0072+030C -> U+0159 */ 144,
+	/* U+0072+030F -> U+0211 */ 257,
+	/* U+0072+0311 -> U+0213 */ 259,
+	/* U+0072+0323 -> U+1E5B */ 1211,
+	/* U+0072+0327 -> U+0157 */ 142,
+	/* U+0072+0331 -> U+1E5F */ 1215,
+	/* U+0073+0301 -> U+015B */ 146,
+	/* U+0073+0302 -> U+015D */ 148,
+	/* U+0073+0307 -> U+1E61 */ 1217,
+	/* U+0073+030C -> U+0161 */ 152,
+	/* U+0073+0323 -> U+1E63 */ 1219,
+	/* U+0073+0326 -> U+0219 */ 265,
+	/* U+0073+0327 -> U+015F */ 150,
+	/* U+0074+0307 -> U+1E6B */ 1227,
+	/* U+0074+0308 -> U+1E97 */ 1271,
+	/* U+0074+030C -> U+0165 */ 156,
+	/* U+0074+0323 -> U+1E6D */ 1229,
+	/* U+0074+0326 -> U+021B */ 267,
+	/* U+0074+0327 -> U+0163 */ 154,
+	/* U+0074+032D -> U+1E71 */ 1233,
+	/* U+0074+0331 -> U+1E6F */ 1231,
+	/* U+0075+0300 -> U+00F9 */ 61,
+	/* U+0075+0301 -> U+00FA */ 62,
+	/* U+0075+0302 -> U+00FB */ 63,
+	/* U+0075+0303 -> U+0169 */ 158,
+	/* U+0075+0304 -> U+016B */ 160,
+	/* U+0075+0306 -> U+016D */ 162,
+	/* U+0075+0308 -> U+00FC */ 64,
+	/* U+0075+0309 -> U+1EE7 */ 1347,
+	/* U+0075+030A -> U+016F */ 164,
+	/* U+0075+030B -> U+0171 */ 166,
+	/* U+0075+030C -> U+01D4 */ 201,
+	/* U+0075+030F -> U+0215 */ 261,
+	/* U+0075+0311 -> U+0217 */ 263,
+	/* U+0075+031B -> U+01B0 */ 184,
+	/* U+0075+0323 -> U+1EE5 */ 1345,
+	/* U+0075+0324 -> U+1E73 */ 1235,
+	/* U+0075+0328 -> U+0173 */ 168,
+	/* U+0075+032D -> U+1E77 */ 1239,
+	/* U+0075+0330 -> U+1E75 */ 1237,
+	/* U+0076+0303 -> U+1E7D */ 1245,
+	/* U+0076+0323 -> U+1E7F */ 1247,
+	/* U+0077+0300 -> U+1E81 */ 1249,
+	/* U+0077+0301 -> U+1E83 */ 1251,
+	/* U+0077+0302 -> U+0175 */ 170,
+	/* U+0077+0307 -> U+1E87 */ 1255,
+	/* U+0077+0308 -> U+1E85 */ 1253,
+	/* U+0077+030A -> U+1E98 */ 1272,
+	/* U+0077+0323 -> U+1E89 */ 1257,
+	/* U+0078+0307 -> U+1E8B */ 1259,
+	/* U+0078+0308 -> U+1E8D */ 1261,
+	/* U+0079+0300 -> U+1EF3 */ 1359,
+	/* U+0079+0301 -> U+00FD */ 65,
+	/* U+0079+0302 -> U+0177 */ 172,
+	/* U+0079+0303 -> U+1EF9 */ 1365,
+	/* U+0079+0304 -> U+0233 */ 283,
+	/* U+0079+0307 -> U+1E8F */ 1263,
+	/* U+0079+0308 -> U+00FF */ 66,
+	/* U+0079+0309 -> U+1EF7 */ 1363,
+	/* U+0079+030A -> U+1E99 */ 1273,
+	/* U+0079+0323 -> U+1EF5 */ 1361,
+	/* U+007A+0301 -> U+017A */ 175,
+	/* U+007A+0302 -> U+1E91 */ 1265,
+	/* U+007A+0307 -> U+017C */ 177,
+	/* U+007A+030C -> U+017E */ 179,
+	/* U+007A+0323 -> U+1E93 */ 1267,
+	/* U+007A+0331 -> U+1E95 */ 1269,
+	/* U+00A8+0300 -> U+1FED */ 1584,
+	/* U+00A8+0301 -> U+0385 */ 419,
+	/* U+00A8+0342 -> U+1FC1 */ 1544,
+	/* U+00C2+0300 -> U+1EA6 */ 1282,
+	/* U+00C2+0301 -> U+1EA4 */ 1280,
+	/* U+00C2+0303 -> U+1EAA */ 1286,
+	/* U+00C2+0309 -> U+1EA8 */ 1284,
+	/* U+00C4+0304 -> U+01DE */ 210,
+	/* U+00C5+0301 -> U+01FA */ 234,
+	/* U+00C6+0301 -> U+01FC */ 236,
+	/* U+00C6+0304 -> U+01E2 */ 214,
+	/* U+00C7+0301 -> U+1E08 */ 1128,
+	/* U+00CA+0300 -> U+1EC0 */ 1308,
+	/* U+00CA+0301 -> U+1EBE */ 1306,
+	/* U+00CA+0303 -> U+1EC4 */ 1312,
+	/* U+00CA+0309 -> U+1EC2 */ 1310,
+	/* U+00CF+0301 -> U+1E2E */ 1166,
+	/* U+00D4+0300 -> U+1ED2 */ 1326,
+	/* U+00D4+0301 -> U+1ED0 */ 1324,
+	/* U+00D4+0303 -> U+1ED6 */ 1330,
+	/* U+00D4+0309 -> U+1ED4 */ 1328,
+	/* U+00D5+0301 -> U+1E4C */ 1196,
+	/* U+00D5+0304 -> U+022C */ 276,
+	/* U+00D5+0308 -> U+1E4E */ 1198,
+	/* U+00D6+0304 -> U+022A */ 274,
+	/* U+00D8+0301 -> U+01FE */ 238,
+	/* U+00DC+0300 -> U+01DB */ 208,
+	/* U+00DC+0301 -> U+01D7 */ 204,
+	/* U+00DC+0304 -> U+01D5 */ 202,
+	/* U+00DC+030C -> U+01D9 */ 206,
+	/* U+00E2+0300 -> U+1EA7 */ 1283,
+	/* U+00E2+0301 -> U+1EA5 */ 1281,
+	/* U+00E2+0303 -> U+1EAB */ 1287,
+	/* U+00E2+0309 -> U+1EA9 */ 1285,
+	/* U+00E4+0304 -> U+01DF */ 211,
+	/* U+00E5+0301 -> U+01FB */ 235,
+	/* U+00E6+0301 -> U+01FD */ 237,
+	/* U+00E6+0304 -> U+01E3 */ 215,
+	/* U+00E7+0301 -> U+1E09 */ 1129,
+	/* U+00EA+0300 -> U+1EC1 */ 1309,
+	/* U+00EA+0301 -> U+1EBF */ 1307,
+	/* U+00EA+0303 -> U+1EC5 */ 1313,
+	/* U+00EA+0309 -> U+1EC3 */ 1311,
+	/* U+00EF+0301 -> U+1E2F */ 1167,
+	/* U+00F4+0300 -> U+1ED3 */ 1327,
+	/* U+00F4+0301 -> U+1ED1 */ 1325,
+	/* U+00F4+0303 -> U+1ED7 */ 1331,
+	/* U+00F4+0309 -> U+1ED5 */ 1329,
+	/* U+00F5+0301 -> U+1E4D */ 1197,
+	/* U+00F5+0304 -> U+022D */ 277,
+	/* U+00F5+0308 -> U+1E4F */ 1199,
+	/* U+00F6+0304 -> U+022B */ 275,
+	/* U+00F8+0301 -> U+01FF */ 239,
+	/* U+00FC+0300 -> U+01DC */ 209,
+	/* U+00FC+0301 -> U+01D8 */ 205,
+	/* U+00FC+0304 -> U+01D6 */ 203,
+	/* U+00FC+030C -> U+01DA */ 207,
+	/* U+0102+0300 -> U+1EB0 */ 1292,
+	/* U+0102+0301 -> U+1EAE */ 1290,
+	/* U+0102+0303 -> U+1EB4 */ 1296,
+	/* U+0102+0309 -> U+1EB2 */ 1294,
+	/* U+0103+0300 -> U+1EB1 */ 1293,
+	/* U+0103+0301 -> U+1EAF */ 1291,
+	/* U+0103+0303 -> U+1EB5 */ 1297,
+	/* U+0103+0309 -> U+1EB3 */ 1295,
+	/* U+0112+0300 -> U+1E14 */ 1140,
+	/* U+0112+0301 -> U+1E16 */ 1142,
+	/* U+0113+0300 -> U+1E15 */ 1141,
+	/* U+0113+0301 -> U+1E17 */ 1143,
+	/* U+014C+0300 -> U+1E50 */ 1200,
+	/* U+014C+0301 -> U+1E52 */ 1202,
+	/* U+014D+0300 -> U+1E51 */ 1201,
+	/* U+014D+0301 -> U+1E53 */ 1203,
+	/* U+015A+0307 -> U+1E64 */ 1220,
+	/* U+015B+0307 -> U+1E65 */ 1221,
+	/* U+0160+0307 -> U+1E66 */ 1222,
+	/* U+0161+0307 -> U+1E67 */ 1223,
+	/* U+0168+0301 -> U+1E78 */ 1240,
+	/* U+0169+0301 -> U+1E79 */ 1241,
+	/* U+016A+0308 -> U+1E7A */ 1242,
+	/* U+016B+0308 -> U+1E7B */ 1243,
+	/* U+017F+0307 -> U+1E9B */ 1275,
+	/* U+01A0+0300 -> U+1EDC */ 1336,
+	/* U+01A0+0301 -> U+1EDA */ 1334,
+	/* U+01A0+0303 -> U+1EE0 */ 1340,
+	/* U+01A0+0309 -> U+1EDE */ 1338,
+	/* U+01A0+0323 -> U+1EE2 */ 1342,
+	/* U+01A1+0300 -> U+1EDD */ 1337,
+	/* U+01A1+0301 -> U+1EDB */ 1335,
+	/* U+01A1+0303 -> U+1EE1 */ 1341,
+	/* U+01A1+0309 -> U+1EDF */ 1339,
+	/* U+01A1+0323 -> U+1EE3 */ 1343,
+	/* U+01AF+0300 -> U+1EEA */ 1350,
+	/* U+01AF+0301 -> U+1EE8 */ 1348,
+	/* U+01AF+0303 -> U+1EEE */ 1354,
+	/* U+01AF+0309 -> U+1EEC */ 1352,
+	/* U+01AF+0323 -> U+1EF0 */ 1356,
+	/* U+01B0+0300 -> U+1EEB */ 1351,
+	/* U+01B0+0301 -> U+1EE9 */ 1349,
+	/* U+01B0+0303 -> U+1EEF */ 1355,
+	/* U+01B0+0309 -> U+1EED */ 1353,
+	/* U+01B0+0323 -> U+1EF1 */ 1357,
+	/* U+01B7+030C -> U+01EE */ 224,
+	/* U+01EA+0304 -> U+01EC */ 222,
+	/* U+01EB+0304 -> U+01ED */ 223,
+	/* U+0226+0304 -> U+01E0 */ 212,
+	/* U+0227+0304 -> U+01E1 */ 213,
+	/* U+0228+0306 -> U+1E1C */ 1148,
+	/* U+0229+0306 -> U+1E1D */ 1149,
+	/* U+022E+0304 -> U+0230 */ 280,
+	/* U+022F+0304 -> U+0231 */ 281,
+	/* U+0292+030C -> U+01EF */ 225,
+	/* U+0391+0300 -> U+1FBA */ 1537,
+	/* U+0391+0301 -> U+0386 */ 420,
+	/* U+0391+0304 -> U+1FB9 */ 1536,
+	/* U+0391+0306 -> U+1FB8 */ 1535,
+	/* U+0391+0313 -> U+1F08 */ 1374,
+	/* U+0391+0314 -> U+1F09 */ 1375,
+	/* U+0391+0345 -> U+1FBC */ 1539,
+	/* U+0395+0300 -> U+1FC8 */ 1550,
+	/* U+0395+0301 -> U+0388 */ 422,
+	/* U+0395+0313 -> U+1F18 */ 1388,
+	/* U+0395+0314 -> U+1F19 */ 1389,
+	/* U+0397+0300 -> U+1FCA */ 1552,
+	/* U+0397+0301 -> U+0389 */ 423,
+	/* U+0397+0313 -> U+1F28 */ 1402,
+	/* U+0397+0314 -> U+1F29 */ 1403,
+	/* U+0397+0345 -> U+1FCC */ 1554,
+	/* U+0399+0300 -> U+1FDA */ 1566,
+	/* U+0399+0301 -> U+038A */ 424,
+	/* U+0399+0304 -> U+1FD9 */ 1565,
+	/* U+0399+0306 -> U+1FD8 */ 1564,
+	/* U+0399+0308 -> U+03AA */ 429,
+	/* U+0399+0313 -> U+1F38 */ 1418,
+	/* U+0399+0314 -> U+1F39 */ 1419,
+	/* U+039F+0300 -> U+1FF8 */ 1592,
+	/* U+039F+0301 -> U+038C */ 425,
+	/* U+039F+0313 -> U+1F48 */ 1432,
+	/* U+039F+0314 -> U+1F49 */ 1433,
+	/* U+03A1+0314 -> U+1FEC */ 1583,
+	/* U+03A5+0300 -> U+1FEA */ 1581,
+	/* U+03A5+0301 -> U+038E */ 426,
+	/* U+03A5+0304 -> U+1FE9 */ 1580,
+	/* U+03A5+0306 -> U+1FE8 */ 1579,
+	/* U+03A5+0308 -> U+03AB */ 430,
+	/* U+03A5+0314 -> U+1F59 */ 1446,
+	/* U+03A9+0300 -> U+1FFA */ 1594,
+	/* U+03A9+0301 -> U+038F */ 427,
+	/* U+03A9+0313 -> U+1F68 */ 1458,
+	/* U+03A9+0314 -> U+1F69 */ 1459,
+	/* U+03A9+0345 -> U+1FFC */ 1596,
+	/* U+03AC+0345 -> U+1FB4 */ 1532,
+	/* U+03AE+0345 -> U+1FC4 */ 1547,
+	/* U+03B1+0300 -> U+1F70 */ 1466,
+	/* U+03B1+0301 -> U+03AC */ 431,
+	/* U+03B1+0304 -> U+1FB1 */ 1529,
+	/* U+03B1+0306 -> U+1FB0 */ 1528,
+	/* U+03B1+0313 -> U+1F00 */ 1366,
+	/* U+03B1+0314 -> U+1F01 */ 1367,
+	/* U+03B1+0342 -> U+1FB6 */ 1533,
+	/* U+03B1+0345 -> U+1FB3 */ 1531,
+	/* U+03B5+0300 -> U+1F72 */ 1468,
+	/* U+03B5+0301 -> U+03AD */ 432,
+	/* U+03B5+0313 -> U+1F10 */ 1382,
+	/* U+03B5+0314 -> U+1F11 */ 1383,
+	/* U+03B7+0300 -> U+1F74 */ 1470,
+	/* U+03B7+0301 -> U+03AE */ 433,
+	/* U+03B7+0313 -> U+1F20 */ 1394,
+	/* U+03B7+0314 -> U+1F21 */ 1395,
+	/* U+03B7+0342 -> U+1FC6 */ 1548,
+	/* U+03B7+0345 -> U+1FC3 */ 1546,
+	/* U+03B9+0300 -> U+1F76 */ 1472,
+	/* U+03B9+0301 -> U+03AF */ 434,
+	/* U+03B9+0304 -> U+1FD1 */ 1559,
+	/* U+03B9+0306 -> U+1FD0 */ 1558,
+	/* U+03B9+0308 -> U+03CA */ 436,
+	/* U+03B9+0313 -> U+1F30 */ 1410,
+	/* U+03B9+0314 -> U+1F31 */ 1411,
+	/* U+03B9+0342 -> U+1FD6 */ 1562,
+	/* U+03BF+0300 -> U+1F78 */ 1474,
+	/* U+03BF+0301 -> U+03CC */ 438,
+	/* U+03BF+0313 -> U+1F40 */ 1426,
+	/* U+03BF+0314 -> U+1F41 */ 1427,
+	/* U+03C1+0313 -> U+1FE4 */ 1575,
+	/* U+03C1+0314 -> U+1FE5 */ 1576,
+	/* U+03C5+0300 -> U+1F7A */ 1476,
+	/* U+03C5+0301 -> U+03CD */ 439,
+	/* U+03C5+0304 -> U+1FE1 */ 1572,
+	/* U+03C5+0306 -> U+1FE0 */ 1571,
+	/* U+03C5+0308 -> U+03CB */ 437,
+	/* U+03C5+0313 -> U+1F50 */ 1438,
+	/* U+03C5+0314 -> U+1F51 */ 1439,
+	/* U+03C5+0342 -> U+1FE6 */ 1577,
+	/* U+03C9+0300 -> U+1F7C */ 1478,
+	/* U+03C9+0301 -> U+03CE */ 440,
+	/* U+03C9+0313 -> U+1F60 */ 1450,
+	/* U+03C9+0314 -> U+1F61 */ 1451,
+	/* U+03C9+0342 -> U+1FF6 */ 1590,
+	/* U+03C9+0345 -> U+1FF3 */ 1588,
+	/* U+03CA+0300 -> U+1FD2 */ 1560,
+	/* U+03CA+0301 -> U+0390 */ 428,
+	/* U+03CA+0342 -> U+1FD7 */ 1563,
+	/* U+03CB+0300 -> U+1FE2 */ 1573,
+	/* U+03CB+0301 -> U+03B0 */ 435,
+	/* U+03CB+0342 -> U+1FE7 */ 1578,
+	/* U+03CE+0345 -> U+1FF4 */ 1589,
+	/* U+03D2+0301 -> U+03D3 */ 444,
+	/* U+03D2+0308 -> U+03D4 */ 445,
+	/* U+0406+0308 -> U+0407 */ 457,
+	/* U+0410+0306 -> U+04D0 */ 479,
+	/* U+0410+0308 -> U+04D2 */ 481,
+	/* U+0413+0301 -> U+0403 */ 456,
+	/* U+0415+0300 -> U+0400 */ 454,
+	/* U+0415+0306 -> U+04D6 */ 483,
+	/* U+0415+0308 -> U+0401 */ 455,
+	/* U+0416+0306 -> U+04C1 */ 477,
+	/* U+0416+0308 -> U+04DC */ 487,
+	/* U+0417+0308 -> U+04DE */ 489,
+	/* U+0418+0300 -> U+040D */ 459,
+	/* U+0418+0304 -> U+04E2 */ 491,
+	/* U+0418+0306 -> U+0419 */ 461,
+	/* U+0418+0308 -> U+04E4 */ 493,
+	/* U+041A+0301 -> U+040C */ 458,
+	/* U+041E+0308 -> U+04E6 */ 495,
+	/* U+0423+0304 -> U+04EE */ 501,
+	/* U+0423+0306 -> U+040E */ 460,
+	/* U+0423+0308 -> U+04F0 */ 503,
+	/* U+0423+030B -> U+04F2 */ 505,
+	/* U+0427+0308 -> U+04F4 */ 507,
+	/* U+042B+0308 -> U+04F8 */ 509,
+	/* U+042D+0308 -> U+04EC */ 499,
+	/* U+0430+0306 -> U+04D1 */ 480,
+	/* U+0430+0308 -> U+04D3 */ 482,
+	/* U+0433+0301 -> U+0453 */ 465,
+	/* U+0435+0300 -> U+0450 */ 463,
+	/* U+0435+0306 -> U+04D7 */ 484,
+	/* U+0435+0308 -> U+0451 */ 464,
+	/* U+0436+0306 -> U+04C2 */ 478,
+	/* U+0436+0308 -> U+04DD */ 488,
+	/* U+0437+0308 -> U+04DF */ 490,
+	/* U+0438+0300 -> U+045D */ 468,
+	/* U+0438+0304 -> U+04E3 */ 492,
+	/* U+0438+0306 -> U+0439 */ 462,
+	/* U+0438+0308 -> U+04E5 */ 494,
+	/* U+043A+0301 -> U+045C */ 467,
+	/* U+043E+0308 -> U+04E7 */ 496,
+	/* U+0443+0304 -> U+04EF */ 502,
+	/* U+0443+0306 -> U+045E */ 469,
+	/* U+0443+0308 -> U+04F1 */ 504,
+	/* U+0443+030B -> U+04F3 */ 506,
+	/* U+0447+0308 -> U+04F5 */ 508,
+	/* U+044B+0308 -> U+04F9 */ 510,
+	/* U+044D+0308 -> U+04ED */ 500,
+	/* U+0456+0308 -> U+0457 */ 466,
+	/* U+0474+030F -> U+0476 */ 470,
+	/* U+0475+030F -> U+0477 */ 471,
+	/* U+04D8+0308 -> U+04DA */ 485,
+	/* U+04D9+0308 -> U+04DB */ 486,
+	/* U+04E8+0308 -> U+04EA */ 497,
+	/* U+04E9+0308 -> U+04EB */ 498,
+	/* U+0627+0653 -> U+0622 */ 574,
+	/* U+0627+0654 -> U+0623 */ 575,
+	/* U+0627+0655 -> U+0625 */ 577,
+	/* U+0648+0654 -> U+0624 */ 576,
+	/* U+064A+0654 -> U+0626 */ 578,
+	/* U+06C1+0654 -> U+06C2 */ 606,
+	/* U+06D2+0654 -> U+06D3 */ 607,
+	/* U+06D5+0654 -> U+06C0 */ 605,
+	/* U+0928+093C -> U+0929 */ 733,
+	/* U+0930+093C -> U+0931 */ 734,
+	/* U+0933+093C -> U+0934 */ 735,
+	/* U+09C7+09BE -> U+09CB */ 751,
+	/* U+09C7+09D7 -> U+09CC */ 752,
+	/* U+0B47+0B3E -> U+0B4B */ 770,
+	/* U+0B47+0B56 -> U+0B48 */ 769,
+	/* U+0B47+0B57 -> U+0B4C */ 771,
+	/* U+0B92+0BD7 -> U+0B94 */ 775,
+	/* U+0BC6+0BBE -> U+0BCA */ 776,
+	/* U+0BC6+0BD7 -> U+0BCC */ 778,
+	/* U+0BC7+0BBE -> U+0BCB */ 777,
+	/* U+0C46+0C56 -> U+0C48 */ 780,
+	/* U+0CBF+0CD5 -> U+0CC0 */ 785,
+	/* U+0CC6+0CC2 -> U+0CCA */ 788,
+	/* U+0CC6+0CD5 -> U+0CC7 */ 786,
+	/* U+0CC6+0CD6 -> U+0CC8 */ 787,
+	/* U+0CCA+0CD5 -> U+0CCB */ 789,
+	/* U+0D46+0D3E -> U+0D4A */ 793,
+	/* U+0D46+0D57 -> U+0D4C */ 795,
+	/* U+0D47+0D3E -> U+0D4B */ 794,
+	/* U+0DD9+0DCA -> U+0DDA */ 798,
+	/* U+0DD9+0DCF -> U+0DDC */ 799,
+	/* U+0DD9+0DDF -> U+0DDE */ 801,
+	/* U+0DDC+0DCA -> U+0DDD */ 800,
+	/* U+1025+102E -> U+1026 */ 859,
+	/* U+1B05+1B35 -> U+1B06 */ 904,
+	/* U+1B07+1B35 -> U+1B08 */ 905,
+	/* U+1B09+1B35 -> U+1B0A */ 906,
+	/* U+1B0B+1B35 -> U+1B0C */ 907,
+	/* U+1B0D+1B35 -> U+1B0E */ 908,
+	/* U+1B11+1B35 -> U+1B12 */ 909,
+	/* U+1B3A+1B35 -> U+1B3B */ 911,
+	/* U+1B3C+1B35 -> U+1B3D */ 912,
+	/* U+1B3E+1B35 -> U+1B40 */ 913,
+	/* U+1B3F+1B35 -> U+1B41 */ 914,
+	/* U+1B42+1B35 -> U+1B43 */ 915,
+	/* U+1E36+0304 -> U+1E38 */ 1176,
+	/* U+1E37+0304 -> U+1E39 */ 1177,
+	/* U+1E5A+0304 -> U+1E5C */ 1212,
+	/* U+1E5B+0304 -> U+1E5D */ 1213,
+	/* U+1E62+0307 -> U+1E68 */ 1224,
+	/* U+1E63+0307 -> U+1E69 */ 1225,
+	/* U+1EA0+0302 -> U+1EAC */ 1288,
+	/* U+1EA0+0306 -> U+1EB6 */ 1298,
+	/* U+1EA1+0302 -> U+1EAD */ 1289,
+	/* U+1EA1+0306 -> U+1EB7 */ 1299,
+	/* U+1EB8+0302 -> U+1EC6 */ 1314,
+	/* U+1EB9+0302 -> U+1EC7 */ 1315,
+	/* U+1ECC+0302 -> U+1ED8 */ 1332,
+	/* U+1ECD+0302 -> U+1ED9 */ 1333,
+	/* U+1F00+0300 -> U+1F02 */ 1368,
+	/* U+1F00+0301 -> U+1F04 */ 1370,
+	/* U+1F00+0342 -> U+1F06 */ 1372,
+	/* U+1F00+0345 -> U+1F80 */ 1480,
+	/* U+1F01+0300 -> U+1F03 */ 1369,
+	/* U+1F01+0301 -> U+1F05 */ 1371,
+	/* U+1F01+0342 -> U+1F07 */ 1373,
+	/* U+1F01+0345 -> U+1F81 */ 1481,
+	/* U+1F02+0345 -> U+1F82 */ 1482,
+	/* U+1F03+0345 -> U+1F83 */ 1483,
+	/* U+1F04+0345 -> U+1F84 */ 1484,
+	/* U+1F05+0345 -> U+1F85 */ 1485,
+	/* U+1F06+0345 -> U+1F86 */ 1486,
+	/* U+1F07+0345 -> U+1F87 */ 1487,
+	/* U+1F08+0300 -> U+1F0A */ 1376,
+	/* U+1F08+0301 -> U+1F0C */ 1378,
+	/* U+1F08+0342 -> U+1F0E */ 1380,
+	/* U+1F08+0345 -> U+1F88 */ 1488,
+	/* U+1F09+0300 -> U+1F0B */ 1377,
+	/* U+1F09+0301 -> U+1F0D */ 1379,
+	/* U+1F09+0342 -> U+1F0F */ 1381,
+	/* U+1F09+0345 -> U+1F89 */ 1489,
+	/* U+1F0A+0345 -> U+1F8A */ 1490,
+	/* U+1F0B+0345 -> U+1F8B */ 1491,
+	/* U+1F0C+0345 -> U+1F8C */ 1492,
+	/* U+1F0D+0345 -> U+1F8D */ 1493,
+	/* U+1F0E+0345 -> U+1F8E */ 1494,
+	/* U+1F0F+0345 -> U+1F8F */ 1495,
+	/* U+1F10+0300 -> U+1F12 */ 1384,
+	/* U+1F10+0301 -> U+1F14 */ 1386,
+	/* U+1F11+0300 -> U+1F13 */ 1385,
+	/* U+1F11+0301 -> U+1F15 */ 1387,
+	/* U+1F18+0300 -> U+1F1A */ 1390,
+	/* U+1F18+0301 -> U+1F1C */ 1392,
+	/* U+1F19+0300 -> U+1F1B */ 1391,
+	/* U+1F19+0301 -> U+1F1D */ 1393,
+	/* U+1F20+0300 -> U+1F22 */ 1396,
+	/* U+1F20+0301 -> U+1F24 */ 1398,
+	/* U+1F20+0342 -> U+1F26 */ 1400,
+	/* U+1F20+0345 -> U+1F90 */ 1496,
+	/* U+1F21+0300 -> U+1F23 */ 1397,
+	/* U+1F21+0301 -> U+1F25 */ 1399,
+	/* U+1F21+0342 -> U+1F27 */ 1401,
+	/* U+1F21+0345 -> U+1F91 */ 1497,
+	/* U+1F22+0345 -> U+1F92 */ 1498,
+	/* U+1F23+0345 -> U+1F93 */ 1499,
+	/* U+1F24+0345 -> U+1F94 */ 1500,
+	/* U+1F25+0345 -> U+1F95 */ 1501,
+	/* U+1F26+0345 -> U+1F96 */ 1502,
+	/* U+1F27+0345 -> U+1F97 */ 1503,
+	/* U+1F28+0300 -> U+1F2A */ 1404,
+	/* U+1F28+0301 -> U+1F2C */ 1406,
+	/* U+1F28+0342 -> U+1F2E */ 1408,
+	/* U+1F28+0345 -> U+1F98 */ 1504,
+	/* U+1F29+0300 -> U+1F2B */ 1405,
+	/* U+1F29+0301 -> U+1F2D */ 1407,
+	/* U+1F29+0342 -> U+1F2F */ 1409,
+	/* U+1F29+0345 -> U+1F99 */ 1505,
+	/* U+1F2A+0345 -> U+1F9A */ 1506,
+	/* U+1F2B+0345 -> U+1F9B */ 1507,
+	/* U+1F2C+0345 -> U+1F9C */ 1508,
+	/* U+1F2D+0345 -> U+1F9D */ 1509,
+	/* U+1F2E+0345 -> U+1F9E */ 1510,
+	/* U+1F2F+0345 -> U+1F9F */ 1511,
+	/* U+1F30+0300 -> U+1F32 */ 1412,
+	/* U+1F30+0301 -> U+1F34 */ 1414,
+	/* U+1F30+0342 -> U+1F36 */ 1416,
+	/* U+1F31+0300 -> U+1F33 */ 1413,
+	/* U+1F31+0301 -> U+1F35 */ 1415,
+	/* U+1F31+0342 -> U+1F37 */ 1417,
+	/* U+1F38+0300 -> U+1F3A */ 1420,
+	/* U+1F38+0301 -> U+1F3C */ 1422,
+	/* U+1F38+0342 -> U+1F3E */ 1424,
+	/* U+1F39+0300 -> U+1F3B */ 1421,
+	/* U+1F39+0301 -> U+1F3D */ 1423,
+	/* U+1F39+0342 -> U+1F3F */ 1425,
+	/* U+1F40+0300 -> U+1F42 */ 1428,
+	/* U+1F40+0301 -> U+1F44 */ 1430,
+	/* U+1F41+0300 -> U+1F43 */ 1429,
+	/* U+1F41+0301 -> U+1F45 */ 1431,
+	/* U+1F48+0300 -> U+1F4A */ 1434,
+	/* U+1F48+0301 -> U+1F4C */ 1436,
+	/* U+1F49+0300 -> U+1F4B */ 1435,
+	/* U+1F49+0301 -> U+1F4D */ 1437,
+	/* U+1F50+0300 -> U+1F52 */ 1440,
+	/* U+1F50+0301 -> U+1F54 */ 1442,
+	/* U+1F50+0342 -> U+1F56 */ 1444,
+	/* U+1F51+0300 -> U+1F53 */ 1441,
+	/* U+1F51+0301 -> U+1F55 */ 1443,
+	/* U+1F51+0342 -> U+1F57 */ 1445,
+	/* U+1F59+0300 -> U+1F5B */ 1447,
+	/* U+1F59+0301 -> U+1F5D */ 1448,
+	/* U+1F59+0342 -> U+1F5F */ 1449,
+	/* U+1F60+0300 -> U+1F62 */ 1452,
+	/* U+1F60+0301 -> U+1F64 */ 1454,
+	/* U+1F60+0342 -> U+1F66 */ 1456,
+	/* U+1F60+0345 -> U+1FA0 */ 1512,
+	/* U+1F61+0300 -> U+1F63 */ 1453,
+	/* U+1F61+0301 -> U+1F65 */ 1455,
+	/* U+1F61+0342 -> U+1F67 */ 1457,
+	/* U+1F61+0345 -> U+1FA1 */ 1513,
+	/* U+1F62+0345 -> U+1FA2 */ 1514,
+	/* U+1F63+0345 -> U+1FA3 */ 1515,
+	/* U+1F64+0345 -> U+1FA4 */ 1516,
+	/* U+1F65+0345 -> U+1FA5 */ 1517,
+	/* U+1F66+0345 -> U+1FA6 */ 1518,
+	/* U+1F67+0345 -> U+1FA7 */ 1519,
+	/* U+1F68+0300 -> U+1F6A */ 1460,
+	/* U+1F68+0301 -> U+1F6C */ 1462,
+	/* U+1F68+0342 -> U+1F6E */ 1464,
+	/* U+1F68+0345 -> U+1FA8 */ 1520,
+	/* U+1F69+0300 -> U+1F6B */ 1461,
+	/* U+1F69+0301 -> U+1F6D */ 1463,
+	/* U+1F69+0342 -> U+1F6F */ 1465,
+	/* U+1F69+0345 -> U+1FA9 */ 1521,
+	/* U+1F6A+0345 -> U+1FAA */ 1522,
+	/* U+1F6B+0345 -> U+1FAB */ 1523,
+	/* U+1F6C+0345 -> U+1FAC */ 1524,
+	/* U+1F6D+0345 -> U+1FAD */ 1525,
+	/* U+1F6E+0345 -> U+1FAE */ 1526,
+	/* U+1F6F+0345 -> U+1FAF */ 1527,
+	/* U+1F70+0345 -> U+1FB2 */ 1530,
+	/* U+1F74+0345 -> U+1FC2 */ 1545,
+	/* U+1F7C+0345 -> U+1FF2 */ 1587,
+	/* U+1FB6+0345 -> U+1FB7 */ 1534,
+	/* U+1FBF+0300 -> U+1FCD */ 1555,
+	/* U+1FBF+0301 -> U+1FCE */ 1556,
+	/* U+1FBF+0342 -> U+1FCF */ 1557,
+	/* U+1FC6+0345 -> U+1FC7 */ 1549,
+	/* U+1FF6+0345 -> U+1FF7 */ 1591,
+	/* U+1FFE+0300 -> U+1FDD */ 1568,
+	/* U+1FFE+0301 -> U+1FDE */ 1569,
+	/* U+1FFE+0342 -> U+1FDF */ 1570,
+	/* U+2190+0338 -> U+219A */ 1801,
+	/* U+2192+0338 -> U+219B */ 1802,
+	/* U+2194+0338 -> U+21AE */ 1803,
+	/* U+21D0+0338 -> U+21CD */ 1804,
+	/* U+21D2+0338 -> U+21CF */ 1806,
+	/* U+21D4+0338 -> U+21CE */ 1805,
+	/* U+2203+0338 -> U+2204 */ 1807,
+	/* U+2208+0338 -> U+2209 */ 1808,
+	/* U+220B+0338 -> U+220C */ 1809,
+	/* U+2223+0338 -> U+2224 */ 1810,
+	/* U+2225+0338 -> U+2226 */ 1811,
+	/* U+223C+0338 -> U+2241 */ 1816,
+	/* U+2243+0338 -> U+2244 */ 1817,
+	/* U+2245+0338 -> U+2247 */ 1818,
+	/* U+2248+0338 -> U+2249 */ 1819,
+	/* U+224D+0338 -> U+226D */ 1822,
+	/* U+2261+0338 -> U+2262 */ 1821,
+	/* U+2264+0338 -> U+2270 */ 1825,
+	/* U+2265+0338 -> U+2271 */ 1826,
+	/* U+2272+0338 -> U+2274 */ 1827,
+	/* U+2273+0338 -> U+2275 */ 1828,
+	/* U+2276+0338 -> U+2278 */ 1829,
+	/* U+2277+0338 -> U+2279 */ 1830,
+	/* U+227A+0338 -> U+2280 */ 1831,
+	/* U+227B+0338 -> U+2281 */ 1832,
+	/* U+227C+0338 -> U+22E0 */ 1841,
+	/* U+227D+0338 -> U+22E1 */ 1842,
+	/* U+2282+0338 -> U+2284 */ 1833,
+	/* U+2283+0338 -> U+2285 */ 1834,
+	/* U+2286+0338 -> U+2288 */ 1835,
+	/* U+2287+0338 -> U+2289 */ 1836,
+	/* U+2291+0338 -> U+22E2 */ 1843,
+	/* U+2292+0338 -> U+22E3 */ 1844,
+	/* U+22A2+0338 -> U+22AC */ 1837,
+	/* U+22A8+0338 -> U+22AD */ 1838,
+	/* U+22A9+0338 -> U+22AE */ 1839,
+	/* U+22AB+0338 -> U+22AF */ 1840,
+	/* U+22B2+0338 -> U+22EA */ 1845,
+	/* U+22B3+0338 -> U+22EB */ 1846,
+	/* U+22B4+0338 -> U+22EC */ 1847,
+	/* U+22B5+0338 -> U+22ED */ 1848,
+	/* U+3046+3099 -> U+3094 */ 2286,
+	/* U+304B+3099 -> U+304C */ 2261,
+	/* U+304D+3099 -> U+304E */ 2262,
+	/* U+304F+3099 -> U+3050 */ 2263,
+	/* U+3051+3099 -> U+3052 */ 2264,
+	/* U+3053+3099 -> U+3054 */ 2265,
+	/* U+3055+3099 -> U+3056 */ 2266,
+	/* U+3057+3099 -> U+3058 */ 2267,
+	/* U+3059+3099 -> U+305A */ 2268,
+	/* U+305B+3099 -> U+305C */ 2269,
+	/* U+305D+3099 -> U+305E */ 2270,
+	/* U+305F+3099 -> U+3060 */ 2271,
+	/* U+3061+3099 -> U+3062 */ 2272,
+	/* U+3064+3099 -> U+3065 */ 2273,
+	/* U+3066+3099 -> U+3067 */ 2274,
+	/* U+3068+3099 -> U+3069 */ 2275,
+	/* U+306F+3099 -> U+3070 */ 2276,
+	/* U+306F+309A -> U+3071 */ 2277,
+	/* U+3072+3099 -> U+3073 */ 2278,
+	/* U+3072+309A -> U+3074 */ 2279,
+	/* U+3075+3099 -> U+3076 */ 2280,
+	/* U+3075+309A -> U+3077 */ 2281,
+	/* U+3078+3099 -> U+3079 */ 2282,
+	/* U+3078+309A -> U+307A */ 2283,
+	/* U+307B+3099 -> U+307C */ 2284,
+	/* U+307B+309A -> U+307D */ 2285,
+	/* U+309D+3099 -> U+309E */ 2291,
+	/* U+30A6+3099 -> U+30F4 */ 2318,
+	/* U+30AB+3099 -> U+30AC */ 2293,
+	/* U+30AD+3099 -> U+30AE */ 2294,
+	/* U+30AF+3099 -> U+30B0 */ 2295,
+	/* U+30B1+3099 -> U+30B2 */ 2296,
+	/* U+30B3+3099 -> U+30B4 */ 2297,
+	/* U+30B5+3099 -> U+30B6 */ 2298,
+	/* U+30B7+3099 -> U+30B8 */ 2299,
+	/* U+30B9+3099 -> U+30BA */ 2300,
+	/* U+30BB+3099 -> U+30BC */ 2301,
+	/* U+30BD+3099 -> U+30BE */ 2302,
+	/* U+30BF+3099 -> U+30C0 */ 2303,
+	/* U+30C1+3099 -> U+30C2 */ 2304,
+	/* U+30C4+3099 -> U+30C5 */ 2305,
+	/* U+30C6+3099 -> U+30C7 */ 2306,
+	/* U+30C8+3099 -> U+30C9 */ 2307,
+	/* U+30CF+3099 -> U+30D0 */ 2308,
+	/* U+30CF+309A -> U+30D1 */ 2309,
+	/* U+30D2+3099 -> U+30D3 */ 2310,
+	/* U+30D2+309A -> U+30D4 */ 2311,
+	/* U+30D5+3099 -> U+30D6 */ 2312,
+	/* U+30D5+309A -> U+30D7 */ 2313,
+	/* U+30D8+3099 -> U+30D9 */ 2314,
+	/* U+30D8+309A -> U+30DA */ 2315,
+	/* U+30DB+3099 -> U+30DC */ 2316,
+	/* U+30DB+309A -> U+30DD */ 2317,
+	/* U+30EF+3099 -> U+30F7 */ 2319,
+	/* U+30F0+3099 -> U+30F8 */ 2320,
+	/* U+30F1+3099 -> U+30F9 */ 2321,
+	/* U+30F2+3099 -> U+30FA */ 2322,
+	/* U+30FD+3099 -> U+30FE */ 2323,
+	/* U+11099+110BA -> U+1109A */ 4588,
+	/* U+1109B+110BA -> U+1109C */ 4589,
+	/* U+110A5+110BA -> U+110AB */ 4590,
+	/* U+11131+11127 -> U+1112E */ 4596,
+	/* U+11132+11127 -> U+1112F */ 4597,
+	/* U+11347+1133E -> U+1134B */ 4609,
+	/* U+11347+11357 -> U+1134C */ 4610,
+	/* U+114B9+114B0 -> U+114BC */ 4628,
+	/* U+114B9+114BA -> U+114BB */ 4627,
+	/* U+114B9+114BD -> U+114BE */ 4629,
+	/* U+115B8+115AF -> U+115BA */ 4632,
+	/* U+115B9+115AF -> U+115BB */ 4633,
+	/* U+11935+11930 -> U+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

#17Michael Paquier
michael@paquier.xyz
In reply to: John Naylor (#16)
1 attachment(s)
Re: speed up unicode decomposition and recomposition

On Wed, Oct 21, 2020 at 07:35:12PM -0400, John Naylor wrote:

There was a mistake in v3 with pgindent/exclude_file_patterns, fixed in v4.

Thanks for the updated version, that was fast. I have found a couple
of places that needed to be adjusted, like the comment at the top of
generate-unicode_norm_table.pl or some comments, an incorrect include
in the new headers and the indentation was not right in perl (we use
perltidy v20170521, see the README in src/tools/pgindent).

Except that, this looks good to me. Attached is the updated version
with all my tweaks, that I would like to commit. If there are any
comments, please feel free of course.
--
Michael

Attachments:

unicode-derecomp-v5.patchtext/x-diff; charset=us-asciiDownload
diff --git a/src/include/common/unicode_norm_hashfunc.h b/src/include/common/unicode_norm_hashfunc.h
new file mode 100644
index 0000000000..e6acb2a8d0
--- /dev/null
+++ b/src/include/common/unicode_norm_hashfunc.h
@@ -0,0 +1,2932 @@
+/*-------------------------------------------------------------------------
+ *
+ * unicode_norm_hashfunc.h
+ *	  Perfect hash functions used for Unicode normalization
+ *
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/common/unicode_norm_hashfunc.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * File auto-generated by src/common/unicode/generate-unicode_norm_table.pl,
+ * do not edit. There is deliberately not an #ifndef PG_UNICODE_NORM_HASHFUNC_H
+ * here.
+ */
+
+#include "common/unicode_norm_table.h"
+
+/* Typedef for perfect hash functions */
+typedef int (*cp_hash_func) (const void *key);
+
+/* Information for lookups with perfect hash functions */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	cp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
+typedef struct
+{
+	const uint16	*inverse_lookup;
+	cp_hash_func	hash;
+	int		num_recomps;
+} pg_unicode_recompinfo;
+
+/* Perfect hash function for decomposition */
+static int
+Decomp_hash_func(const void *key)
+{
+	static const int16 h[13209] = {
+		0,     1515,  4744,  4745,  0,     0,     0,     0,
+		0,     0,     0,     0,     3890,  3890,  0,     0,
+		3891,  3891,  -2046, 2800,  3890,  3890,  3890,  -4396,
+		4361,  4362,  -4441, -4441, -4396, 1773,  1773,  1773,
+		4372,  4373,  -4438, -4438, -4393, -4393, 2619,  17,
+		-4347, -4393, -4393, -4393, -4393, -4393, 2619,  2619,
+		1560,  4346,  4347,  4348,  1917,  1873,  1874,  1875,
+		-7856, 4358,  17619, 2622,  2622,  2622,  6357,  6358,
+		6359,  6360,  6361,  6362,  6363,  2622,  -4390, -4390,
+		4414,  -5356, -5356, 4374,  4375,  -5356, -5356, -6335,
+		-3020, 2511,  -5356, -5356, -3583, -3583, -3583, -3583,
+		-995,  0,     0,     -9799, -9754, 2874,  2875,  2876,
+		2877,  2878,  -9830, -3591, -9756, -9756, -2744, -5346,
+		-9710, -9756, 342,   -5346, -9756, -5346, -2743, -449,
+		348,   2894,  2895,  -2853, 2897,  2898,  2899,  2900,
+		2901,  2902,  2903,  2904,  2905,  2906,  2907,  2908,
+		2909,  2910,  2911,  2912,  2913,  2914,  2915,  2916,
+		2917,  2918,  2919,  2920,  2921,  2922,  2923,  2924,
+		2925,  2926,  2927,  2928,  2929,  2930,  2931,  2932,
+		2933,  2934,  32767, 32767, 32767, 32767, 32767, 32767,
+		-8721, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1,     32767, 48,    32767, 32767, 32767, 32767, 49,
+		32767, 32767, -8687, -8687, -6255, -6210, 32767, 32767,
+		-8689, -8689, -21949,32767, -18635,-15320,-15320,32767,
+		-12006,-8691, -8691, -8691, -8691, -8691, 32767, 66,
+		-8737, -8737, -8692, -8692, -8692, -8692, 73,    74,
+		32767, -8738, -8693, -8693, -8693, -8693, -8693, 32767,
+		32767, -8695, -8695, -8695, -8695, -8695, 32767, 32767,
+		40,    41,    -2390, -2434, 44,    45,    32767, 46,
+		13307, 9993,  9994,  6680,  6681,  3367,  3368,  54,
+		0,     55,    56,    57,    -8699, -8699, 105,   32767,
+		32767, 61,    62,    63,    -8701, -8701, 32767, 111,
+		32767, 67,    68,    69,    70,    1890,  3687,  -1272,
+		3690,  75,    76,    77,    78,    79,    80,    81,
+		82,    32767, 32767, 83,    84,    85,    86,    87,
+		88,    89,    90,    91,    92,    93,    94,    95,
+		96,    97,    98,    99,    100,   101,   102,   32767,
+		32767, 103,   104,   105,   106,   107,   108,   109,
+		-8660, -8660, 32767, -8661, -8661, -8661, -8661, -8661,
+		-8661, 32767, 73,    74,    75,    76,    -2355, -2399,
+		79,    80,    32767, 32767, 13341, 10027, 10028, 6714,
+		6715,  3401,  3402,  32767, 32767, 88,    89,    90,
+		-8666, -8666, 138,   32767, 32767, 94,    95,    96,
+		-8668, -8668, 144,   145,   101,   -2553, -2553, -2553,
+		-2553, -4983, -2553, -2553, 154,   -2553, 156,   32767,
+		32767, 6114,  158,   -3153, -3152, -3151, -12891,-6888,
+		-931,  -3149, 166,   -3148, -4728, 169,   -3147, -3146,
+		-3145, -3144, -3143, -3142, -3141, -2543, -3139, -3138,
+		180,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 3314,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     3660,  3661,  2131,  2132,  2133,  2134,  2135,
+		2136,  2137,  2138,  2139,  2140,  2141,  2142,  2143,
+		2144,  2145,  -5472, -5472, -3612, -3612, -3612, -3612,
+		-3612, 2652,  -3612, -3612, -3612, -3612, -3612, -3612,
+		-3612, -3612, 3693,  -3613, -7015, -7015, 1742,  1743,
+		-7060, -7060, -7015, -846,  -846,  -846,  1753,  1754,
+		-7057, -7057, -7012, -7012, 0,     -2602, -6966, -7012,
+		-7012, -7012, -7012, -7012, 0,     0,     1725,  1726,
+		1727,  1728,  -703,  -747,  -746,  0,     1735,  1736,
+		14997, 0,     0,     0,     3735,  3736,  3737,  3738,
+		3739,  3740,  3741,  0,     -7012, -7012, 1792,  1793,
+		1749,  1750,  1751,  -7980, -7980, -8959, -5644, -113,
+		-7980, -113,  -2382, -6116, -6116, -6116, -6116, -6116,
+		-6116, -6116, -2374, 4639,  4640,  -4163, 5608,  5609,
+		-4120, -4120, 5612,  5613,  6593,  3279,  -2251, 5617,
+		5618,  3846,  3847,  3848,  3849,  1262,  1262,  10066,
+		10067, 10023, 3855,  3856,  3857,  1259,  1259,  10071,
+		3861,  10027, 10028, 3017,  5620,  9985,  10032, -65,
+		5624,  10035, 5626,  3024,  731,   -65,   1298,  12530,
+		3727,  3727,  3772,  3772,  3772,  13504, 13505, 14485,
+		11171, 5641,  13509, 5643,  7913,  11648, 11649, 11650,
+		11651, 11652, 11653, 11654, 7913,  901,   901,   9705,
+		-65,   -65,   9665,  9666,  -65,   -65,   -1044, 2271,
+		7802,  -65,   -65,   1708,  1708,  1708,  1708,  4296,
+		4297,  -4506, -4506, -4461, 1708,  1708,  1708,  4307,
+		4308,  -4503, 1708,  -4457, -4457, 2555,  -47,   -4411,
+		-4457, 5641,  -47,   -4457, -47,   2556,  4850,  5647,
+		4285,  -6946, 1858,  1859,  1815,  1816,  1817,  -7914,
+		-7914, -8893, -5578, -47,   -7914, -47,   -2316, -6050,
+		-6050, -6050, -6050, -6050, -6050, -6050, -2308, 4705,
+		4706,  -4097, 5674,  5675,  -4054, -4054, 5678,  5679,
+		6659,  3345,  -2185, 5683,  5684,  3912,  3913,  3914,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -3083, -3083, 232,   287,   233,   233,
+		233,   8990,  8991,  32767, 32767, 3668,  32767, 3667,
+		3667,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 208,   208,   208,   208,   208,   208,
+		32767, 32767, 206,   206,   206,   206,   206,   32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 304,   305,   -1274, 307,   308,
+		309,   6753,  -1374, 10488, 4486,  -1470, 4488,  316,
+		4489,  -5607, 4490,  4491,  4492,  322,   760,   324,
+		325,   326,   166,   763,   329,   -2553, 765,   332,
+		333,   334,   335,   772,   337,   6310,  339,   340,
+		341,   342,   343,   344,   345,   346,   -2542, -2542,
+		-2542, 350,   351,   352,   353,   354,   355,   356,
+		357,   358,   359,   360,   361,   362,   -6008, 364,
+		365,   366,   367,   368,   369,   370,   254,   372,
+		373,   374,   375,   376,   377,   378,   379,   380,
+		381,   382,   32767, 383,   384,   -3606, -3605, -3604,
+		-3603, 389,   -3600, -3599, -3598, 2340,  -1238, -3595,
+		-3594, -3593, 4694,  -4062, -4062, 4742,  4743,  4699,
+		-1469, -1468, -1467, -4065, -4065, 4747,  -1463, 4703,
+		4704,  -2307, 296,   32767, 0,     32767, 32767, 4708,
+		-1376, -1376, -1376, 32767, 32767, -1246, 506,   506,
+		0,     -1559, 32767, 32767, 32767, 32767, 32767, 305,
+		419,   308,   2578,  6313,  6314,  424,   32767, -6030,
+		32767, 426,   427,   428,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     32767, 0,
+		32767, 0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     32767, 429,   -5407, 431,
+		-5406, 433,   -3601, 435,   32767, -3751, 32767, 32767,
+		32767, 32767, -3755, 32767, 32767, 32767, 32767, 0,
+		32767, 32767, 32767, 32767, 0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 436,   -11425,-5422,
+		535,   -5422, 535,   -5422, 4675,  -5421, -5421, -5421,
+		-5421, -5421, 4681,  0,     0,     0,     4682,  4683,
+		4684,  4685,  4686,  4687,  0,     0,     32767, 32767,
+		0,     0,     -5684, 0,     4688,  4689,  4690,  4691,
+		4692,  4693,  4694,  4695,  -1257, -1257, 4696,  -5441,
+		-5441, 4699,  4700,  4701,  -5443, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 454,   0,     32767, 456,
+		32767, 32767, 0,     457,   32767, 32767, 32767, 0,
+		458,   459,   460,   32767, 0,     32767, 32767, 32767,
+		32767, 32767, 32767, 4703,  4704,  4705,  4706,  32767,
+		32767, 0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 4655,  4656,  4657,  4658,
+		4659,  4712,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 462,   32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 463,   464,   32767, 465,
+		32767, 32767, 32767, 466,   32767, 32767, 32767, 32767,
+		467,   468,   469,   32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 3011,  3011,  3011,
+		3011,  3011,  3011,  3011,  32767, 32767, 32767, 32767,
+		32767, 32767, 470,   471,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 472,
+		473,   474,   475,   476,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 4713,  4714,  4715,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 477,   478,   32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 479,   480,   481,   482,
+		32767, 32767, 483,   484,   32767, 32767, 485,   486,
+		487,   488,   489,   490,   32767, 32767, 491,   492,
+		493,   494,   495,   496,   32767, 32767, 0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     665,   -255,  667,   0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     693,   694,   695,   696,
+		697,   698,   699,   700,   701,   702,   703,   704,
+		705,   706,   707,   708,   709,   710,   711,   712,
+		7183,  714,   -1580, 716,   2547,  718,   7194,  720,
+		2553,  722,   723,   7204,  725,   726,   727,   728,
+		729,   730,   731,   732,   733,   734,   735,   736,
+		0,     0,     8114,  8159,  745,   -1535, 747,   748,
+		8161,  -5019, -5019, -5019, -5019, 1938,  0,     0,
+		0,     0,     0,     0,     767,   768,   0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     32767, 32767, 32767, 32767, 32767, 0,     32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, -2875, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -4271, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, -2884, -2884, -2884, -2884, -2884,
+		-2884, -2884, -2884, 32767, -2885, 32767, -2886, -2886,
+		32767, -2887, -2887, 32767, -2888, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 563,   564,
+		565,   566,   567,   568,   569,   570,   571,   572,
+		573,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		574,   575,   576,   577,   578,   32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, -294,  -294,  -294,  -3047, 583,   584,   585,
+		-4462, -4418, -4418, -4418, -4418, -4418, -4462, -4462,
+		-4462, 595,   596,   597,   598,   599,   32767, 32767,
+		32767, 32767, -4471, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 4716,  4717,  4718,  4719,
+		4720,  4721,  4722,  4723,  4724,  4725,  4726,  4727,
+		4728,  4729,  4730,  4731,  4732,  4733,  4734,  4735,
+		3826,  4737,  4738,  4739,  4740,  4741,  4742,  3832,
+		4744,  3833,  3120,  3121,  3835,  3835,  3124,  3836,
+		3836,  4753,  4754,  4755,  4756,  4757,  4758,  4759,
+		4760,  4761,  4762,  4763,  4764,  4765,  4766,  4767,
+		4768,  4769,  4770,  4771,  4772,  4773,  4774,  4775,
+		4776,  4777,  4778,  4779,  4780,  4781,  6619,  6620,
+		6621,  11272, 6623,  6624,  4788,  4789,  4790,  3874,
+		4761,  3874,  4794,  3874,  4796,  4797,  4798,  3874,
+		4800,  32767, 0,     4802,  4803,  4804,  4805,  4806,
+		4807,  4808,  4809,  4810,  4811,  4812,  4813,  4814,
+		4815,  4816,  4817,  4818,  4819,  4820,  4821,  4822,
+		4823,  4824,  4825,  4826,  4827,  4828,  11299, 4830,
+		2536,  4832,  6663,  4834,  11310, 4836,  6669,  4838,
+		4839,  11320, 4841,  4842,  4843,  4844,  4845,  4846,
+		4847,  4848,  4849,  4850,  4851,  4852,  1188,  4854,
+		4855,  4856,  4857,  2577,  4859,  4860,  12273, -907,
+		-907,  -907,  -907,  -907,  -907,  4868,  4869,  4870,
+		4871,  32767, 4872,  4873,  32767, 32767, 4874,  32767,
+		627,   4875,  4876,  32767, 32767, 4877,  4878,  4879,
+		6722,  32767, 4881,  4882,  4883,  6730,  6731,  7446,
+		6733,  4888,  7449,  7449,  4891,  4892,  32767, 4893,
+		32767, 4894,  4895,  4896,  4897,  4898,  4899,  3512,
+		3513,  3514,  3515,  3516,  4904,  3518,  3519,  3520,
+		3521,  3522,  3523,  3524,  3525,  3526,  3527,  3528,
+		3529,  3530,  3531,  3532,  3533,  3534,  3535,  3536,
+		3537,  3538,  4926,  6797,  4928,  6800,  4930,  4931,
+		4932,  4933,  4934,  4935,  6813,  4937,  4938,  6816,
+		6817,  4941,  4942,  4943,  0,     4945,  6821,  0,
+		0,     4949,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, -127,  -127,  -127,
+		7285,  -127,  -127,  0,     -128,  -128,  -128,  -128,
+		0,     32767, -130,  4971,  -129,  5613,  5614,  5615,
+		4976,  5618,  32767, 5619,  5620,  5621,  4981,  5624,
+		4983,  4984,  32767, 5630,  5631,  -1986, -1986, -126,
+		-126,  5078,  4992,  5037,  5038,  5039,  5040,  5041,
+		5086,  5087,  5088,  5089,  -2322, 5091,  5092,  5093,
+		5094,  5095,  5096,  5097,  5098,  5099,  5100,  0,
+		5101,  -640,  -640,  -640,  0,     -641,  -641,  -641,
+		-641,  -641,  0,     -642,  0,     0,     32767, -645,
+		-645,  6973,  6974,  5115,  5116,  -87,   0,     -44,
+		-44,   -44,   -44,   -44,   -88,   -88,   -88,   -88,
+		7324,  -88,   -88,   -88,   -88,   -88,   -88,   -88,
+		-88,   -88,   -88,   -88,   -88,   5654,  5655,  5656,
+		5657,  5658,  5659,  5660,  5661,  5662,  5663,  5664,
+		5665,  5666,  5667,  5668,  5669,  -1948, -1948, -88,
+		-88,   5116,  5117,  5074,  5075,  5076,  5077,  5078,
+		5123,  5124,  5125,  5126,  -2285, 5128,  5129,  5130,
+		5131,  5132,  5133,  5134,  5135,  5136,  5137,  5138,
+		5139,  -602,  -602,  -602,  -602,  -602,  -602,  -602,
+		-602,  -602,  -602,  -602,  -602,  -602,  -602,  -602,
+		-602,  7016,  7017,  5158,  5159,  -44,   -44,   0,
+		0,     0,     0,     0,     -44,   -44,   -44,   -44,
+		7368,  -44,   -44,   -44,   -44,   -44,   -44,   -44,
+		-44,   -44,   -44,   -44,   -44,   5698,  5699,  5700,
+		5701,  5702,  5703,  5704,  5705,  5706,  5707,  5708,
+		5709,  5710,  5711,  5712,  5713,  -1904, -1904, -44,
+		-44,   5160,  5161,  5118,  5119,  5120,  5121,  5122,
+		5167,  5168,  5169,  5170,  -2241, 5172,  5173,  5174,
+		5175,  5176,  5177,  5178,  5179,  5180,  5181,  5182,
+		5183,  -558,  -558,  -558,  -558,  -558,  -558,  -558,
+		-558,  -558,  -558,  -558,  -558,  -558,  -558,  -558,
+		-558,  7060,  7061,  5202,  5203,  0,     0,     44,
+		44,    44,    44,    44,    0,     0,     0,     0,
+		7412,  0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     5742,  5743,  5744,
+		5745,  5746,  5747,  5748,  5749,  5750,  5751,  5752,
+		5753,  5754,  5755,  5756,  5757,  -1860, -1860, 0,
+		0,     0,     0,     0,     6264,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     -3402,
+		-3402, 5355,  5356,  -3447, -3447, -3402, -3402, -3402,
+		-3402, 5363,  5364,  -3447, -3447, -3402, -3402, -3402,
+		-3358, -3358, -3404, -3404, -3404, -3404, -3404, -3404,
+		-3404, 5331,  5332,  5333,  5334,  2903,  2859,  5337,
+		5338,  5339,  5340,  18601, 15287, 15288, 11974, 11975,
+		8661,  8662,  5348,  5349,  5350,  5351,  5352,  -3404,
+		-3404, 5400,  5401,  5357,  5358,  5359,  5360,  -3404,
+		-3404, 5408,  5409,  5365,  5366,  5367,  5324,  5325,
+		5372,  5373,  5374,  5375,  5376,  5377,  5378,  -3356,
+		-3356, -3356, -3356, -924,  -879,  -3356, -3356, -3356,
+		-3356, -16616,-13301,-13301,-9986, -9986, -6671, -6671,
+		-3356, -3356, -3356, -3356, -3356, 5401,  5402,  -3401,
+		-3401, -3356, -3356, -3356, -3356, 5409,  5410,  -3401,
+		-3401, -3356, -3356, -3356, -3312, -3312, -3358, -3358,
+		-3358, -3358, -3358, -3358, -3358, 5377,  5378,  5379,
+		5380,  2949,  2905,  5383,  5384,  5385,  5386,  18647,
+		15333, 15334, 12020, 12021, 8707,  8708,  5394,  5395,
+		5396,  5397,  5398,  -3358, -3358, 5446,  5447,  5403,
+		5404,  5405,  5406,  -3358, -3358, 5454,  5455,  5411,
+		5412,  5413,  5414,  5415,  5416,  5417,  5418,  5419,
+		5420,  5421,  5422,  -3312, -3312, -3312, -3312, -880,
+		-835,  -3312, -3312, -3312, -3312, -16572,-13257,-13257,
+		-9942, -9942, -6627, -6627, -3312, -3312, -3312, -3312,
+		-3312, 5445,  5446,  -3357, -3357, -3312, -3312, -3312,
+		-3312, 5453,  5454,  -3357, -3357, -3312, -3312, -3312,
+		-3312, -3312, -3312, -3312, -3312, -3312, -3312, -3312,
+		-3312, 5423,  5424,  5425,  5426,  2995,  2951,  5429,
+		5430,  5431,  5432,  18693, 15379, 15380, 12066, 12067,
+		8753,  8754,  5440,  5441,  5442,  5443,  5444,  -3312,
+		-3312, 5492,  5493,  5449,  5450,  5451,  5452,  -3312,
+		-3312, 5500,  5501,  5457,  2803,  2803,  2803,  2803,
+		373,   2803,  2803,  5510,  2803,  5512,  11470, 5514,
+		11472, 5516,  2205,  2206,  2207,  -7533, -1530, 4427,
+		2209,  5524,  2210,  630,   5527,  2211,  2212,  2213,
+		2214,  2215,  2216,  2217,  2815,  2219,  2220,  5538,
+		2221,  5540,  2222,  5542,  5543,  2223,  -3312, -3312,
+		-3312, 5548,  5549,  -3312, -3312, 2803,  2803,  2803,
+		5555,  5556,  5557,  2803,  2803,  2803,  2803,  2803,
+		2803,  2803,  2803,  2803,  2803,  2803,  2803,  2803,
+		9050,  9051,  2803,  2803,  2803,  2803,  2803,  2803,
+		2803,  2803,  2803,  2803,  2803,  2803,  4318,  7547,
+		7548,  2803,  2803,  2803,  2803,  2803,  2803,  2803,
+		2803,  6693,  6693,  2803,  2803,  6694,  6694,  757,
+		5603,  6693,  6693,  6693,  -1593, 7164,  7165,  -1638,
+		-1638, -1593, 4576,  4576,  4576,  7175,  7176,  -1635,
+		-1635, -1590, -1590, 5422,  2820,  -1544, -1590, -1590,
+		-1590, -1590, -1590, 5422,  5422,  4363,  7149,  7150,
+		7151,  4720,  4676,  4677,  4678,  -5053, 7161,  20422,
+		5425,  5425,  5425,  9160,  9161,  9162,  9163,  9164,
+		9165,  9166,  5425,  -1587, -1587, 7217,  -2553, -2553,
+		7177,  7178,  -2553, 32767, 32767, -219,  5312,  -2555,
+		-2555, -782,  -782,  -782,  -782,  1806,  2801,  2801,
+		-6998, -6953, 5675,  5676,  5677,  5678,  5679,  -7029,
+		-790,  -6955, -6955, 57,    -2545, -6909, -6955, 3143,
+		-2545, -6955, -2545, 58,    2352,  3149,  5695,  5696,
+		-52,   5698,  5699,  5700,  5701,  5702,  5703,  5704,
+		5705,  5706,  5707,  5708,  5709,  5710,  5711,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -1838, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 6927,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -973,  32767, 32767,
+		32767, 32767, 0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     4567,  4568,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -437,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -448,  32767, 32767, -450,  -450,
+		-450,  0,     32767, 32767, 32767, -2166, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     0,     32767, -464,
+		-464,  32767, 0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -514,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		5757,  5758,  5759,  0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -4186, -4186, -12097,-4186, 32767,
+		-4187, -4187, -8787, 32767, 0,     0,     5952,  0,
+		0,     -4183, -4183, -4183, 0,     -2386, -4182, 778,
+		-4183, -5935, 32767, 32767, -4690, -6249, -4184, -4184,
+		-4184, 32767, 32767, -4186, -4186, -77,   32767, -77,
+		32767, -4188, 0,     -4189, 32767, 0,     0,     0,
+		0,     32767, 0,     0,     0,     32767, 0,     0,
+		0,     0,     0,     0,     0,     32767, 0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     0,     32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     -5937, -2358, 0,     0,     0,
+		-8286, 471,   472,   32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 1747,  32767, -2126, 32767, 32767, 1748,
+		1749,  1750,  1751,  1752,  1753,  8224,  1755,  -539,
+		1757,  781,   32767, 32767, 32767, -1991, -2035, 32767,
+		32767, 782,   -3784, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 837,   32767, 32767, 32767, 32767, 32767, -4008,
+		-4008, -4008, 2949,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     -797,  1806,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 4605,  4606,
+		32767, 32767, 0,     455,   32767, 0,     32767, 32767,
+		32767, 0,     32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -4244, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		784,   32767, 32767, 2950,  2951,  32767, 32767, 32767,
+		32767, 32767, 32767, 786,   787,   32767, 1252,  1253,
+		32767, 790,   32767, 0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     32767, 0,     32767, 32767,
+		32767, 0,     32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     0,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -200,  -200,  -200,
+		-200,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		-5932, -5932, 32767, 32767, 2952,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -5387,
+		-5387, -5387, -5387, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     0,     32767, 32767,
+		0,     0,     32767, 32767, 0,     0,     0,     0,
+		0,     0,     32767, 32767, 0,     0,     0,     0,
+		0,     0,     32767, 32767, 497,   498,   499,   500,
+		501,   502,   503,   504,   505,   506,   507,   508,
+		32767, 32767, -156,  765,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -861,
+		32767, 6106,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2953,  2954,  32767, 797,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 2955,  32767, 32767, 32767, -8929,
+		32767, -8885, -8885, -8885, 32767, 32767, 32767, 32767,
+		32767, 32767, -749,  7119,  7120,  32767, 32767, 32767,
+		32767, 2760,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, -1181, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -5587, 0,     7596,
+		7597,  0,     0,     0,     0,     0,     0,     32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     -714,  0,
+		0,     -713,  -712,  0,     -711,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     1859,
+		0,     3247,  32767, 32767, 0,     3247,  0,     3248,
+		0,     3249,  0,     3250,  0,     3251,  0,     3252,
+		808,   3252,  0,     3253,  0,     3254,  0,     0,
+		3256,  0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 0,     0,     0,
+		0,     32767, 32767, 32767, 32767, 0,     0,     6824,
+		32767, 0,     32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		4207,  4208,  0,     0,     0,     0,     0,     1896,
+		0,     0,     1898,  1898,  1898,  1898,  0,     0,
+		0,     1901,  1901,  0,     0,     0,     0,     0,
+		0,     -1319, 0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     7618,  7619,  7620,
+		3,     3,     1863,  1863,  7067,  7068,  7025,  7026,
+		7027,  7028,  7029,  7074,  7075,  7076,  7077,  -334,
+		7079,  7080,  7081,  7082,  7083,  7084,  7085,  7086,
+		7087,  7088,  7089,  7090,  1349,  1349,  1349,  1349,
+		1349,  1349,  1349,  1349,  1349,  1349,  1349,  1349,
+		1349,  1349,  1349,  1349,  8967,  8968,  7109,  7110,
+		1907,  1907,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 2976,  2977,  2978,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     0,     820,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 821,
+		2381,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 2005,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 823,   32767, 824,   32767,
+		825,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 826,   32767, 32767, 32767, 32767, 32767,
+		32767, 4575,  4576,  4577,  4578,  4579,  4580,  4581,
+		4582,  4583,  4584,  4585,  32767, 32767, 829,   32767,
+		32767, 32767, 32767, 830,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		6253,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		6253,  -3848, 834,   835,   836,   -3845, -3845, -3845,
+		-3845, -3845, -3845, 843,   844,   -4280, 32767, 845,
+		846,   6531,  848,   -3839, 32767, -3840, -3840, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 1946,  32767,
+		32767, 32767, -3849, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 853,   32767, 32767, 32767,
+		32767, 854,   32767, 32767, 32767, 32767, 855,   32767,
+		32767, 32767, 32767, 856,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		857,   32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -3799, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 8266,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 859,   32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 860,
+		32767, 861,   -5065, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 10746, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4526,
+		32767, 4573,  4574,  4575,  32767, 32767, -2436, -1376,
+		32767, 32767, 32767, 32767, 32767, -1689, -1689, 4349,
+		-4171, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 4588,  32767,
+		4589,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4590,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4591,  4592,  32767,
+		32767, 32767, 32767, 32767, 32767, 2933,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 864,   32767, 32767, 32767,
+		0,     32767, 0,     32767, 32767, -2977, 335,   335,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2992,  2993,  2994,  2995,
+		32767, 32767, 32767, 4596,  2550,  32767, 32767, 32767,
+		-1188, 4769,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		4600,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 2997,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4601,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 2013,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -11287,32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -4664, 32767, 32767, -4711, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -4718, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4049,
+		32767, 32767, 32767, 4050,  4051,  4052,  17313, 32767,
+		32767, 32767, 10684, 7370,  7371,  4057,  4058,  4059,
+		4060,  4061,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 4603,  8793,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1283,  4897,  4898,  4899,  12175, 4901,  4902,  32767,
+		4903,  4904,  4905,  4906,  4907,  10276, -1469, 1282,
+		1282,  1282,  1282,  1282,  1282,  1282,  1282,  1282,
+		1282,  32767, 32767, 4920,  4921,  4063,  -2051, -2050,
+		4925,  4926,  32767, 7332,  7333,  32767, 7334,  7335,
+		7336,  7337,  5045,  32767, 32767, 32767, -2049, -2048,
+		32767, -8294, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     1132,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     20166, 16852, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     6908,  6909,  6910,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		-4510, -4510, -4510, -4510, -4510, -4510, -4510, 0,
+		0,     0,     0,     0,     0,     -1831, -1831, -1831,
+		-15091,-11776,-11776,-8461, 0,     0,     0,     -1834,
+		-1834, -1834, -1834, -1834, 0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     -1819, -3615, 1345,  -3616, 0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     32767, 32767, 0,
+		0,     0,     0,     0,     0,     0,     8770,  8771,
+		8772,  8773,  8774,  8775,  8776,  8777,  8778,  8779,
+		45,    45,    45,    45,    2477,  2522,  45,    45,
+		45,    45,    -13215,-9900, -9900, -6585, -6585, -3270,
+		-3270, 45,    45,    45,    45,    45,    8802,  8803,
+		0,     0,     45,    45,    45,    45,    8810,  8811,
+		0,     0,     45,    2700,  2701,  2702,  2703,  5134,
+		2705,  2706,  0,     2708,  0,     -5957, 0,     -5957,
+		0,     3312,  3312,  3312,  13053, 7051,  1095,  3314,
+		0,     3315,  4896,  0,     3317,  3317,  3317,  3317,
+		3317,  3317,  3317,  2720,  3317,  3317,  0,     3318,
+		0,     3319,  0,     0,     3321,  8857,  8858,  8859,
+		0,     0,     8862,  8863,  2749,  2750,  2751,  0,
+		0,     0,     2755,  2756,  2757,  2758,  2759,  2760,
+		2761,  2762,  2763,  2764,  2765,  2766,  2767,  -3479,
+		-3479, 2770,  2771,  2772,  2773,  2774,  2775,  2776,
+		2777,  2778,  2779,  2780,  2781,  1267,  -1961, -1961,
+		2785,  2786,  2787,  2788,  2789,  2790,  2791,  2792,
+		-1097, -1096, 2795,  2796,  -1094, -1093, 4845,  0,
+		-1089, -1088, -1087, 7200,  -1556, -1556, 7248,  7249,
+		7205,  1037,  1038,  1039,  -1559, -1559, 7253,  7254,
+		7210,  7211,  200,   2803,  7168,  7215,  7216,  7217,
+		7218,  7219,  208,   209,   1269,  -1516, -1516, -1516,
+		916,   961,   961,   961,   10693, -1520, -14780,218,
+		219,   220,   -3514, -3514, -3514, -3514, -3514, -3514,
+		-3514, 228,   7241,  7242,  -1561, 8210,  8211,  -1518,
+		-1518, 8214,  8215,  9195,  5881,  351,   8219,  8220,
+		6448,  6449,  6450,  6451,  3864,  2870,  2871,  12671,
+		12627, 0,     0,     0,     0,     0,     12709, 6471,
+		12637, 12638, 5627,  8230,  12595, 12642, 2545,  8234,
+		12645, 8236,  5634,  3341,  2545,  0,     0,     5749,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     0,     0,     11602,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     1466,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     5760,  0,     0,     0,     0,     0,     32767,
+		0,     32767, 0,     0,     32767, 0,     0,     32767,
+		0,     3507,  3508,  0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		1644,  1645,  1646,  1647,  -5764, 1649,  1650,  1651,
+		1652,  1653,  1654,  1655,  1656,  1657,  1658,  1659,
+		1660,  -4081, -4081, -4081, -4081, -4081, -4081, -4081,
+		-4081, -4081, -4081, -4081, -4081, -4081, -4081, -4081,
+		-4081, 3537,  3538,  1679,  3582,  3583,  3584,  -3482,
+		-3482, -3482, -3482, -3482, -3526, -3526, -3526, -3526,
+		3886,  -3526, -3526, -3526, -3526, 3599,  3600,  3601,
+		3602,  3603,  3604,  3605,  3606,  3607,  3608,  3609,
+		3610,  3611,  3612,  3613,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     0,
+		-7275, 0,     0,     -7234, 0,     0,     0,     0,
+		0,     -5368, 6378,  3628,  3629,  3630,  3631,  3632,
+		3633,  3634,  3635,  3636,  3637,  3638,  3639,  0,
+		0,     859,   6974,  6974,  0,     0,     3647,  -2405,
+		-2405, 3650,  -2405, -2405, -2405, -2405, -112,  -2405,
+		-3201, 3658,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     32767, 32767, 32767,
+		32767, 5280,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		4637,  4638,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 4014,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 802,   32767, 32767,
+		32767, 32767, 803,   -1055, 805,   32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 4639,  32767,
+		32767, 32767, 806,   -2445, 0,     -2443, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 810,   32767, 32767,
+		32767, 32767, 811,   812,   813,   32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -6211, -6211, -6211, -6211, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, -6271, -6271,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 935,   32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, -10300,32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     0,     32767, 32767, 4640,  4641,  32767,
+		32767, 32767, 32767, 32767, 4624,  32767, 32767, 32767,
+		-4233, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		1859,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 872,   32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -4568, -1253, 32767,
+		-3590, 32767, 32767, 32767, -1820, -1820, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 873,   874,   875,   3629,  0,     0,
+		0,     5048,  5005,  5006,  5007,  5008,  5009,  5054,
+		5055,  5056,  0,     0,     0,     0,     0,     32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4118,
+		32767, 32767, 32767, 32767, -4122, -4122, -4122, -4122,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4193,
+		32767, -4194, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -4209, 32767, 32767, -4211, -4211, -4211,
+		-4211, -4211, -4211, -4211, 32767, 32767, -4213, -10683,
+		-4213, -1918, -4213, -6043, 32767, 32767, -4215, -6047,
+		32767, -4216, -10696,-4216, -4216, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 4646,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 876,   877,   0,     32767, 0,     32767, 0,
+		32767, 0,     32767, 0,     32767, 32767, 32767, 0,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 1844,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     -2899, 0,     32767,
+		0,     32767, 0,     32767, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     836,   0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     32767, 0,     0,     0,     879,
+		880,   881,   882,   883,   884,   885,   886,   0,
+		0,     887,   0,     920,   0,     922,   923,   924,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 5431,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 3639,  889,   890,   891,   892,   893,
+		894,   895,   896,   897,   898,   899,   900,   -2739,
+		927,   -1881, 4234,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, -459,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -458,
+		-457,  904,   32767, 905,   32767, 906,   32767, 907,
+		32767, 908,   32767, 32767, 32767, 909,   32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     910,
+		0,     0,     0,     0,     0,     0,     911,   0,
+		912,   1626,  1626,  913,   914,   1626,  915,   916,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     -1837, -1837, -1837,
+		-6487, -1837, -1837, 0,     0,     0,     917,   31,
+		919,   0,     921,   0,     0,     0,     925,   0,
+		32767, 4801,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     -6470, 0,     2295,
+		0,     -1830, 0,     -6475, 0,     -1832, 0,     0,
+		-6480, 0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     3665,  0,     0,
+		0,     0,     2281,  0,     0,     -7412, 5769,  5770,
+		5771,  5772,  5773,  5774,  0,     0,     0,     0,
+		32767, 0,     0,     32767, 32767, 0,     32767, 32767,
+		0,     0,     32767, 32767, 0,     0,     0,     -1842,
+		32767, 0,     0,     0,     -1846, -1846, -2560, -1846,
+		0,     -2560, -2559, 0,     0,     32767, 0,     32767,
+		0,     0,     0,     0,     0,     0,     1388,  0,
+		1387,  1387,  1387,  0,     1387,  1387,  1387,  1387,
+		1387,  1387,  1387,  1387,  1387,  1387,  1387,  1387,
+		1387,  1387,  1387,  1387,  1387,  1387,  1387,  1387,
+		1387,  0,     -1870, 0,     -1871, 0,     0,     0,
+		0,     0,     0,     -1877, 0,     0,     -1877, -1877,
+		0,     0,     0,     4944,  0,     -1875, 4947,  4948,
+		0,     4950,  4951,  4952,  4953,  4954,  4955,  4956,
+		4957,  4958,  4959,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		32767, 32767, 0,     0,     0,     0,     32767, 32767,
+		32767, 0,     0,     931,   32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 4650,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 5375,
+		5376,  5377,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 13180, 0,     0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, -4011, 933,   -4011, 32767,
+		935,   936,   -4012, 938,   939,   940,   941,   942,
+		943,   944,   945,   946,   947,   32767, 1075,  1076,
+		1077,  -6334, 1079,  1080,  954,   32767, 32767, 32767,
+		32767, 955,   32767, 32767, 32767, 32767, 32767, 32767,
+		-4659, 32767, 32767, 32767, -4662, -4662, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 959,   960,   961,   32767, 962,   963,   964,
+		965,   966,   967,   968,   969,   970,   971,   972,
+		32767, 973,   974,   975,   976,   977,   978,   979,
+		980,   981,   982,   983,   984,   985,   986,   987,
+		988,   989,   990,   32767, 991,   992,   993,   994,
+		995,   996,   997,   998,   999,   1000,  1001,  1002,
+		1003,  1004,  1005,  1006,  1007,  1008,  1009,  1010,
+		1011,  1012,  1013,  1014,  1015,  1016,  1017,  -362,
+		-362,  32767, 32767, 32767, 32767, -410,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 1019,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		164,   1021,  -3551, -3551, 1024,  1025,  1026,  1027,
+		1028,  1029,  1030,  1031,  1032,  1033,  1034,  1035,
+		1036,  1037,  1038,  1039,  1040,  1041,  1042,  1043,
+		1044,  1045,  1046,  1047,  1048,  1049,  1050,  1051,
+		1052,  1053,  1054,  1055,  1056,  1057,  1058,  1059,
+		1060,  1061,  1062,  1063,  1064,  1065,  1066,  1067,
+		1068,  1069,  1070,  1071,  1072,  1073,  1074,  1075,
+		1076,  1077,  1078,  1079,  1080,  1081,  1082,  1083,
+		1084,  1085,  1086,  1087,  1088,  1089,  1090,  1091,
+		1092,  1093,  1094,  1095,  1096,  1097,  1098,  1099,
+		1100,  1101,  1102,  1103,  1104,  1105,  1106,  1107,
+		1108,  1109,  1110,  1111,  1112,  1113,  1114,  32767,
+		1115,  1116,  1117,  1118,  1119,  32767, 1120,  1121,
+		1122,  1123,  1124,  1125,  1126,  1127,  1128,  1129,
+		1130,  1131,  0,     1133,  1134,  1135,  1136,  1137,
+		1138,  1139,  1140,  1141,  1142,  1143,  1144,  1145,
+		1146,  1147,  1148,  1149,  1150,  1151,  1152,  1153,
+		1154,  1155,  1156,  1157,  1158,  1159,  1160,  1161,
+		1162,  1163,  1164,  1165,  1166,  1167,  1168,  1169,
+		1170,  1171,  1172,  1173,  1174,  1175,  1176,  1177,
+		1178,  1179,  1180,  1181,  1182,  1183,  1184,  1185,
+		1186,  1187,  1188,  1189,  1190,  1191,  1192,  1193,
+		1194,  1195,  1196,  1197,  1198,  1199,  1200,  1201,
+		1202,  1203,  1204,  1205,  1206,  1207,  1208,  1209,
+		-18956,-15641,1212,  1213,  1214,  1215,  1216,  1217,
+		1218,  1219,  1220,  1221,  1222,  1223,  1224,  1225,
+		-5682, -5682, -5682, 1229,  1230,  1231,  1232,  1233,
+		1234,  1235,  1236,  1237,  1238,  1239,  5750,  5751,
+		5752,  5753,  5754,  5755,  5756,  1247,  1248,  1249,
+		1250,  1251,  1252,  3084,  3085,  3086,  16347, 13033,
+		13034, 9720,  1260,  1261,  1262,  3097,  3098,  3099,
+		3100,  3101,  1268,  1269,  1270,  1271,  1272,  1273,
+		1274,  1275,  32767, 32767, 32767, 32767, 1276,  1277,
+		1278,  1279,  1280,  1281,  1282,  1283,  1284,  1285,
+		1286,  1287,  1288,  1289,  1290,  1291,  1292,  1293,
+		1294,  1295,  1296,  1297,  1298,  1299,  1300,  1301,
+		1302,  1303,  1304,  1305,  1306,  1307,  1308,  1309,
+		1310,  1311,  1312,  1313,  1314,  1315,  1316,  1317,
+		1318,  1319,  1320,  1321,  1322,  1323,  1324,  1325,
+		1326,  1327,  1328,  1329,  1330,  1331,  1332,  1333,
+		1334,  1335,  1336,  1337,  1338,  1339,  1340,  1341,
+		1342,  3162,  4959,  0,     4962,  1347,  1348,  1349,
+		1350,  1351,  1352,  1353,  1354,  1355,  1356,  1357,
+		1358,  1359,  1360,  1361,  1362,  1363,  1364,  1365,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 7481,
+		7482,  7483,  7484,  5053,  5009,  7487,  7488,  7489,
+		7490,  20751, 17437, 17438, 14124, 14125, 10811, 10812,
+		7498,  7499,  7500,  7501,  7502,  32767, 32767, 7548,
+		7549,  7505,  7506,  7507,  7508,  32767, 32767, 7554,
+		7555,  7511,  4857,  4857,  4857,  4857,  2427,  4857,
+		4857,  7564,  4857,  7566,  13524, 7568,  13526, 7570,
+		4259,  4260,  4261,  -5479, 524,   6481,  4263,  7578,
+		4264,  2684,  1421,  -7842, -4527, -4527, -1212, -1212,
+		-1212, -1212, -1212, 7545,  7546,  0,     0,     -1214,
+		-1214, -1214, -1214, 7551,  7552,  32767, 1610,  -1216,
+		1439,  1440,  1441,  1442,  3873,  1444,  1445,  32767,
+		1446,  32767, -7220, 32767, -7221, 0,     2047,  2047,
+		2047,  11788, 5786,  -170,  2049,  -1265, 2050,  3631,
+		-1265, 2052,  2052,  2052,  2052,  2052,  2052,  2052,
+		1455,  2052,  2052,  -1265, 2053,  -1265, 2054,  -1265,
+		-1265, 2056,  7592,  7593,  7594,  32767, 32767, 7595,
+		7596,  1482,  1483,  1484,  -1267, -1267, -1267, 1488,
+		1489,  1490,  1491,  1492,  1493,  1494,  1495,  1496,
+		1497,  1498,  1499,  1500,  -4746, -4746, 1503,  1504,
+		1505,  1506,  1507,  1508,  1509,  1510,  1511,  1512,
+		1513,  1514,  0,     -3228, -3228, 1518,  1519,  1520,
+		1521,  1522,  1523,  1524,  1525,  -2364, -2363, 1528,
+		1529,  -2361, -2360, 3578,  0,     -2357, -2356, -2355,
+		5932,  -2824, -2824, 5980,  5981,  5937,  -231,  -230,
+		-229,  -2827, -2827, 5985,  -225,  5941,  5942,  -1069,
+		1534,  5899,  5946,  5947,  5948,  5949,  5950,  -1061,
+		-1060, 0,     -2785, 0,     -355,  -355,  -310,  -310,
+		-310,  9422,  -2791, 32767, -1054, -1053, -1052, -4786,
+		-4786, -4786, -4786, -4786, -4786, -4786, -1044, 5969,
+		5970,  -2833, 6938,  6939,  -2790, -2790, 6942,  0,
+		32767, 4607,  -923,  6945,  32767, 5173,  5174,  5175,
+		5176,  2589,  1595,  1596,  11396, 11352, 32767, 32767,
+		6126,  2812,  2813,  2814,  2815,  2816,  -5940, -5940,
+		1607,  1608,  2823,  32767, 32767, 1516,  0,     -8581,
+		0,     0,     728,   1525,  163,   -11068,0,     -2262,
+		-2306, -2305, 32767, 32767, 0,     0,     1580,  0,
+		0,     0,     -6443, 1685,  -10176,-4173, 1784,  -4173,
+		0,     -4172, 5925,  -4171, -4171, -4171, 0,     -437,
+		0,     0,     0,     161,   -435,  0,     2883,  -434,
+		0,     0,     0,     0,     -436,  0,     -5972, 0,
+		0,     0,     0,     0,     0,     0,     0,     2889,
+		2890,  2891,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     6371,
+		0,     0,     0,     0,     0,     0,     0,     117,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     32767, 0,     0,     3991,  3991,
+		3991,  3991,  0,     3990,  3990,  3990,  -1947, 1632,
+		3990,  3990,  3990,  -4296, 4461,  4462,  -4341, -4341,
+		-4296, 1873,  1873,  1873,  4472,  4473,  -4338, 1873,
+		-4292, -4292, 2720,  118,   -4246, -4292, -4292, 117,
+		-4293, -4293, 2719,  2719,  1660,  4446,  1662,  2018,
+		2019,  1975,  1976,  1977,  -7754, -7754, -8733, -5418,
+		113,   0,     112,   -2157, -5891, -5891, 0,     -5892,
+		6455,  -5893, 0,     0,     0,     32767, 32767, 32767,
+		5826,  32767, 32767, 32767, 32767, 6806,  32767, -2039,
+		32767, 5829,  32767, 5830,  5831,  5832,  32767, 5833,
+		5834,  32767, 5835,  32767, 32767, -3520, 0,     5837,
+		0,     5838,  0,     4035,  0,     5840,  32767, 10251,
+		154,   1671,  10253, 1673,  1674,  947,   151,   1514,
+		12746, 1679,  3942,  3987,  3987,  3987,  13719, 13720,
+		14700, 103,   5855,  13723, 5857,  8127,  0,     11862,
+		5860,  -96,   5862,  1690,  5863,  -4233, 5864,  5865,
+		5866,  5867,  5868,  5869,  5870,  5871,  5872,  5873,
+		32767, 5874,  5875,  5876,  5877,  5878,  5879,  5880,
+		5881,  5882,  5883,  13795, 5885,  5886,  5887,  5888,
+		10489, 5890,  1703,  1704,  -4247, 1706,  1707,  5891,
+		5892,  5893,  1711,  4098,  5895,  5896,  5897,  7650,
+		32767, 5899,  6406,  7966,  5902,  5903,  5904,  5905,
+		5906,  5907,  5908,  1800,  5910,  1801,  5912,  5913,
+		5914,  5915,  32767, 1727,  1728,  1729,  1730,  32767,
+		1731,  1732,  1733,  32767, 1734,  1735,  1736,  1737,
+		1738,  1739,  1740,  32767, 1741,  1742,  1743,  1744,
+		1745,  1746,  32767, 32767, 32767, 32767, 1747,  1748,
+		1749,  1750,  1751,  32767, 32767, 32767, 32767, 32767,
+		32767, 1752,  1753,  1754,  1755,  1756,  1757,  1758,
+		1759,  1760,  1761,  1762,  1763,  1764,  1765,  1766,
+		1767,  1768,  1769,  1770,  1771,  1772,  1773,  1774,
+		1775,  1776,  1777,  1778,  1779,  1780,  1781,  1782,
+		1783,  1784,  1785,  1786,  1787,  1788,  1789,  1790,
+		1791,  7729,  4151,  1794,  1795,  1796,  10083, 1327,
+		1327,  10131, 10132, 10088, 3920,  3921,  3922,  1324,
+		1324,  10136, 3926,  10092, 10093, 3082,  5685,  10050,
+		10097, 0,     5689,  10100, 5691,  3089,  796,   0,
+		1363,  12595, 3792,  3792,  3837,  3837,  3837,  13569,
+		13570, 14550, 11236, 5706,  13574, 5708,  7978,  11713,
+		11714, 11715, 11716, 11717, 11718, 11719, 7978,  966,
+		966,   9770,  0,     0,     9730,  9731,  0,     0,
+		-979,  2336,  7867,  0,     0,     32767, 0,     0,
+		0,     32767, 0,     0,     32767, 0,     32767, 32767,
+		9356,  32767, 0,     32767, 0,     32767, 1804,  2602,
+		0,     -4364, -4410, 5688,  0,     -4410, 0,     2603,
+		4897,  5694,  4332,  -6899, 1905,  1906,  1862,  1863,
+		1864,  -7867, -7867, -8846, -5531, 0,     -7867, 0,
+		-2269, -6003, -6003, 0,     5957,  0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     -7911, 0,
+		0,     0,     0,     -4600, 0,     0,     4156,  32767,
+		32767, 0,     0,     0,     0,     0,     1796,  0,
+		0,     0,     -1752, 0,     0,     -506,  -2065, 0,
+		0,     0,     0,     0,     0,     0,     4109,  0,
+		4110,  0,     0,     0,     0,     0,     4111,  17372,
+		0,     14058, 10744, 0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     -4650, 0,     0,     4161,  32767,
+		32767, 4117,  32767, 4118,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, -7946, 32767, -4632, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4642,
+		-4642, 4123,  4124,  -4687, 0,     0,     -4644, -4644,
+		0,     0,     -4646, -4646, 32767, 32767, 32767, 32767,
+		32767, 32767, 4084,  4085,  32767, 32767, 1609,  4087,
+		32767, 32767, 4088,  17349, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 10092, 4136,
+		10094, 4138,  10096, 0,     10097, 10098, 10099, 10100,
+		10101, 0,     32767, 32767, 32767, 0,     0,     0,
+		0,     0,     0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     0,     0,     0,     0,
+		0,     0,     0,     32767, 32767, 0,     10138, 10139,
+		0,     0,     0,     10145, 32767, 32767, 32767, 32767,
+		32767, 32767, -1425, 8316,  2314,  -3642, 32767, 0,
+		32767, 32767, 32767, 32767, -1426, -1426, -1426, -1426,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 52,    52,    52,    52,    52,
+		0,     32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 1849,  1850,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		100,   101,   102,   103,   104,   105,   106,   107,
+		108,   -5633, -5633, -5633, -5633, -5633, -5633, -5633,
+		-5633, -5633, -5633, -5633, -5633, -5633, -5633, -5633,
+		-5633, 1985,  1986,  127,   2030,  2031,  2032,  -5034,
+		32767, 32767, 32767, 32767, 32767, 0,     32767, 32767,
+		32767, 5916,  5917,  5918,  5919,  5920,  5921,  5922,
+		5923,  5924,  8824,  5926,  32767, 32767, 0,     32767,
+		0,     5927,  5928,  5929,  5930,  5931,  5932,  5933,
+		5934,  5935,  5936,  5937,  5938,  5939,  5940,  5105,
+		5942,  5943,  5944,  5945,  5946,  5947,  5948,  5949,
+		5950,  5951,  5952,  5953,  5954,  5955,  5956,  5957,
+		32767, 5958,  5959,  5960,  5082,  5082,  5082,  5082,
+		5082,  5082,  5082,  5082,  5969,  5970,  5084,  5972,
+		5053,  5974,  5053,  5053,  5053,  5978,  5979,  5980,
+		5981,  5982,  5983,  5984,  5985,  5986,  5987,  5988,
+		5989,  32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2552,  32767, 32767, 32767,
+		32767, 32767, 32767, 5990,  5991,  5992,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 5993,  32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 6936,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 1851,  1852,  1853,  1854,
+		1855,  1856,  1857,  1858,  1859,  1860,  1861,  1862,
+		1863,  1864,  1200,  2121,  1200,  1868,  1869,  1870,
+		1871,  1872,  1873,  1874,  1875,  1876,  1877,  1878,
+		1879,  1880,  1188,  1188,  1188,  1188,  1188,  1188,
+		1188,  1188,  1188,  1188,  1188,  1188,  1188,  1188,
+		1188,  1188,  1188,  1188,  1188,  1188,  -5282, 1188,
+		3483,  1188,  -642,  1188,  -5287, 1188,  -644,  1188,
+		1188,  -5292, 1188,  1188,  1188,  1188,  1188,  1188,
+		1188,  1188,  1188,  1188,  1188,  1188,  1925,  1926,
+		-6187, -6231, 1184,  3465,  1184,  1184,  -6228, 6953,
+		6954,  6955,  6956,  0,     1939,  1940,  1941,  1942,
+		1943,  1944,  1178,  1178,  1947,  1948,  1949,  1950,
+		1951,  1952,  1953,  1954,  1955,  1956,  1957,  1958,
+		1959,  1960,  1961,  1962,  1963,  1964,  1965,  1966,
+		1967,  1968,  1969,  1970,  1971,  1972,  1973,  1974,
+		1975,  1976,  1977,  1978,  1979,  1980,  1981,  1982,
+		1983,  1984,  1985,  1986,  1987,  1988,  1989,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 0,     0,     32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 709,   666,   667,   668,   32767, 669,
+		714,   715,   716,   717,   -6694, 719,   720,   721,
+		32767, 722,   723,   724,   32767, 725,   726,   727,
+		728,   -5013, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 6052,  0,     0,     6055,
+		0,     0,     0,     0,     2293,  0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 1244,  1245,  1246,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, -4660,
+		-4660, -4660, -4660, 4097,  4098,  -4705, -4705, -4660,
+		-4660, -4660, -4660, 4105,  4106,  -4705, 32767, -4661,
+		-4661, -4661, -4617, -4617, -4663, -4663, -4663, -4663,
+		-4663, -4663, -4663, 4072,  4073,  4074,  4075,  1644,
+		1600,  4078,  4079,  4080,  4081,  17342, 14028, 14029,
+		10715, 10716, 7402,  7403,  32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 0,     0,
+		0,     32767, 0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     32767, 0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		32767, 0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     1380,  32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 0,     32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 856,   0,     4573,
+		4574,  0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     32767, 0,     0,     0,
+		0,     0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		5204,  5161,  5162,  5163,  5164,  5165,  5210,  5211,
+		5212,  5213,  -2198, 5215,  5216,  5217,  5218,  5219,
+		5220,  5221,  5222,  5223,  5224,  5225,  5226,  -515,
+		-515,  -515,  -515,  -515,  -515,  -515,  -515,  -515,
+		-515,  -515,  -515,  -515,  -515,  -515,  -515,  7103,
+		7104,  5245,  5246,  5247,  5248,  5249,  -1014, 5251,
+		5252,  5253,  5254,  5255,  5256,  5257,  5258,  5259,
+		5260,  8663,  8664,  -92,   -92,   8712,  8713,  8669,
+		8670,  8671,  8672,  -92,   -92,   8720,  8721,  8677,
+		8678,  8679,  8636,  8637,  8684,  8685,  8686,  8687,
+		8688,  8689,  8690,  -44,   -44,   -44,   -44,   2388,
+		2433,  -44,   -44,   -44,   -44,   -13304,-9989, -9989,
+		-6674, -6674, -3359, -3359, -44,   -44,   -44,   -44,
+		-44,   8713,  8714,  -89,   -89,   -44,   -44,   -44,
+		-44,   8721,  8722,  -89,   -89,   -44,   -44,   -44,
+		0,     0,     -46,   -46,   -46,   -46,   -46,   -46,
+		-46,   8689,  8690,  8691,  8692,  6261,  6217,  8695,
+		8696,  8697,  8698,  21959, 18645, 18646, 15332, 15333,
+		12019, 12020, 8706,  8707,  8708,  8709,  8710,  -46,
+		-46,   8758,  8759,  8715,  8716,  8717,  8718,  -46,
+		-46,   8766,  8767,  8723,  8724,  8725,  8726,  8727,
+		8728,  8729,  8730,  8731,  8732,  8733,  8734,  0,
+		0,     0,     0,     2432,  2477,  0,     0,     0,
+		0,     -13260,-9945, -9945, -6630, -6630, -3315, -3315,
+		0,     0,     0,     0,     0,     8757,  8758,  -45,
+		-45,   0,     0,     0,     0,     8765,  8766,  -45,
+		-45,   0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     8735,  8736,  8737,
+		8738,  6307,  6263,  8741,  8742,  8743,  8744,  22005,
+		18691, 18692, 15378, 15379, 12065, 12066, 8752,  8753,
+		8754,  8755,  8756,  0,     0,     8804,  8805,  8761,
+		8762,  8763,  8764,  0,     0,     8812,  8813,  8769,
+		6115,  6115,  6115,  6115,  3685,  6115,  6115,  8822,
+		6115,  8824,  14782, 8826,  14784, 8828,  5517,  5518,
+		5519,  -4221, 1782,  7739,  5521,  8836,  5522,  3942,
+		8839,  5523,  5524,  5525,  5526,  5527,  5528,  5529,
+		6127,  5531,  5532,  8850,  5533,  8852,  5534,  8854,
+		8855,  5535,  0,     0,     0,     8860,  8861,  0,
+		0,     0,     13252, 9939,  9939,  6626,  6626,  3313,
+		3313,  0,     0,     0,     -9269, -3312, 0,     0,
+		0,     9741,  32767, 32767, 0,     32767, 0,     32767,
+		32767, 0,     0,     0,     0,     0,     0,     0,
+		-597,  0,     0,     32767, 0,     32767, 0,     32767,
+		32767, 0,     0,     32767, 32767, 32767, 0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     32767, 32767, 0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     -1387, 0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, -1773, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 0,
+		0,     0,     0,     0,     32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, -4161, 1581,  1582,  32767, 32767, 1990,  32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 0,     32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 1539,  32767, 32767, 6150,  6151,  6152,  411,
+		411,   411,   411,   411,   411,   411,   411,   411,
+		411,   411,   411,   411,   411,   411,   411,   8029,
+		8030,  6171,  6172,  969,   969,   1013,  1013,  1013,
+		1013,  1013,  969,   969,   969,   969,   8381,  969,
+		969,   969,   969,   969,   969,   969,   969,   969,
+		969,   969,   969,   6711,  6712,  6713,  6714,  6715,
+		6716,  6717,  6718,  6719,  6720,  6721,  6722,  6723,
+		6724,  6725,  6726,  -891,  -891,  969,   969,   6173,
+		6174,  6131,  6132,  6133,  6134,  6135,  6180,  6181,
+		6182,  6183,  -1228, 6185,  6186,  6187,  6188,  6189,
+		6190,  6191,  6192,  6193,  6194,  6195,  6196,  455,
+		455,   455,   455,   455,   455,   455,   455,   455,
+		455,   455,   455,   455,   455,   455,   455,   8073,
+		8074,  6215,  6216,  1013,  1013,  1057,  1057,  1057,
+		1057,  1057,  1013,  1013,  1013,  1013,  8425,  1013,
+		1013,  1013,  1013,  1013,  1013,  1013,  1013,  1013,
+		1013,  1013,  1013,  6755,  6756,  6757,  6758,  6759,
+		6760,  6761,  6762,  6763,  6764,  6765,  6766,  6767,
+		6768,  6769,  6770,  -847,  -847,  1013,  1013,  6217,
+		6218,  6175,  6176,  6177,  6178,  6179,  6224,  6225,
+		6226,  6227,  -1184, 6229,  6230,  6231,  6232,  6233,
+		6234,  6235,  6236,  6237,  6238,  6239,  6240,  499,
+		499,   499,   499,   499,   499,   499,   499,   499,
+		499,   499,   499,   499,   499,   499,   499,   8117,
+		8118,  6259,  6260,  6261,  6262,  6263,  0,     6265,
+		6266,  6267,  6268,  6269,  6270,  6271,  6272,  6273,
+		6274,  9677,  9678,  922,   922,   9726,  9727,  9683,
+		9684,  9685,  9686,  922,   922,   9734,  9735,  9691,
+		9692,  9693,  9650,  9651,  9698,  9699,  9700,  9701,
+		9702,  9703,  9704,  970,   970,   970,   970,   3402,
+		3447,  970,   970,   970,   970,   -12290,-8975, -8975,
+		-5660, -5660, -2345, -2345, -2345, -2345, -2345, 6412,
+		6413,  -2390, -2390, -2345, -2345, -2345, -2345, 6420,
+		6421,  -2390, -2390, -2345, -2345, -2345, -2301, -2301,
+		-2347, -2347, -2347, -2347, -2347, -2347, -2347, 6388,
+		6389,  6390,  6391,  3960,  3916,  6394,  6395,  6396,
+		6397,  19658, 16344, 16345, 13031, 13032, 9718,  9719,
+		6405,  6406,  6407,  6408,  6409,  -2347, -2347, 6457,
+		6458,  6414,  6415,  6416,  6417,  -2347, -2347, 6465,
+		6466,  6422,  6423,  6424,  6381,  6382,  6429,  6430,
+		6431,  6432,  6433,  6434,  6435,  -2299, -2299, -2299,
+		-2299, 133,   178,   -2299, -2299, -2299, -2299, -15559,
+		-12244,-12244,-8929, -8929, -5614, -5614, -2299, -2299,
+		-2299, -2299, -2299, 6458,  6459,  -2344, -2344, -2299,
+		-2299, -2299, -2299, 6466,  6467,  -2344, -2344, -2299,
+		-2299, -2299, -2299, -2299, -2299, -2299, -2299, -2299,
+		-2299, -2299, -2299, 6436,  6437,  6438,  6439,  4008,
+		3964,  6442,  6443,  6444,  6445,  19706, 16392, 16393,
+		13079, 13080, 9766,  9767,  6453,  6454,  6455,  6456,
+		6457,  -2299, -2299, 6505,  6506,  6462,  6463,  6464,
+		6465,  -2299, -2299, 6513,  6514,  6470,  6471,  6472,
+		6473,  6474,  6475,  6476,  6477,  6478,  6479,  6480,
+		6481,  -2253, -2253, -2253, -2253, 179,   224,   -2253,
+		-2253, -2253, -2253, -15513,-12198,-12198,-8883, -8883,
+		-5568, -5568, -2253, -2253, -2253, -2253, -2253, 6504,
+		6505,  -2298, -2298, -2253, -2253, -2253, -2253, 6512,
+		6513,  -2298, -2298, -2253, 402,   403,   404,   405,
+		2836,  407,   408,   -2298, 410,   -2298, -8255, -2298,
+		-8255, -2298, 1014,  1014,  1014,  10755, 4753,  -1203,
+		1016,  -2298, 1017,  2598,  -2298, 1019,  1019,  1019,
+		1019,  1019,  1019,  1019,  422,   1019,  1019,  -2298,
+		1020,  -2298, 1021,  -2298, -2298, 1023,  6559,  6560,
+		6561,  -2298, -2298, 6564,  6565,  6566,  -6685, -3371,
+		-3370, -56,   -55,   3259,  3260,  3261,  12531, 6575,
+		3264,  3265,  3266,  -6474, -471,  5486,  3268,  6583,
+		3269,  1689,  6586,  3270,  3271,  3272,  3273,  3274,
+		3275,  3276,  3874,  3278,  3279,  6597,  3280,  6599,
+		3281,  6601,  6602,  3282,  3283,  32767, 32767, 32767,
+		3284,  3285,  3286,  3287,  3288,  3289,  3290,  3291,
+		3292,  3293,  3294,  3295,  3296,  3297,  3298,  3299,
+		3300,  3301,  3302,  3303,  3304,  3305,  3306,  3307,
+		3308,  3309,  3310,  3311,  3312,  3313,  3314,  3315,
+		3316,  3317,  3318,  3319,  3320,  3321,  3322,  3323,
+		3324,  3325,  3326,  3327,  3328,  3329,  3330,  3331,
+		3332,  3333,  3334,  3335,  3336,  3337,  3338,  3339,
+		3340,  3341,  3342,  3343,  3344,  3345,  3346,  3347,
+		3348,  3349,  3350,  3351,  32767, 32767, 3352,  3353,
+		3354,  3355,  3356,  3357,  3358,  3359,  3360,  3361,
+		3362,  3363,  3364,  3365,  3366,  3367,  3368,  3369,
+		3370,  3371,  3372,  3373,  3374,  3375,  3376,  3377,
+		3378,  3379,  3380,  3381,  3382,  3383,  3384,  3385,
+		3386,  3387,  3388,  3389,  3390,  3391,  3392,  3393,
+		3394,  3395,  3396,  3397,  3398,  3399,  3400,  3401,
+		3402,  3403,  3404,  3405,  3406,  3407,  4795,  3409,
+		3410,  3411,  3412,  3413,  3414,  3415,  3416,  3417,
+		3418,  3419,  3420,  3421,  3422,  3423,  3424,  3425,
+		3426,  3427,  3428,  3429,  3430,  3431,  3432,  3433,
+		3434,  3435,  3436,  3437,  3438,  3439,  3440,  3441,
+		3442,  3443,  3444,  3445,  3446,  3447,  3448,  3449,
+		3450,  3451,  3452,  3453,  3454,  3455,  3456,  3457,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 3458,
+		3459,  3460,  3461,  3462,  -8139, 3464,  32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 3465,  3466,  2001,  3468,  3469,  32767,
+		32767, 32767, 32767, 32767, 3470,  3471,  3472,  3473,
+		3474,  3475,  3476,  3477,  3478,  3479,  3480,  3481,
+		3482,  3483,  3484,  3485,  3486,  3487,  3488,  3489,
+		3490,  3491,  3492,  3493,  3494,  3495,  32767, 3496,
+		3497,  3498,  3499,  3500,  32767, 3501,  32767, 3502,
+		3503,  32767, 3504,  3505,  32767, 3506,  0,     0,
+		3509,  3510,  3511,  3512,  3513,  3514,  3515,  3516,
+		3517,  3518,  3519,  3520,  3521,  3522,  3523,  3524,
+		3525,  3526,  3527,  3528,  3529,  3530,  3531,  3532,
+		3533,  3534,  3535,  3536,  3537,  3538,  3539,  3540,
+		3541,  3542,  3543,  3544,  3545,  1902,  1902,  1902,
+		1902,  9314,  1902,  1902,  1902,  1902,  1902,  1902,
+		1902,  1902,  1902,  1902,  1902,  1902,  7644,  7645,
+		7646,  7647,  7648,  7649,  7650,  7651,  7652,  7653,
+		7654,  7655,  7656,  7657,  7658,  7659,  42,    42,
+		1902,  0,     0,     0,     7067,  7068,  7069,  7070,
+		7071,  7116,  7117,  7118,  7119,  -292,  7121,  7122,
+		7123,  7124,  0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     3614,  3615,  3616,  10892, 3618,  3619,
+		10854, 3621,  3622,  3623,  3624,  3625,  8994,  -2751,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     3640,  3641,  2783,  -3331,
+		-3330, 3645,  3646,  0,     6053,  6054,  0,     6056,
+		6057,  6058,  6059,  3767,  6061,  6858,  0,     0,
+		3659,  0,     0,     1531,  1531,  1531,  1531,  1531,
+		1531,  1531,  1531,  1531,  1531,  1531,  1531,  1531,
+		1531,  1531,  9149,  9150,  7291,  7292,  7293,  7294,
+		7295,  1032,  7297,  7298,  7299,  7300,  7301,  7302,
+		7303,  7304,  0,     7307,  10710, 10711, 1955,  1955,
+		10759, 10760, 10716, 4548,  4549,  4550,  1952,  1952,
+		10764, 10765, 10721, 10722, 3711,  6314,  10679, 10726,
+		10727, 10728, 10729, 10730, 3719,  3720,  1996,  1996,
+		1996,  1996,  4428,  4473,  4473,  3728,  1994,  1994,
+		-11266,3732,  3733,  3734,  0,     0,     0,     0,
+		0,     0,     0,     3742,  10755, 10756, 1953,  1953,
+		1998,  1998,  1998,  11730, 11731, 12711, 9397,  3867,
+		11735, 3869,  6139,  9874,  9875,  9876,  9877,  9878,
+		9879,  9880,  6139,  -873,  -873,  7931,  -1839, -1839,
+		7891,  7892,  -1839, -1839, -2818, 497,   6028,  -1839,
+		-1839, -66,   -66,   -66,   -66,   2522,  2523,  -6280,
+		-6280, -6235, -66,   -66,   -66,   2533,  2534,  -6277,
+		-66,   -6231, -6231, 781,   -1821, -6185, -6231, 3867,
+		-1821, -6231, -1821, 782,   3076,  3873,  2511,  -8720,
+		84,    85,    41,    42,    43,    -9688, -9688, -10667,
+		-7352, -1821, -9688, -1821, -4090, -7824, -7824, -7824,
+		-7824, -7824, -7824, -7824, -4082, 2931,  2932,  -5871,
+		3900,  3901,  -5828, -5828, 3904,  3905,  4885,  1571,
+		-3959, 3909,  3910,  2138,  2139,  2140,  2141,  -446,
+		-446,  8358,  8359,  8315,  2147,  2148,  2149,  -449,
+		-449,  8363,  2153,  8319,  8320,  1309,  3912,  8277,
+		8324,  -1773, 3916,  8327,  3918,  1316,  -977,  -1773,
+		-410,  10822, 2019,  2019,  2064,  2064,  2064,  11796,
+		11797, 12777, 9463,  3933,  11801, 3935,  6205,  9940,
+		9941,  9942,  9943,  9944,  9945,  9946,  6205,  -807,
+		-807,  7997,  -1773, -1773, 7957,  7958,  -1773, -1773,
+		-2752, 563,   6094,  -1773, -1773, 0,     0,     0,
+		0,     2588,  2589,  -6214, -6214, -6169, 0,     0,
+		0,     2599,  2600,  -6211, 0,     -6165, -6165, 847,
+		-1755, -6119, -6165, 3933,  -1755, -6165, -1755, 848,
+		3142,  3939,  2577,  -8654, 150,   151,   107,   108,
+		109,   -9622, -9622, -10601,-7286, -1755, -9622, -1755,
+		-4024, -7758, -7758, -7758, -7758, -7758, -7758, -7758,
+		-4016, 2997,  2998,  -5805, 3966,  3967,  -5762, -5762,
+		3970,  3971,  4951,  1637,  -3893, 3975,  3976,  2204,
+		2205,  2206,  2207,  -380,  -380,  8424,  8425,  8381,
+		2213,  2214,  2215,  -383,  -383,  8429,  2219,  8385,
+		8386,  1375,  3978,  8343,  8390,  -1707, 3982,  8393,
+		3984,  1382,  -911,  -1707, -344,  10888, 2085,  2085,
+		2130,  2130,  2130,  11862, 11863, 12843, 9529,  3999,
+		11867, 4001,  6271,  10006, 10007, 4005,  -1951, 4007,
+		4008,  4009,  4010,  4011,  4012,  4013,  4014,  4015,
+		4016,  4017,  4018,  4019,  4020,  4021,  4022,  4023,
+		4024,  4025,  4026,  4027,  4028,  4029,  4030,  4031,
+		11943, 4033,  4034,  4035,  4036,  8637,  4038,  4039,
+		-116,  32767, 32767, 4041,  4042,  4043,  4044,  4045,
+		2250,  4047,  4048,  4049,  5802,  4051,  4052,  4559,
+		6119,  4055,  4056,  4057,  4058,  4059,  4060,  4061,
+		-47,   4063,  -46,   4065,  4066,  4067,  4068,  4069,
+		-41,   -13301,4072,  -9985, -6670, 4075,  4076,  4077,
+		4078,  4079,  4080,  4081,  4082,  4083,  4084,  4085,
+		4086,  4087,  4088,  4089,  4090,  8741,  4092,  4093,
+		-67,   32767, 32767, 32767, 32767, 32767, 2257,  32767,
+		2258,  2259,  2260,  32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
+		32767, 32767, 32767, 32767, 2261,  32767, 2262,  32767,
+		2263,  32767, 2264,  32767, 2265,  32767, 2266,  32767,
+		2267,  8737,  8738,  -26,   -26,   8786,  4100,  4101,
+		8746,  8747,  4104,  4105,  8752,  8753,  32767, 2274,
+		32767, 2275,  32767, 32767, 32767, 32767, 32767, 32767,
+		2276,  2277,  32767, 2278,  2279,  32767, 2280,  0,
+		32767, 2282,  9695,  4109,  -3486, -3486, 4112,  4113,
+		4114,  4115,  4116,  4117,  32767, 32767, 32767, 32767,
+		32767, 32767, 4118,  4119,  4120,  4121,  4122,  4123,
+		4124,  4125,  4126,  4127,  4128,  4129,  4130,  4131,
+		4132,  4133,  4134,  4849,  4136,  4137,  4851,  4851,
+		4140,  4852,  4142,  4143,  4144,  4145,  4146,  4147,
+		4148,  4149,  4150,  4151,  2293,  4153,  907,   32767,
+		2295,  4155,  909,   4157,  910,   4159,  911,   4161,
+		912,   4163,  913,   4165,  914,   32767, 915,   4168,
+		916,   4170,  917,   4172,  4173,  918,   4175,  4176,
+		4177,  4178,  4179,  4180,  4181,  4182,  4183,  4184,
+		4185,  2309,  4186,  4187,  4188,  4189,  2312,  2313,
+		32767, 2314,  4190,  4191,  -2632, 2317,  4193,  32767,
+		4194,  4195,  4196,  4197,  4198,  4199,  4200,  4201,
+		4202,  4203,  4204,  4205,  4206,  0,     0,     4209,
+		4210,  4211,  4212,  4213,  2318,  4215,  4216,  2319,
+		2320,  2321,  2322,  4221,  4222,  4223,  2323,  2324,
+		4226,  4227,  4228,  4229,  4230,  4231,  5551,  4233,
+		4234,  4235,  4236,  4237,  4238,  4239,  4240,  4241,
+		4242,  4243,  4244,  4245,  4246,  4247,  4248,  4249,
+		4250,  4251,  4252,  4253,  4254,  4255,  4256,  4257,
+		4258,  4259,  4260,  4261,  4262,  4263,  4264,  4265,
+		4266,  4267,  4268,  4269,  4270,  4271,  4272,  4273,
+		4274,  4275,  -3342, -3342, -3342, 4276,  4277,  2418,
+		2419,  -2784, -2784, -2740, -2740, -2740, -2740, -2740,
+		-2784, -2784, -2784, -2784, 4628,  -2784, -2784, -2784,
+		-2784, -2784, -2784, -2784, -2784, -2784, -2784, -2784,
+		-2784, 2958,  2959,  2960,  2961,  2962,  2963,  2964,
+		2965,  2966,  2967,  2968,  2969,  2970,  2971,  2972,
+		2973,  -4644, -4644, -2784, -2784, 2420,  2421,  2378,
+		2379,  2380,  2381,  2382,  2427,  2428,  2429,  2430,
+		-4981, 2432,  2433,  2434,  2435,  2436,  2437,  2438,
+		2439,  2440,  2441,  2442,  2443,  -3298, -3298, -3298,
+		-3298, -3298, -3298, -3298, -3298, -3298, -3298, -3298,
+		-3298, -3298, -3298, -3298, -3298, 4320,  4321,  2462,
+		4365,  4366,  4367,  -2699, -2699, -2699, -2699, -2699,
+		-2743, -2743, -2743, -2743, 4669,  -2743, -2743, -2743,
+		-2743, 4382,  4383,  4384,  4385,  4386,  4387,  4388,
+		4389,  4390,  4391,  4392,  4393,  4394,  4395,  4396,
+		4397,  4398,  4399,  4400,  4401,  4402,  4403,  4404,
+		4405,  4406,  4407,  4408,  4409,  4410,  4411,  4412,
+		4413,  4414,  4415,  4416,  4417,  4418,  4419,  4420,
+		4421,  4422,  4423,  4424,  4425,  4426,  4427,  4428,
+		4429,  816,   816,   816,   -6459, 816,   816,   -6418,
+		816,   816,   816,   816,   816,   -4552, 7194,  4444,
+		4445,  4446,  4447,  4448,  4449,  4450,  4451,  4452,
+		4453,  4454,  4455,  816,   816,   1675,  7790,  7790,
+		816,   816,   4463,  -1589, -1589, 4466,  -1589, -1589,
+		-1589, -1589, 704,   -1589, -2385, 4474,  4475,  817,
+		4477,  4478,  2948,  2949,  2950,  2951,  2952,  2953,
+		2954,  2955,  2956,  2957,  2958,  2959,  2960,  2961,
+		2962,  -4655, -4655, -2795, -2795, -2795, -2795, -2795,
+		3469,  -2795, -2795, -2795, -2795, -2795, -2795, -2795,
+		-2795, 4510,  -2796, -6198, -6198, 2559,  2560,  -6243,
+		-6243, -6198, -6198, -6198, -6198, 2567,  2568,  -6243,
+		-6243, -6198, -6198, -6198, -6154, -6154, -6200, -6200,
+		-6200, -6200, -6200, -6200, -6200, 2535,  2536,  2537,
+		2538,  107,   63,    2541,  2542,  2543,  2544,  15805,
+		12491, 12492, 32767, 4540,  4541,  4542,  4543,  4544,
+		4545,  4546,  2548,  -6208, -6208, 2596,  2597,  2553,
+		2554,  2555,  2556,  -6208, -6208, 2604,  2605,  2561,
+		2562,  2563,  2520,  2521,  2568,  2569,  2570,  2571,
+		2572,  2573,  2574,  -6160, -6160, -6160, -6160, -3728,
+		-3683, -6160, -6160, -6160, -6160, -19420,-16105,-16105,
+		-12790,-12790,-9475, -9475, -6160, -6160, -6160, -6160,
+		-6160, 32767, 2597,  -6206, -6206, -6161, -6161, -6161,
+		-6161, 2604,  2605,  -6206, -6206, -6161, -6161, -6161,
+		-6161, -6161, -6161, -6161, -6161, -6161, -6161, -6161,
+		-6161, 2574,  2575,  2576,  2577,  146,   102,   2580,
+		2581,  2582,  2583,  15844, 12530, 12531, 9217,  9218,
+		5904,  5905,  2591,  2592,  2593,  2594,  2595,  -6161,
+		-6161, 2643,  2644,  2600,  2601,  2602,  2603,  -6161,
+		-6161, 2651,  2652,  2608,  2609,  2610,  2611,  2612,
+		2613,  2614,  2615,  2616,  2617,  2618,  2619,  -6115,
+		-6115, -6115, -6115, -3683, -3638, -6115, -6115, -6115,
+		-6115, -19375,-16060,-16060,-12745,-12745,-9430, -9430,
+		-6115, -6115, -6115, -6115, -6115, 2642,  2643,  -6160,
+		-6160, -6115, -6115, -6115, -6115, 2650,  2651,  -6160,
+		-6160, -6115, -3460, -3459, -3458, -3457, -1026, -3455,
+		-3454, -6160, -3452, -6160, -12117,-6160, -12117,-6160,
+		-2848, -2848, -2848, 6893,  891,   -5065, -2846, -6160,
+		-2845, -1264, 0,     9264,  5950,  5951,  2637,  2638,
+		2639,  2640,  2641,  -6115, -6115, 2689,  2690,  2646,
+		2647,  2648,  2649,  -6115, -6115, 2697,  2698,  2654,
+		0,     0,     0,     0,     -2430, 0,     0,     2707,
+		0,     2709,  8667,  2711,  8669,  2713,  -598,  -597,
+		-596,  -10336,-4333, 1624,  -594,  2721,  -593,  -2173,
+		2724,  -592,  -591,  -590,  -589,  -588,  -587,  -586,
+		12,    -584,  -583,  2735,  -582,  2737,  -581,  2739,
+		2740,  -580,  -6115, -6115, -6115, 2745,  2746,  -6115,
+		-6115, 0,     0,     0,     2752,  2753,  2754,  0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0,     0,     0,     0,     6247,  6248,  0,     0,
+		0,     0,     0,     0,     0,     0,     0,     0,
+		0
+	};
+
+	const unsigned char *k = (const unsigned char *) key;
+	size_t		keylen = 4;
+	uint32		a = 0;
+	uint32		b = 1;
+
+	while (keylen--)
+	{
+		unsigned char c = *k++;
+
+		a = a * 257 + c;
+		b = b * 8191 + c;
+	}
+	return h[a % 13209] + h[b % 13209];
+}
+
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo =
+{
+	UnicodeDecompMain,
+	Decomp_hash_func,
+	6604
+};
+
+/* Inverse lookup array -- contains indexes into UnicodeDecompMain[] */
+static const uint16 RecompInverseLookup[941] =
+{
+	/* U+003C+0338 -> U+226E */ 1823,
+	/* U+003D+0338 -> U+2260 */ 1820,
+	/* U+003E+0338 -> U+226F */ 1824,
+	/* U+0041+0300 -> U+00C0 */ 14,
+	/* U+0041+0301 -> U+00C1 */ 15,
+	/* U+0041+0302 -> U+00C2 */ 16,
+	/* U+0041+0303 -> U+00C3 */ 17,
+	/* U+0041+0304 -> U+0100 */ 67,
+	/* U+0041+0306 -> U+0102 */ 69,
+	/* U+0041+0307 -> U+0226 */ 270,
+	/* U+0041+0308 -> U+00C4 */ 18,
+	/* U+0041+0309 -> U+1EA2 */ 1278,
+	/* U+0041+030A -> U+00C5 */ 19,
+	/* U+0041+030C -> U+01CD */ 194,
+	/* U+0041+030F -> U+0200 */ 240,
+	/* U+0041+0311 -> U+0202 */ 242,
+	/* U+0041+0323 -> U+1EA0 */ 1276,
+	/* U+0041+0325 -> U+1E00 */ 1120,
+	/* U+0041+0328 -> U+0104 */ 71,
+	/* U+0042+0307 -> U+1E02 */ 1122,
+	/* U+0042+0323 -> U+1E04 */ 1124,
+	/* U+0042+0331 -> U+1E06 */ 1126,
+	/* U+0043+0301 -> U+0106 */ 73,
+	/* U+0043+0302 -> U+0108 */ 75,
+	/* U+0043+0307 -> U+010A */ 77,
+	/* U+0043+030C -> U+010C */ 79,
+	/* U+0043+0327 -> U+00C7 */ 20,
+	/* U+0044+0307 -> U+1E0A */ 1130,
+	/* U+0044+030C -> U+010E */ 81,
+	/* U+0044+0323 -> U+1E0C */ 1132,
+	/* U+0044+0327 -> U+1E10 */ 1136,
+	/* U+0044+032D -> U+1E12 */ 1138,
+	/* U+0044+0331 -> U+1E0E */ 1134,
+	/* U+0045+0300 -> U+00C8 */ 21,
+	/* U+0045+0301 -> U+00C9 */ 22,
+	/* U+0045+0302 -> U+00CA */ 23,
+	/* U+0045+0303 -> U+1EBC */ 1304,
+	/* U+0045+0304 -> U+0112 */ 83,
+	/* U+0045+0306 -> U+0114 */ 85,
+	/* U+0045+0307 -> U+0116 */ 87,
+	/* U+0045+0308 -> U+00CB */ 24,
+	/* U+0045+0309 -> U+1EBA */ 1302,
+	/* U+0045+030C -> U+011A */ 91,
+	/* U+0045+030F -> U+0204 */ 244,
+	/* U+0045+0311 -> U+0206 */ 246,
+	/* U+0045+0323 -> U+1EB8 */ 1300,
+	/* U+0045+0327 -> U+0228 */ 272,
+	/* U+0045+0328 -> U+0118 */ 89,
+	/* U+0045+032D -> U+1E18 */ 1144,
+	/* U+0045+0330 -> U+1E1A */ 1146,
+	/* U+0046+0307 -> U+1E1E */ 1150,
+	/* U+0047+0301 -> U+01F4 */ 230,
+	/* U+0047+0302 -> U+011C */ 93,
+	/* U+0047+0304 -> U+1E20 */ 1152,
+	/* U+0047+0306 -> U+011E */ 95,
+	/* U+0047+0307 -> U+0120 */ 97,
+	/* U+0047+030C -> U+01E6 */ 216,
+	/* U+0047+0327 -> U+0122 */ 99,
+	/* U+0048+0302 -> U+0124 */ 101,
+	/* U+0048+0307 -> U+1E22 */ 1154,
+	/* U+0048+0308 -> U+1E26 */ 1158,
+	/* U+0048+030C -> U+021E */ 268,
+	/* U+0048+0323 -> U+1E24 */ 1156,
+	/* U+0048+0327 -> U+1E28 */ 1160,
+	/* U+0048+032E -> U+1E2A */ 1162,
+	/* U+0049+0300 -> U+00CC */ 25,
+	/* U+0049+0301 -> U+00CD */ 26,
+	/* U+0049+0302 -> U+00CE */ 27,
+	/* U+0049+0303 -> U+0128 */ 103,
+	/* U+0049+0304 -> U+012A */ 105,
+	/* U+0049+0306 -> U+012C */ 107,
+	/* U+0049+0307 -> U+0130 */ 111,
+	/* U+0049+0308 -> U+00CF */ 28,
+	/* U+0049+0309 -> U+1EC8 */ 1316,
+	/* U+0049+030C -> U+01CF */ 196,
+	/* U+0049+030F -> U+0208 */ 248,
+	/* U+0049+0311 -> U+020A */ 250,
+	/* U+0049+0323 -> U+1ECA */ 1318,
+	/* U+0049+0328 -> U+012E */ 109,
+	/* U+0049+0330 -> U+1E2C */ 1164,
+	/* U+004A+0302 -> U+0134 */ 114,
+	/* U+004B+0301 -> U+1E30 */ 1168,
+	/* U+004B+030C -> U+01E8 */ 218,
+	/* U+004B+0323 -> U+1E32 */ 1170,
+	/* U+004B+0327 -> U+0136 */ 116,
+	/* U+004B+0331 -> U+1E34 */ 1172,
+	/* U+004C+0301 -> U+0139 */ 118,
+	/* U+004C+030C -> U+013D */ 122,
+	/* U+004C+0323 -> U+1E36 */ 1174,
+	/* U+004C+0327 -> U+013B */ 120,
+	/* U+004C+032D -> U+1E3C */ 1180,
+	/* U+004C+0331 -> U+1E3A */ 1178,
+	/* U+004D+0301 -> U+1E3E */ 1182,
+	/* U+004D+0307 -> U+1E40 */ 1184,
+	/* U+004D+0323 -> U+1E42 */ 1186,
+	/* U+004E+0300 -> U+01F8 */ 232,
+	/* U+004E+0301 -> U+0143 */ 126,
+	/* U+004E+0303 -> U+00D1 */ 29,
+	/* U+004E+0307 -> U+1E44 */ 1188,
+	/* U+004E+030C -> U+0147 */ 130,
+	/* U+004E+0323 -> U+1E46 */ 1190,
+	/* U+004E+0327 -> U+0145 */ 128,
+	/* U+004E+032D -> U+1E4A */ 1194,
+	/* U+004E+0331 -> U+1E48 */ 1192,
+	/* U+004F+0300 -> U+00D2 */ 30,
+	/* U+004F+0301 -> U+00D3 */ 31,
+	/* U+004F+0302 -> U+00D4 */ 32,
+	/* U+004F+0303 -> U+00D5 */ 33,
+	/* U+004F+0304 -> U+014C */ 133,
+	/* U+004F+0306 -> U+014E */ 135,
+	/* U+004F+0307 -> U+022E */ 278,
+	/* U+004F+0308 -> U+00D6 */ 34,
+	/* U+004F+0309 -> U+1ECE */ 1322,
+	/* U+004F+030B -> U+0150 */ 137,
+	/* U+004F+030C -> U+01D1 */ 198,
+	/* U+004F+030F -> U+020C */ 252,
+	/* U+004F+0311 -> U+020E */ 254,
+	/* U+004F+031B -> U+01A0 */ 181,
+	/* U+004F+0323 -> U+1ECC */ 1320,
+	/* U+004F+0328 -> U+01EA */ 220,
+	/* U+0050+0301 -> U+1E54 */ 1204,
+	/* U+0050+0307 -> U+1E56 */ 1206,
+	/* U+0052+0301 -> U+0154 */ 139,
+	/* U+0052+0307 -> U+1E58 */ 1208,
+	/* U+0052+030C -> U+0158 */ 143,
+	/* U+0052+030F -> U+0210 */ 256,
+	/* U+0052+0311 -> U+0212 */ 258,
+	/* U+0052+0323 -> U+1E5A */ 1210,
+	/* U+0052+0327 -> U+0156 */ 141,
+	/* U+0052+0331 -> U+1E5E */ 1214,
+	/* U+0053+0301 -> U+015A */ 145,
+	/* U+0053+0302 -> U+015C */ 147,
+	/* U+0053+0307 -> U+1E60 */ 1216,
+	/* U+0053+030C -> U+0160 */ 151,
+	/* U+0053+0323 -> U+1E62 */ 1218,
+	/* U+0053+0326 -> U+0218 */ 264,
+	/* U+0053+0327 -> U+015E */ 149,
+	/* U+0054+0307 -> U+1E6A */ 1226,
+	/* U+0054+030C -> U+0164 */ 155,
+	/* U+0054+0323 -> U+1E6C */ 1228,
+	/* U+0054+0326 -> U+021A */ 266,
+	/* U+0054+0327 -> U+0162 */ 153,
+	/* U+0054+032D -> U+1E70 */ 1232,
+	/* U+0054+0331 -> U+1E6E */ 1230,
+	/* U+0055+0300 -> U+00D9 */ 35,
+	/* U+0055+0301 -> U+00DA */ 36,
+	/* U+0055+0302 -> U+00DB */ 37,
+	/* U+0055+0303 -> U+0168 */ 157,
+	/* U+0055+0304 -> U+016A */ 159,
+	/* U+0055+0306 -> U+016C */ 161,
+	/* U+0055+0308 -> U+00DC */ 38,
+	/* U+0055+0309 -> U+1EE6 */ 1346,
+	/* U+0055+030A -> U+016E */ 163,
+	/* U+0055+030B -> U+0170 */ 165,
+	/* U+0055+030C -> U+01D3 */ 200,
+	/* U+0055+030F -> U+0214 */ 260,
+	/* U+0055+0311 -> U+0216 */ 262,
+	/* U+0055+031B -> U+01AF */ 183,
+	/* U+0055+0323 -> U+1EE4 */ 1344,
+	/* U+0055+0324 -> U+1E72 */ 1234,
+	/* U+0055+0328 -> U+0172 */ 167,
+	/* U+0055+032D -> U+1E76 */ 1238,
+	/* U+0055+0330 -> U+1E74 */ 1236,
+	/* U+0056+0303 -> U+1E7C */ 1244,
+	/* U+0056+0323 -> U+1E7E */ 1246,
+	/* U+0057+0300 -> U+1E80 */ 1248,
+	/* U+0057+0301 -> U+1E82 */ 1250,
+	/* U+0057+0302 -> U+0174 */ 169,
+	/* U+0057+0307 -> U+1E86 */ 1254,
+	/* U+0057+0308 -> U+1E84 */ 1252,
+	/* U+0057+0323 -> U+1E88 */ 1256,
+	/* U+0058+0307 -> U+1E8A */ 1258,
+	/* U+0058+0308 -> U+1E8C */ 1260,
+	/* U+0059+0300 -> U+1EF2 */ 1358,
+	/* U+0059+0301 -> U+00DD */ 39,
+	/* U+0059+0302 -> U+0176 */ 171,
+	/* U+0059+0303 -> U+1EF8 */ 1364,
+	/* U+0059+0304 -> U+0232 */ 282,
+	/* U+0059+0307 -> U+1E8E */ 1262,
+	/* U+0059+0308 -> U+0178 */ 173,
+	/* U+0059+0309 -> U+1EF6 */ 1362,
+	/* U+0059+0323 -> U+1EF4 */ 1360,
+	/* U+005A+0301 -> U+0179 */ 174,
+	/* U+005A+0302 -> U+1E90 */ 1264,
+	/* U+005A+0307 -> U+017B */ 176,
+	/* U+005A+030C -> U+017D */ 178,
+	/* U+005A+0323 -> U+1E92 */ 1266,
+	/* U+005A+0331 -> U+1E94 */ 1268,
+	/* U+0061+0300 -> U+00E0 */ 40,
+	/* U+0061+0301 -> U+00E1 */ 41,
+	/* U+0061+0302 -> U+00E2 */ 42,
+	/* U+0061+0303 -> U+00E3 */ 43,
+	/* U+0061+0304 -> U+0101 */ 68,
+	/* U+0061+0306 -> U+0103 */ 70,
+	/* U+0061+0307 -> U+0227 */ 271,
+	/* U+0061+0308 -> U+00E4 */ 44,
+	/* U+0061+0309 -> U+1EA3 */ 1279,
+	/* U+0061+030A -> U+00E5 */ 45,
+	/* U+0061+030C -> U+01CE */ 195,
+	/* U+0061+030F -> U+0201 */ 241,
+	/* U+0061+0311 -> U+0203 */ 243,
+	/* U+0061+0323 -> U+1EA1 */ 1277,
+	/* U+0061+0325 -> U+1E01 */ 1121,
+	/* U+0061+0328 -> U+0105 */ 72,
+	/* U+0062+0307 -> U+1E03 */ 1123,
+	/* U+0062+0323 -> U+1E05 */ 1125,
+	/* U+0062+0331 -> U+1E07 */ 1127,
+	/* U+0063+0301 -> U+0107 */ 74,
+	/* U+0063+0302 -> U+0109 */ 76,
+	/* U+0063+0307 -> U+010B */ 78,
+	/* U+0063+030C -> U+010D */ 80,
+	/* U+0063+0327 -> U+00E7 */ 46,
+	/* U+0064+0307 -> U+1E0B */ 1131,
+	/* U+0064+030C -> U+010F */ 82,
+	/* U+0064+0323 -> U+1E0D */ 1133,
+	/* U+0064+0327 -> U+1E11 */ 1137,
+	/* U+0064+032D -> U+1E13 */ 1139,
+	/* U+0064+0331 -> U+1E0F */ 1135,
+	/* U+0065+0300 -> U+00E8 */ 47,
+	/* U+0065+0301 -> U+00E9 */ 48,
+	/* U+0065+0302 -> U+00EA */ 49,
+	/* U+0065+0303 -> U+1EBD */ 1305,
+	/* U+0065+0304 -> U+0113 */ 84,
+	/* U+0065+0306 -> U+0115 */ 86,
+	/* U+0065+0307 -> U+0117 */ 88,
+	/* U+0065+0308 -> U+00EB */ 50,
+	/* U+0065+0309 -> U+1EBB */ 1303,
+	/* U+0065+030C -> U+011B */ 92,
+	/* U+0065+030F -> U+0205 */ 245,
+	/* U+0065+0311 -> U+0207 */ 247,
+	/* U+0065+0323 -> U+1EB9 */ 1301,
+	/* U+0065+0327 -> U+0229 */ 273,
+	/* U+0065+0328 -> U+0119 */ 90,
+	/* U+0065+032D -> U+1E19 */ 1145,
+	/* U+0065+0330 -> U+1E1B */ 1147,
+	/* U+0066+0307 -> U+1E1F */ 1151,
+	/* U+0067+0301 -> U+01F5 */ 231,
+	/* U+0067+0302 -> U+011D */ 94,
+	/* U+0067+0304 -> U+1E21 */ 1153,
+	/* U+0067+0306 -> U+011F */ 96,
+	/* U+0067+0307 -> U+0121 */ 98,
+	/* U+0067+030C -> U+01E7 */ 217,
+	/* U+0067+0327 -> U+0123 */ 100,
+	/* U+0068+0302 -> U+0125 */ 102,
+	/* U+0068+0307 -> U+1E23 */ 1155,
+	/* U+0068+0308 -> U+1E27 */ 1159,
+	/* U+0068+030C -> U+021F */ 269,
+	/* U+0068+0323 -> U+1E25 */ 1157,
+	/* U+0068+0327 -> U+1E29 */ 1161,
+	/* U+0068+032E -> U+1E2B */ 1163,
+	/* U+0068+0331 -> U+1E96 */ 1270,
+	/* U+0069+0300 -> U+00EC */ 51,
+	/* U+0069+0301 -> U+00ED */ 52,
+	/* U+0069+0302 -> U+00EE */ 53,
+	/* U+0069+0303 -> U+0129 */ 104,
+	/* U+0069+0304 -> U+012B */ 106,
+	/* U+0069+0306 -> U+012D */ 108,
+	/* U+0069+0308 -> U+00EF */ 54,
+	/* U+0069+0309 -> U+1EC9 */ 1317,
+	/* U+0069+030C -> U+01D0 */ 197,
+	/* U+0069+030F -> U+0209 */ 249,
+	/* U+0069+0311 -> U+020B */ 251,
+	/* U+0069+0323 -> U+1ECB */ 1319,
+	/* U+0069+0328 -> U+012F */ 110,
+	/* U+0069+0330 -> U+1E2D */ 1165,
+	/* U+006A+0302 -> U+0135 */ 115,
+	/* U+006A+030C -> U+01F0 */ 226,
+	/* U+006B+0301 -> U+1E31 */ 1169,
+	/* U+006B+030C -> U+01E9 */ 219,
+	/* U+006B+0323 -> U+1E33 */ 1171,
+	/* U+006B+0327 -> U+0137 */ 117,
+	/* U+006B+0331 -> U+1E35 */ 1173,
+	/* U+006C+0301 -> U+013A */ 119,
+	/* U+006C+030C -> U+013E */ 123,
+	/* U+006C+0323 -> U+1E37 */ 1175,
+	/* U+006C+0327 -> U+013C */ 121,
+	/* U+006C+032D -> U+1E3D */ 1181,
+	/* U+006C+0331 -> U+1E3B */ 1179,
+	/* U+006D+0301 -> U+1E3F */ 1183,
+	/* U+006D+0307 -> U+1E41 */ 1185,
+	/* U+006D+0323 -> U+1E43 */ 1187,
+	/* U+006E+0300 -> U+01F9 */ 233,
+	/* U+006E+0301 -> U+0144 */ 127,
+	/* U+006E+0303 -> U+00F1 */ 55,
+	/* U+006E+0307 -> U+1E45 */ 1189,
+	/* U+006E+030C -> U+0148 */ 131,
+	/* U+006E+0323 -> U+1E47 */ 1191,
+	/* U+006E+0327 -> U+0146 */ 129,
+	/* U+006E+032D -> U+1E4B */ 1195,
+	/* U+006E+0331 -> U+1E49 */ 1193,
+	/* U+006F+0300 -> U+00F2 */ 56,
+	/* U+006F+0301 -> U+00F3 */ 57,
+	/* U+006F+0302 -> U+00F4 */ 58,
+	/* U+006F+0303 -> U+00F5 */ 59,
+	/* U+006F+0304 -> U+014D */ 134,
+	/* U+006F+0306 -> U+014F */ 136,
+	/* U+006F+0307 -> U+022F */ 279,
+	/* U+006F+0308 -> U+00F6 */ 60,
+	/* U+006F+0309 -> U+1ECF */ 1323,
+	/* U+006F+030B -> U+0151 */ 138,
+	/* U+006F+030C -> U+01D2 */ 199,
+	/* U+006F+030F -> U+020D */ 253,
+	/* U+006F+0311 -> U+020F */ 255,
+	/* U+006F+031B -> U+01A1 */ 182,
+	/* U+006F+0323 -> U+1ECD */ 1321,
+	/* U+006F+0328 -> U+01EB */ 221,
+	/* U+0070+0301 -> U+1E55 */ 1205,
+	/* U+0070+0307 -> U+1E57 */ 1207,
+	/* U+0072+0301 -> U+0155 */ 140,
+	/* U+0072+0307 -> U+1E59 */ 1209,
+	/* U+0072+030C -> U+0159 */ 144,
+	/* U+0072+030F -> U+0211 */ 257,
+	/* U+0072+0311 -> U+0213 */ 259,
+	/* U+0072+0323 -> U+1E5B */ 1211,
+	/* U+0072+0327 -> U+0157 */ 142,
+	/* U+0072+0331 -> U+1E5F */ 1215,
+	/* U+0073+0301 -> U+015B */ 146,
+	/* U+0073+0302 -> U+015D */ 148,
+	/* U+0073+0307 -> U+1E61 */ 1217,
+	/* U+0073+030C -> U+0161 */ 152,
+	/* U+0073+0323 -> U+1E63 */ 1219,
+	/* U+0073+0326 -> U+0219 */ 265,
+	/* U+0073+0327 -> U+015F */ 150,
+	/* U+0074+0307 -> U+1E6B */ 1227,
+	/* U+0074+0308 -> U+1E97 */ 1271,
+	/* U+0074+030C -> U+0165 */ 156,
+	/* U+0074+0323 -> U+1E6D */ 1229,
+	/* U+0074+0326 -> U+021B */ 267,
+	/* U+0074+0327 -> U+0163 */ 154,
+	/* U+0074+032D -> U+1E71 */ 1233,
+	/* U+0074+0331 -> U+1E6F */ 1231,
+	/* U+0075+0300 -> U+00F9 */ 61,
+	/* U+0075+0301 -> U+00FA */ 62,
+	/* U+0075+0302 -> U+00FB */ 63,
+	/* U+0075+0303 -> U+0169 */ 158,
+	/* U+0075+0304 -> U+016B */ 160,
+	/* U+0075+0306 -> U+016D */ 162,
+	/* U+0075+0308 -> U+00FC */ 64,
+	/* U+0075+0309 -> U+1EE7 */ 1347,
+	/* U+0075+030A -> U+016F */ 164,
+	/* U+0075+030B -> U+0171 */ 166,
+	/* U+0075+030C -> U+01D4 */ 201,
+	/* U+0075+030F -> U+0215 */ 261,
+	/* U+0075+0311 -> U+0217 */ 263,
+	/* U+0075+031B -> U+01B0 */ 184,
+	/* U+0075+0323 -> U+1EE5 */ 1345,
+	/* U+0075+0324 -> U+1E73 */ 1235,
+	/* U+0075+0328 -> U+0173 */ 168,
+	/* U+0075+032D -> U+1E77 */ 1239,
+	/* U+0075+0330 -> U+1E75 */ 1237,
+	/* U+0076+0303 -> U+1E7D */ 1245,
+	/* U+0076+0323 -> U+1E7F */ 1247,
+	/* U+0077+0300 -> U+1E81 */ 1249,
+	/* U+0077+0301 -> U+1E83 */ 1251,
+	/* U+0077+0302 -> U+0175 */ 170,
+	/* U+0077+0307 -> U+1E87 */ 1255,
+	/* U+0077+0308 -> U+1E85 */ 1253,
+	/* U+0077+030A -> U+1E98 */ 1272,
+	/* U+0077+0323 -> U+1E89 */ 1257,
+	/* U+0078+0307 -> U+1E8B */ 1259,
+	/* U+0078+0308 -> U+1E8D */ 1261,
+	/* U+0079+0300 -> U+1EF3 */ 1359,
+	/* U+0079+0301 -> U+00FD */ 65,
+	/* U+0079+0302 -> U+0177 */ 172,
+	/* U+0079+0303 -> U+1EF9 */ 1365,
+	/* U+0079+0304 -> U+0233 */ 283,
+	/* U+0079+0307 -> U+1E8F */ 1263,
+	/* U+0079+0308 -> U+00FF */ 66,
+	/* U+0079+0309 -> U+1EF7 */ 1363,
+	/* U+0079+030A -> U+1E99 */ 1273,
+	/* U+0079+0323 -> U+1EF5 */ 1361,
+	/* U+007A+0301 -> U+017A */ 175,
+	/* U+007A+0302 -> U+1E91 */ 1265,
+	/* U+007A+0307 -> U+017C */ 177,
+	/* U+007A+030C -> U+017E */ 179,
+	/* U+007A+0323 -> U+1E93 */ 1267,
+	/* U+007A+0331 -> U+1E95 */ 1269,
+	/* U+00A8+0300 -> U+1FED */ 1584,
+	/* U+00A8+0301 -> U+0385 */ 419,
+	/* U+00A8+0342 -> U+1FC1 */ 1544,
+	/* U+00C2+0300 -> U+1EA6 */ 1282,
+	/* U+00C2+0301 -> U+1EA4 */ 1280,
+	/* U+00C2+0303 -> U+1EAA */ 1286,
+	/* U+00C2+0309 -> U+1EA8 */ 1284,
+	/* U+00C4+0304 -> U+01DE */ 210,
+	/* U+00C5+0301 -> U+01FA */ 234,
+	/* U+00C6+0301 -> U+01FC */ 236,
+	/* U+00C6+0304 -> U+01E2 */ 214,
+	/* U+00C7+0301 -> U+1E08 */ 1128,
+	/* U+00CA+0300 -> U+1EC0 */ 1308,
+	/* U+00CA+0301 -> U+1EBE */ 1306,
+	/* U+00CA+0303 -> U+1EC4 */ 1312,
+	/* U+00CA+0309 -> U+1EC2 */ 1310,
+	/* U+00CF+0301 -> U+1E2E */ 1166,
+	/* U+00D4+0300 -> U+1ED2 */ 1326,
+	/* U+00D4+0301 -> U+1ED0 */ 1324,
+	/* U+00D4+0303 -> U+1ED6 */ 1330,
+	/* U+00D4+0309 -> U+1ED4 */ 1328,
+	/* U+00D5+0301 -> U+1E4C */ 1196,
+	/* U+00D5+0304 -> U+022C */ 276,
+	/* U+00D5+0308 -> U+1E4E */ 1198,
+	/* U+00D6+0304 -> U+022A */ 274,
+	/* U+00D8+0301 -> U+01FE */ 238,
+	/* U+00DC+0300 -> U+01DB */ 208,
+	/* U+00DC+0301 -> U+01D7 */ 204,
+	/* U+00DC+0304 -> U+01D5 */ 202,
+	/* U+00DC+030C -> U+01D9 */ 206,
+	/* U+00E2+0300 -> U+1EA7 */ 1283,
+	/* U+00E2+0301 -> U+1EA5 */ 1281,
+	/* U+00E2+0303 -> U+1EAB */ 1287,
+	/* U+00E2+0309 -> U+1EA9 */ 1285,
+	/* U+00E4+0304 -> U+01DF */ 211,
+	/* U+00E5+0301 -> U+01FB */ 235,
+	/* U+00E6+0301 -> U+01FD */ 237,
+	/* U+00E6+0304 -> U+01E3 */ 215,
+	/* U+00E7+0301 -> U+1E09 */ 1129,
+	/* U+00EA+0300 -> U+1EC1 */ 1309,
+	/* U+00EA+0301 -> U+1EBF */ 1307,
+	/* U+00EA+0303 -> U+1EC5 */ 1313,
+	/* U+00EA+0309 -> U+1EC3 */ 1311,
+	/* U+00EF+0301 -> U+1E2F */ 1167,
+	/* U+00F4+0300 -> U+1ED3 */ 1327,
+	/* U+00F4+0301 -> U+1ED1 */ 1325,
+	/* U+00F4+0303 -> U+1ED7 */ 1331,
+	/* U+00F4+0309 -> U+1ED5 */ 1329,
+	/* U+00F5+0301 -> U+1E4D */ 1197,
+	/* U+00F5+0304 -> U+022D */ 277,
+	/* U+00F5+0308 -> U+1E4F */ 1199,
+	/* U+00F6+0304 -> U+022B */ 275,
+	/* U+00F8+0301 -> U+01FF */ 239,
+	/* U+00FC+0300 -> U+01DC */ 209,
+	/* U+00FC+0301 -> U+01D8 */ 205,
+	/* U+00FC+0304 -> U+01D6 */ 203,
+	/* U+00FC+030C -> U+01DA */ 207,
+	/* U+0102+0300 -> U+1EB0 */ 1292,
+	/* U+0102+0301 -> U+1EAE */ 1290,
+	/* U+0102+0303 -> U+1EB4 */ 1296,
+	/* U+0102+0309 -> U+1EB2 */ 1294,
+	/* U+0103+0300 -> U+1EB1 */ 1293,
+	/* U+0103+0301 -> U+1EAF */ 1291,
+	/* U+0103+0303 -> U+1EB5 */ 1297,
+	/* U+0103+0309 -> U+1EB3 */ 1295,
+	/* U+0112+0300 -> U+1E14 */ 1140,
+	/* U+0112+0301 -> U+1E16 */ 1142,
+	/* U+0113+0300 -> U+1E15 */ 1141,
+	/* U+0113+0301 -> U+1E17 */ 1143,
+	/* U+014C+0300 -> U+1E50 */ 1200,
+	/* U+014C+0301 -> U+1E52 */ 1202,
+	/* U+014D+0300 -> U+1E51 */ 1201,
+	/* U+014D+0301 -> U+1E53 */ 1203,
+	/* U+015A+0307 -> U+1E64 */ 1220,
+	/* U+015B+0307 -> U+1E65 */ 1221,
+	/* U+0160+0307 -> U+1E66 */ 1222,
+	/* U+0161+0307 -> U+1E67 */ 1223,
+	/* U+0168+0301 -> U+1E78 */ 1240,
+	/* U+0169+0301 -> U+1E79 */ 1241,
+	/* U+016A+0308 -> U+1E7A */ 1242,
+	/* U+016B+0308 -> U+1E7B */ 1243,
+	/* U+017F+0307 -> U+1E9B */ 1275,
+	/* U+01A0+0300 -> U+1EDC */ 1336,
+	/* U+01A0+0301 -> U+1EDA */ 1334,
+	/* U+01A0+0303 -> U+1EE0 */ 1340,
+	/* U+01A0+0309 -> U+1EDE */ 1338,
+	/* U+01A0+0323 -> U+1EE2 */ 1342,
+	/* U+01A1+0300 -> U+1EDD */ 1337,
+	/* U+01A1+0301 -> U+1EDB */ 1335,
+	/* U+01A1+0303 -> U+1EE1 */ 1341,
+	/* U+01A1+0309 -> U+1EDF */ 1339,
+	/* U+01A1+0323 -> U+1EE3 */ 1343,
+	/* U+01AF+0300 -> U+1EEA */ 1350,
+	/* U+01AF+0301 -> U+1EE8 */ 1348,
+	/* U+01AF+0303 -> U+1EEE */ 1354,
+	/* U+01AF+0309 -> U+1EEC */ 1352,
+	/* U+01AF+0323 -> U+1EF0 */ 1356,
+	/* U+01B0+0300 -> U+1EEB */ 1351,
+	/* U+01B0+0301 -> U+1EE9 */ 1349,
+	/* U+01B0+0303 -> U+1EEF */ 1355,
+	/* U+01B0+0309 -> U+1EED */ 1353,
+	/* U+01B0+0323 -> U+1EF1 */ 1357,
+	/* U+01B7+030C -> U+01EE */ 224,
+	/* U+01EA+0304 -> U+01EC */ 222,
+	/* U+01EB+0304 -> U+01ED */ 223,
+	/* U+0226+0304 -> U+01E0 */ 212,
+	/* U+0227+0304 -> U+01E1 */ 213,
+	/* U+0228+0306 -> U+1E1C */ 1148,
+	/* U+0229+0306 -> U+1E1D */ 1149,
+	/* U+022E+0304 -> U+0230 */ 280,
+	/* U+022F+0304 -> U+0231 */ 281,
+	/* U+0292+030C -> U+01EF */ 225,
+	/* U+0391+0300 -> U+1FBA */ 1537,
+	/* U+0391+0301 -> U+0386 */ 420,
+	/* U+0391+0304 -> U+1FB9 */ 1536,
+	/* U+0391+0306 -> U+1FB8 */ 1535,
+	/* U+0391+0313 -> U+1F08 */ 1374,
+	/* U+0391+0314 -> U+1F09 */ 1375,
+	/* U+0391+0345 -> U+1FBC */ 1539,
+	/* U+0395+0300 -> U+1FC8 */ 1550,
+	/* U+0395+0301 -> U+0388 */ 422,
+	/* U+0395+0313 -> U+1F18 */ 1388,
+	/* U+0395+0314 -> U+1F19 */ 1389,
+	/* U+0397+0300 -> U+1FCA */ 1552,
+	/* U+0397+0301 -> U+0389 */ 423,
+	/* U+0397+0313 -> U+1F28 */ 1402,
+	/* U+0397+0314 -> U+1F29 */ 1403,
+	/* U+0397+0345 -> U+1FCC */ 1554,
+	/* U+0399+0300 -> U+1FDA */ 1566,
+	/* U+0399+0301 -> U+038A */ 424,
+	/* U+0399+0304 -> U+1FD9 */ 1565,
+	/* U+0399+0306 -> U+1FD8 */ 1564,
+	/* U+0399+0308 -> U+03AA */ 429,
+	/* U+0399+0313 -> U+1F38 */ 1418,
+	/* U+0399+0314 -> U+1F39 */ 1419,
+	/* U+039F+0300 -> U+1FF8 */ 1592,
+	/* U+039F+0301 -> U+038C */ 425,
+	/* U+039F+0313 -> U+1F48 */ 1432,
+	/* U+039F+0314 -> U+1F49 */ 1433,
+	/* U+03A1+0314 -> U+1FEC */ 1583,
+	/* U+03A5+0300 -> U+1FEA */ 1581,
+	/* U+03A5+0301 -> U+038E */ 426,
+	/* U+03A5+0304 -> U+1FE9 */ 1580,
+	/* U+03A5+0306 -> U+1FE8 */ 1579,
+	/* U+03A5+0308 -> U+03AB */ 430,
+	/* U+03A5+0314 -> U+1F59 */ 1446,
+	/* U+03A9+0300 -> U+1FFA */ 1594,
+	/* U+03A9+0301 -> U+038F */ 427,
+	/* U+03A9+0313 -> U+1F68 */ 1458,
+	/* U+03A9+0314 -> U+1F69 */ 1459,
+	/* U+03A9+0345 -> U+1FFC */ 1596,
+	/* U+03AC+0345 -> U+1FB4 */ 1532,
+	/* U+03AE+0345 -> U+1FC4 */ 1547,
+	/* U+03B1+0300 -> U+1F70 */ 1466,
+	/* U+03B1+0301 -> U+03AC */ 431,
+	/* U+03B1+0304 -> U+1FB1 */ 1529,
+	/* U+03B1+0306 -> U+1FB0 */ 1528,
+	/* U+03B1+0313 -> U+1F00 */ 1366,
+	/* U+03B1+0314 -> U+1F01 */ 1367,
+	/* U+03B1+0342 -> U+1FB6 */ 1533,
+	/* U+03B1+0345 -> U+1FB3 */ 1531,
+	/* U+03B5+0300 -> U+1F72 */ 1468,
+	/* U+03B5+0301 -> U+03AD */ 432,
+	/* U+03B5+0313 -> U+1F10 */ 1382,
+	/* U+03B5+0314 -> U+1F11 */ 1383,
+	/* U+03B7+0300 -> U+1F74 */ 1470,
+	/* U+03B7+0301 -> U+03AE */ 433,
+	/* U+03B7+0313 -> U+1F20 */ 1394,
+	/* U+03B7+0314 -> U+1F21 */ 1395,
+	/* U+03B7+0342 -> U+1FC6 */ 1548,
+	/* U+03B7+0345 -> U+1FC3 */ 1546,
+	/* U+03B9+0300 -> U+1F76 */ 1472,
+	/* U+03B9+0301 -> U+03AF */ 434,
+	/* U+03B9+0304 -> U+1FD1 */ 1559,
+	/* U+03B9+0306 -> U+1FD0 */ 1558,
+	/* U+03B9+0308 -> U+03CA */ 436,
+	/* U+03B9+0313 -> U+1F30 */ 1410,
+	/* U+03B9+0314 -> U+1F31 */ 1411,
+	/* U+03B9+0342 -> U+1FD6 */ 1562,
+	/* U+03BF+0300 -> U+1F78 */ 1474,
+	/* U+03BF+0301 -> U+03CC */ 438,
+	/* U+03BF+0313 -> U+1F40 */ 1426,
+	/* U+03BF+0314 -> U+1F41 */ 1427,
+	/* U+03C1+0313 -> U+1FE4 */ 1575,
+	/* U+03C1+0314 -> U+1FE5 */ 1576,
+	/* U+03C5+0300 -> U+1F7A */ 1476,
+	/* U+03C5+0301 -> U+03CD */ 439,
+	/* U+03C5+0304 -> U+1FE1 */ 1572,
+	/* U+03C5+0306 -> U+1FE0 */ 1571,
+	/* U+03C5+0308 -> U+03CB */ 437,
+	/* U+03C5+0313 -> U+1F50 */ 1438,
+	/* U+03C5+0314 -> U+1F51 */ 1439,
+	/* U+03C5+0342 -> U+1FE6 */ 1577,
+	/* U+03C9+0300 -> U+1F7C */ 1478,
+	/* U+03C9+0301 -> U+03CE */ 440,
+	/* U+03C9+0313 -> U+1F60 */ 1450,
+	/* U+03C9+0314 -> U+1F61 */ 1451,
+	/* U+03C9+0342 -> U+1FF6 */ 1590,
+	/* U+03C9+0345 -> U+1FF3 */ 1588,
+	/* U+03CA+0300 -> U+1FD2 */ 1560,
+	/* U+03CA+0301 -> U+0390 */ 428,
+	/* U+03CA+0342 -> U+1FD7 */ 1563,
+	/* U+03CB+0300 -> U+1FE2 */ 1573,
+	/* U+03CB+0301 -> U+03B0 */ 435,
+	/* U+03CB+0342 -> U+1FE7 */ 1578,
+	/* U+03CE+0345 -> U+1FF4 */ 1589,
+	/* U+03D2+0301 -> U+03D3 */ 444,
+	/* U+03D2+0308 -> U+03D4 */ 445,
+	/* U+0406+0308 -> U+0407 */ 457,
+	/* U+0410+0306 -> U+04D0 */ 479,
+	/* U+0410+0308 -> U+04D2 */ 481,
+	/* U+0413+0301 -> U+0403 */ 456,
+	/* U+0415+0300 -> U+0400 */ 454,
+	/* U+0415+0306 -> U+04D6 */ 483,
+	/* U+0415+0308 -> U+0401 */ 455,
+	/* U+0416+0306 -> U+04C1 */ 477,
+	/* U+0416+0308 -> U+04DC */ 487,
+	/* U+0417+0308 -> U+04DE */ 489,
+	/* U+0418+0300 -> U+040D */ 459,
+	/* U+0418+0304 -> U+04E2 */ 491,
+	/* U+0418+0306 -> U+0419 */ 461,
+	/* U+0418+0308 -> U+04E4 */ 493,
+	/* U+041A+0301 -> U+040C */ 458,
+	/* U+041E+0308 -> U+04E6 */ 495,
+	/* U+0423+0304 -> U+04EE */ 501,
+	/* U+0423+0306 -> U+040E */ 460,
+	/* U+0423+0308 -> U+04F0 */ 503,
+	/* U+0423+030B -> U+04F2 */ 505,
+	/* U+0427+0308 -> U+04F4 */ 507,
+	/* U+042B+0308 -> U+04F8 */ 509,
+	/* U+042D+0308 -> U+04EC */ 499,
+	/* U+0430+0306 -> U+04D1 */ 480,
+	/* U+0430+0308 -> U+04D3 */ 482,
+	/* U+0433+0301 -> U+0453 */ 465,
+	/* U+0435+0300 -> U+0450 */ 463,
+	/* U+0435+0306 -> U+04D7 */ 484,
+	/* U+0435+0308 -> U+0451 */ 464,
+	/* U+0436+0306 -> U+04C2 */ 478,
+	/* U+0436+0308 -> U+04DD */ 488,
+	/* U+0437+0308 -> U+04DF */ 490,
+	/* U+0438+0300 -> U+045D */ 468,
+	/* U+0438+0304 -> U+04E3 */ 492,
+	/* U+0438+0306 -> U+0439 */ 462,
+	/* U+0438+0308 -> U+04E5 */ 494,
+	/* U+043A+0301 -> U+045C */ 467,
+	/* U+043E+0308 -> U+04E7 */ 496,
+	/* U+0443+0304 -> U+04EF */ 502,
+	/* U+0443+0306 -> U+045E */ 469,
+	/* U+0443+0308 -> U+04F1 */ 504,
+	/* U+0443+030B -> U+04F3 */ 506,
+	/* U+0447+0308 -> U+04F5 */ 508,
+	/* U+044B+0308 -> U+04F9 */ 510,
+	/* U+044D+0308 -> U+04ED */ 500,
+	/* U+0456+0308 -> U+0457 */ 466,
+	/* U+0474+030F -> U+0476 */ 470,
+	/* U+0475+030F -> U+0477 */ 471,
+	/* U+04D8+0308 -> U+04DA */ 485,
+	/* U+04D9+0308 -> U+04DB */ 486,
+	/* U+04E8+0308 -> U+04EA */ 497,
+	/* U+04E9+0308 -> U+04EB */ 498,
+	/* U+0627+0653 -> U+0622 */ 574,
+	/* U+0627+0654 -> U+0623 */ 575,
+	/* U+0627+0655 -> U+0625 */ 577,
+	/* U+0648+0654 -> U+0624 */ 576,
+	/* U+064A+0654 -> U+0626 */ 578,
+	/* U+06C1+0654 -> U+06C2 */ 606,
+	/* U+06D2+0654 -> U+06D3 */ 607,
+	/* U+06D5+0654 -> U+06C0 */ 605,
+	/* U+0928+093C -> U+0929 */ 733,
+	/* U+0930+093C -> U+0931 */ 734,
+	/* U+0933+093C -> U+0934 */ 735,
+	/* U+09C7+09BE -> U+09CB */ 751,
+	/* U+09C7+09D7 -> U+09CC */ 752,
+	/* U+0B47+0B3E -> U+0B4B */ 770,
+	/* U+0B47+0B56 -> U+0B48 */ 769,
+	/* U+0B47+0B57 -> U+0B4C */ 771,
+	/* U+0B92+0BD7 -> U+0B94 */ 775,
+	/* U+0BC6+0BBE -> U+0BCA */ 776,
+	/* U+0BC6+0BD7 -> U+0BCC */ 778,
+	/* U+0BC7+0BBE -> U+0BCB */ 777,
+	/* U+0C46+0C56 -> U+0C48 */ 780,
+	/* U+0CBF+0CD5 -> U+0CC0 */ 785,
+	/* U+0CC6+0CC2 -> U+0CCA */ 788,
+	/* U+0CC6+0CD5 -> U+0CC7 */ 786,
+	/* U+0CC6+0CD6 -> U+0CC8 */ 787,
+	/* U+0CCA+0CD5 -> U+0CCB */ 789,
+	/* U+0D46+0D3E -> U+0D4A */ 793,
+	/* U+0D46+0D57 -> U+0D4C */ 795,
+	/* U+0D47+0D3E -> U+0D4B */ 794,
+	/* U+0DD9+0DCA -> U+0DDA */ 798,
+	/* U+0DD9+0DCF -> U+0DDC */ 799,
+	/* U+0DD9+0DDF -> U+0DDE */ 801,
+	/* U+0DDC+0DCA -> U+0DDD */ 800,
+	/* U+1025+102E -> U+1026 */ 859,
+	/* U+1B05+1B35 -> U+1B06 */ 904,
+	/* U+1B07+1B35 -> U+1B08 */ 905,
+	/* U+1B09+1B35 -> U+1B0A */ 906,
+	/* U+1B0B+1B35 -> U+1B0C */ 907,
+	/* U+1B0D+1B35 -> U+1B0E */ 908,
+	/* U+1B11+1B35 -> U+1B12 */ 909,
+	/* U+1B3A+1B35 -> U+1B3B */ 911,
+	/* U+1B3C+1B35 -> U+1B3D */ 912,
+	/* U+1B3E+1B35 -> U+1B40 */ 913,
+	/* U+1B3F+1B35 -> U+1B41 */ 914,
+	/* U+1B42+1B35 -> U+1B43 */ 915,
+	/* U+1E36+0304 -> U+1E38 */ 1176,
+	/* U+1E37+0304 -> U+1E39 */ 1177,
+	/* U+1E5A+0304 -> U+1E5C */ 1212,
+	/* U+1E5B+0304 -> U+1E5D */ 1213,
+	/* U+1E62+0307 -> U+1E68 */ 1224,
+	/* U+1E63+0307 -> U+1E69 */ 1225,
+	/* U+1EA0+0302 -> U+1EAC */ 1288,
+	/* U+1EA0+0306 -> U+1EB6 */ 1298,
+	/* U+1EA1+0302 -> U+1EAD */ 1289,
+	/* U+1EA1+0306 -> U+1EB7 */ 1299,
+	/* U+1EB8+0302 -> U+1EC6 */ 1314,
+	/* U+1EB9+0302 -> U+1EC7 */ 1315,
+	/* U+1ECC+0302 -> U+1ED8 */ 1332,
+	/* U+1ECD+0302 -> U+1ED9 */ 1333,
+	/* U+1F00+0300 -> U+1F02 */ 1368,
+	/* U+1F00+0301 -> U+1F04 */ 1370,
+	/* U+1F00+0342 -> U+1F06 */ 1372,
+	/* U+1F00+0345 -> U+1F80 */ 1480,
+	/* U+1F01+0300 -> U+1F03 */ 1369,
+	/* U+1F01+0301 -> U+1F05 */ 1371,
+	/* U+1F01+0342 -> U+1F07 */ 1373,
+	/* U+1F01+0345 -> U+1F81 */ 1481,
+	/* U+1F02+0345 -> U+1F82 */ 1482,
+	/* U+1F03+0345 -> U+1F83 */ 1483,
+	/* U+1F04+0345 -> U+1F84 */ 1484,
+	/* U+1F05+0345 -> U+1F85 */ 1485,
+	/* U+1F06+0345 -> U+1F86 */ 1486,
+	/* U+1F07+0345 -> U+1F87 */ 1487,
+	/* U+1F08+0300 -> U+1F0A */ 1376,
+	/* U+1F08+0301 -> U+1F0C */ 1378,
+	/* U+1F08+0342 -> U+1F0E */ 1380,
+	/* U+1F08+0345 -> U+1F88 */ 1488,
+	/* U+1F09+0300 -> U+1F0B */ 1377,
+	/* U+1F09+0301 -> U+1F0D */ 1379,
+	/* U+1F09+0342 -> U+1F0F */ 1381,
+	/* U+1F09+0345 -> U+1F89 */ 1489,
+	/* U+1F0A+0345 -> U+1F8A */ 1490,
+	/* U+1F0B+0345 -> U+1F8B */ 1491,
+	/* U+1F0C+0345 -> U+1F8C */ 1492,
+	/* U+1F0D+0345 -> U+1F8D */ 1493,
+	/* U+1F0E+0345 -> U+1F8E */ 1494,
+	/* U+1F0F+0345 -> U+1F8F */ 1495,
+	/* U+1F10+0300 -> U+1F12 */ 1384,
+	/* U+1F10+0301 -> U+1F14 */ 1386,
+	/* U+1F11+0300 -> U+1F13 */ 1385,
+	/* U+1F11+0301 -> U+1F15 */ 1387,
+	/* U+1F18+0300 -> U+1F1A */ 1390,
+	/* U+1F18+0301 -> U+1F1C */ 1392,
+	/* U+1F19+0300 -> U+1F1B */ 1391,
+	/* U+1F19+0301 -> U+1F1D */ 1393,
+	/* U+1F20+0300 -> U+1F22 */ 1396,
+	/* U+1F20+0301 -> U+1F24 */ 1398,
+	/* U+1F20+0342 -> U+1F26 */ 1400,
+	/* U+1F20+0345 -> U+1F90 */ 1496,
+	/* U+1F21+0300 -> U+1F23 */ 1397,
+	/* U+1F21+0301 -> U+1F25 */ 1399,
+	/* U+1F21+0342 -> U+1F27 */ 1401,
+	/* U+1F21+0345 -> U+1F91 */ 1497,
+	/* U+1F22+0345 -> U+1F92 */ 1498,
+	/* U+1F23+0345 -> U+1F93 */ 1499,
+	/* U+1F24+0345 -> U+1F94 */ 1500,
+	/* U+1F25+0345 -> U+1F95 */ 1501,
+	/* U+1F26+0345 -> U+1F96 */ 1502,
+	/* U+1F27+0345 -> U+1F97 */ 1503,
+	/* U+1F28+0300 -> U+1F2A */ 1404,
+	/* U+1F28+0301 -> U+1F2C */ 1406,
+	/* U+1F28+0342 -> U+1F2E */ 1408,
+	/* U+1F28+0345 -> U+1F98 */ 1504,
+	/* U+1F29+0300 -> U+1F2B */ 1405,
+	/* U+1F29+0301 -> U+1F2D */ 1407,
+	/* U+1F29+0342 -> U+1F2F */ 1409,
+	/* U+1F29+0345 -> U+1F99 */ 1505,
+	/* U+1F2A+0345 -> U+1F9A */ 1506,
+	/* U+1F2B+0345 -> U+1F9B */ 1507,
+	/* U+1F2C+0345 -> U+1F9C */ 1508,
+	/* U+1F2D+0345 -> U+1F9D */ 1509,
+	/* U+1F2E+0345 -> U+1F9E */ 1510,
+	/* U+1F2F+0345 -> U+1F9F */ 1511,
+	/* U+1F30+0300 -> U+1F32 */ 1412,
+	/* U+1F30+0301 -> U+1F34 */ 1414,
+	/* U+1F30+0342 -> U+1F36 */ 1416,
+	/* U+1F31+0300 -> U+1F33 */ 1413,
+	/* U+1F31+0301 -> U+1F35 */ 1415,
+	/* U+1F31+0342 -> U+1F37 */ 1417,
+	/* U+1F38+0300 -> U+1F3A */ 1420,
+	/* U+1F38+0301 -> U+1F3C */ 1422,
+	/* U+1F38+0342 -> U+1F3E */ 1424,
+	/* U+1F39+0300 -> U+1F3B */ 1421,
+	/* U+1F39+0301 -> U+1F3D */ 1423,
+	/* U+1F39+0342 -> U+1F3F */ 1425,
+	/* U+1F40+0300 -> U+1F42 */ 1428,
+	/* U+1F40+0301 -> U+1F44 */ 1430,
+	/* U+1F41+0300 -> U+1F43 */ 1429,
+	/* U+1F41+0301 -> U+1F45 */ 1431,
+	/* U+1F48+0300 -> U+1F4A */ 1434,
+	/* U+1F48+0301 -> U+1F4C */ 1436,
+	/* U+1F49+0300 -> U+1F4B */ 1435,
+	/* U+1F49+0301 -> U+1F4D */ 1437,
+	/* U+1F50+0300 -> U+1F52 */ 1440,
+	/* U+1F50+0301 -> U+1F54 */ 1442,
+	/* U+1F50+0342 -> U+1F56 */ 1444,
+	/* U+1F51+0300 -> U+1F53 */ 1441,
+	/* U+1F51+0301 -> U+1F55 */ 1443,
+	/* U+1F51+0342 -> U+1F57 */ 1445,
+	/* U+1F59+0300 -> U+1F5B */ 1447,
+	/* U+1F59+0301 -> U+1F5D */ 1448,
+	/* U+1F59+0342 -> U+1F5F */ 1449,
+	/* U+1F60+0300 -> U+1F62 */ 1452,
+	/* U+1F60+0301 -> U+1F64 */ 1454,
+	/* U+1F60+0342 -> U+1F66 */ 1456,
+	/* U+1F60+0345 -> U+1FA0 */ 1512,
+	/* U+1F61+0300 -> U+1F63 */ 1453,
+	/* U+1F61+0301 -> U+1F65 */ 1455,
+	/* U+1F61+0342 -> U+1F67 */ 1457,
+	/* U+1F61+0345 -> U+1FA1 */ 1513,
+	/* U+1F62+0345 -> U+1FA2 */ 1514,
+	/* U+1F63+0345 -> U+1FA3 */ 1515,
+	/* U+1F64+0345 -> U+1FA4 */ 1516,
+	/* U+1F65+0345 -> U+1FA5 */ 1517,
+	/* U+1F66+0345 -> U+1FA6 */ 1518,
+	/* U+1F67+0345 -> U+1FA7 */ 1519,
+	/* U+1F68+0300 -> U+1F6A */ 1460,
+	/* U+1F68+0301 -> U+1F6C */ 1462,
+	/* U+1F68+0342 -> U+1F6E */ 1464,
+	/* U+1F68+0345 -> U+1FA8 */ 1520,
+	/* U+1F69+0300 -> U+1F6B */ 1461,
+	/* U+1F69+0301 -> U+1F6D */ 1463,
+	/* U+1F69+0342 -> U+1F6F */ 1465,
+	/* U+1F69+0345 -> U+1FA9 */ 1521,
+	/* U+1F6A+0345 -> U+1FAA */ 1522,
+	/* U+1F6B+0345 -> U+1FAB */ 1523,
+	/* U+1F6C+0345 -> U+1FAC */ 1524,
+	/* U+1F6D+0345 -> U+1FAD */ 1525,
+	/* U+1F6E+0345 -> U+1FAE */ 1526,
+	/* U+1F6F+0345 -> U+1FAF */ 1527,
+	/* U+1F70+0345 -> U+1FB2 */ 1530,
+	/* U+1F74+0345 -> U+1FC2 */ 1545,
+	/* U+1F7C+0345 -> U+1FF2 */ 1587,
+	/* U+1FB6+0345 -> U+1FB7 */ 1534,
+	/* U+1FBF+0300 -> U+1FCD */ 1555,
+	/* U+1FBF+0301 -> U+1FCE */ 1556,
+	/* U+1FBF+0342 -> U+1FCF */ 1557,
+	/* U+1FC6+0345 -> U+1FC7 */ 1549,
+	/* U+1FF6+0345 -> U+1FF7 */ 1591,
+	/* U+1FFE+0300 -> U+1FDD */ 1568,
+	/* U+1FFE+0301 -> U+1FDE */ 1569,
+	/* U+1FFE+0342 -> U+1FDF */ 1570,
+	/* U+2190+0338 -> U+219A */ 1801,
+	/* U+2192+0338 -> U+219B */ 1802,
+	/* U+2194+0338 -> U+21AE */ 1803,
+	/* U+21D0+0338 -> U+21CD */ 1804,
+	/* U+21D2+0338 -> U+21CF */ 1806,
+	/* U+21D4+0338 -> U+21CE */ 1805,
+	/* U+2203+0338 -> U+2204 */ 1807,
+	/* U+2208+0338 -> U+2209 */ 1808,
+	/* U+220B+0338 -> U+220C */ 1809,
+	/* U+2223+0338 -> U+2224 */ 1810,
+	/* U+2225+0338 -> U+2226 */ 1811,
+	/* U+223C+0338 -> U+2241 */ 1816,
+	/* U+2243+0338 -> U+2244 */ 1817,
+	/* U+2245+0338 -> U+2247 */ 1818,
+	/* U+2248+0338 -> U+2249 */ 1819,
+	/* U+224D+0338 -> U+226D */ 1822,
+	/* U+2261+0338 -> U+2262 */ 1821,
+	/* U+2264+0338 -> U+2270 */ 1825,
+	/* U+2265+0338 -> U+2271 */ 1826,
+	/* U+2272+0338 -> U+2274 */ 1827,
+	/* U+2273+0338 -> U+2275 */ 1828,
+	/* U+2276+0338 -> U+2278 */ 1829,
+	/* U+2277+0338 -> U+2279 */ 1830,
+	/* U+227A+0338 -> U+2280 */ 1831,
+	/* U+227B+0338 -> U+2281 */ 1832,
+	/* U+227C+0338 -> U+22E0 */ 1841,
+	/* U+227D+0338 -> U+22E1 */ 1842,
+	/* U+2282+0338 -> U+2284 */ 1833,
+	/* U+2283+0338 -> U+2285 */ 1834,
+	/* U+2286+0338 -> U+2288 */ 1835,
+	/* U+2287+0338 -> U+2289 */ 1836,
+	/* U+2291+0338 -> U+22E2 */ 1843,
+	/* U+2292+0338 -> U+22E3 */ 1844,
+	/* U+22A2+0338 -> U+22AC */ 1837,
+	/* U+22A8+0338 -> U+22AD */ 1838,
+	/* U+22A9+0338 -> U+22AE */ 1839,
+	/* U+22AB+0338 -> U+22AF */ 1840,
+	/* U+22B2+0338 -> U+22EA */ 1845,
+	/* U+22B3+0338 -> U+22EB */ 1846,
+	/* U+22B4+0338 -> U+22EC */ 1847,
+	/* U+22B5+0338 -> U+22ED */ 1848,
+	/* U+3046+3099 -> U+3094 */ 2286,
+	/* U+304B+3099 -> U+304C */ 2261,
+	/* U+304D+3099 -> U+304E */ 2262,
+	/* U+304F+3099 -> U+3050 */ 2263,
+	/* U+3051+3099 -> U+3052 */ 2264,
+	/* U+3053+3099 -> U+3054 */ 2265,
+	/* U+3055+3099 -> U+3056 */ 2266,
+	/* U+3057+3099 -> U+3058 */ 2267,
+	/* U+3059+3099 -> U+305A */ 2268,
+	/* U+305B+3099 -> U+305C */ 2269,
+	/* U+305D+3099 -> U+305E */ 2270,
+	/* U+305F+3099 -> U+3060 */ 2271,
+	/* U+3061+3099 -> U+3062 */ 2272,
+	/* U+3064+3099 -> U+3065 */ 2273,
+	/* U+3066+3099 -> U+3067 */ 2274,
+	/* U+3068+3099 -> U+3069 */ 2275,
+	/* U+306F+3099 -> U+3070 */ 2276,
+	/* U+306F+309A -> U+3071 */ 2277,
+	/* U+3072+3099 -> U+3073 */ 2278,
+	/* U+3072+309A -> U+3074 */ 2279,
+	/* U+3075+3099 -> U+3076 */ 2280,
+	/* U+3075+309A -> U+3077 */ 2281,
+	/* U+3078+3099 -> U+3079 */ 2282,
+	/* U+3078+309A -> U+307A */ 2283,
+	/* U+307B+3099 -> U+307C */ 2284,
+	/* U+307B+309A -> U+307D */ 2285,
+	/* U+309D+3099 -> U+309E */ 2291,
+	/* U+30A6+3099 -> U+30F4 */ 2318,
+	/* U+30AB+3099 -> U+30AC */ 2293,
+	/* U+30AD+3099 -> U+30AE */ 2294,
+	/* U+30AF+3099 -> U+30B0 */ 2295,
+	/* U+30B1+3099 -> U+30B2 */ 2296,
+	/* U+30B3+3099 -> U+30B4 */ 2297,
+	/* U+30B5+3099 -> U+30B6 */ 2298,
+	/* U+30B7+3099 -> U+30B8 */ 2299,
+	/* U+30B9+3099 -> U+30BA */ 2300,
+	/* U+30BB+3099 -> U+30BC */ 2301,
+	/* U+30BD+3099 -> U+30BE */ 2302,
+	/* U+30BF+3099 -> U+30C0 */ 2303,
+	/* U+30C1+3099 -> U+30C2 */ 2304,
+	/* U+30C4+3099 -> U+30C5 */ 2305,
+	/* U+30C6+3099 -> U+30C7 */ 2306,
+	/* U+30C8+3099 -> U+30C9 */ 2307,
+	/* U+30CF+3099 -> U+30D0 */ 2308,
+	/* U+30CF+309A -> U+30D1 */ 2309,
+	/* U+30D2+3099 -> U+30D3 */ 2310,
+	/* U+30D2+309A -> U+30D4 */ 2311,
+	/* U+30D5+3099 -> U+30D6 */ 2312,
+	/* U+30D5+309A -> U+30D7 */ 2313,
+	/* U+30D8+3099 -> U+30D9 */ 2314,
+	/* U+30D8+309A -> U+30DA */ 2315,
+	/* U+30DB+3099 -> U+30DC */ 2316,
+	/* U+30DB+309A -> U+30DD */ 2317,
+	/* U+30EF+3099 -> U+30F7 */ 2319,
+	/* U+30F0+3099 -> U+30F8 */ 2320,
+	/* U+30F1+3099 -> U+30F9 */ 2321,
+	/* U+30F2+3099 -> U+30FA */ 2322,
+	/* U+30FD+3099 -> U+30FE */ 2323,
+	/* U+11099+110BA -> U+1109A */ 4588,
+	/* U+1109B+110BA -> U+1109C */ 4589,
+	/* U+110A5+110BA -> U+110AB */ 4590,
+	/* U+11131+11127 -> U+1112E */ 4596,
+	/* U+11132+11127 -> U+1112F */ 4597,
+	/* U+11347+1133E -> U+1134B */ 4609,
+	/* U+11347+11357 -> U+1134C */ 4610,
+	/* U+114B9+114B0 -> U+114BC */ 4628,
+	/* U+114B9+114BA -> U+114BB */ 4627,
+	/* U+114B9+114BD -> U+114BE */ 4629,
+	/* U+115B8+115AF -> U+115BA */ 4632,
+	/* U+115B9+115AF -> U+115BB */ 4633,
+	/* U+11935+11930 -> U+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
+};
diff --git a/src/common/unicode/Makefile b/src/common/unicode/Makefile
index 93a9d1615f..eb14add28a 100644
--- a/src/common/unicode/Makefile
+++ b/src/common/unicode/Makefile
@@ -18,7 +18,7 @@ LIBS += $(PTHREAD_LIBS)
 # By default, do nothing.
 all:
 
-update-unicode: unicode_norm_table.h unicode_combining_table.h unicode_normprops_table.h
+update-unicode: unicode_norm_table.h unicode_combining_table.h unicode_normprops_table.h unicode_norm_hashfunc.h
 	mv $^ ../../../src/include/common/
 	$(MAKE) normalization-check
 
@@ -30,6 +30,8 @@ UnicodeData.txt DerivedNormalizationProps.txt CompositionExclusions.txt Normaliz
 
 # Generation of conversion tables used for string normalization with
 # UTF-8 strings.
+unicode_norm_hashfunc.h: unicode_norm_table.h
+
 unicode_norm_table.h: generate-unicode_norm_table.pl UnicodeData.txt CompositionExclusions.txt
 	$(PERL) generate-unicode_norm_table.pl
 
diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index 7ce15e1a03..f527560334 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -1,16 +1,22 @@
 #!/usr/bin/perl
 #
-# Generate a composition table, using Unicode data files as input
+# Generate a composition table and its lookup utilities, using Unicode data
+# files as input
 #
 # Input: UnicodeData.txt and CompositionExclusions.txt
-# Output: unicode_norm_table.h
+# Output: unicode_norm_table.h and unicode_norm_hashfunc.h
 #
 # Copyright (c) 2000-2020, PostgreSQL Global Development Group
 
 use strict;
 use warnings;
 
-my $output_file = "unicode_norm_table.h";
+use FindBin;
+use lib "$FindBin::RealBin/../../tools/";
+use PerfectHash;
+
+my $output_table_file = "unicode_norm_table.h";
+my $output_func_file  = "unicode_norm_hashfunc.h";
 
 my $FH;
 
@@ -64,11 +70,13 @@ close $FH;
 
 my $num_characters = scalar @characters;
 
-# Start writing out the output file
-open my $OUTPUT, '>', $output_file
-  or die "Could not open output file $output_file: $!\n";
+# Start writing out the output files
+open my $OT, '>', $output_table_file
+  or die "Could not open output file $output_table_file: $!\n";
+open my $OF, '>', $output_func_file
+  or die "Could not open output file $output_func_file: $!\n";
 
-print $OUTPUT <<HEADER;
+print $OT <<HEADER;
 /*-------------------------------------------------------------------------
  *
  * unicode_norm_table.h
@@ -111,8 +119,53 @@ static const pg_unicode_decomposition UnicodeDecompMain[$num_characters] =
 {
 HEADER
 
+print $OF <<HEADER;
+/*-------------------------------------------------------------------------
+ *
+ * unicode_norm_hashfunc.h
+ *	  Perfect hash functions used for Unicode normalization
+ *
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/common/unicode_norm_hashfunc.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * File auto-generated by src/common/unicode/generate-unicode_norm_table.pl,
+ * do not edit. There is deliberately not an #ifndef PG_UNICODE_NORM_HASHFUNC_H
+ * here.
+ */
+
+#include "common/unicode_norm_table.h"
+
+/* Typedef for perfect hash functions */
+typedef int (*cp_hash_func) (const void *key);
+
+/* Information for lookups with perfect hash functions */
+typedef struct
+{
+	const pg_unicode_decomposition *decomps;
+	cp_hash_func	hash;
+	int		num_decomps;
+} pg_unicode_decompinfo;
+
+typedef struct
+{
+	const uint16	*inverse_lookup;
+	cp_hash_func	hash;
+	int		num_recomps;
+} pg_unicode_recompinfo;
+
+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)
@@ -121,6 +174,9 @@ foreach my $char (@characters)
 	my $class  = $char->{class};
 	my $decomp = $char->{decomp};
 
+	# Save the code point bytes as a string in network order.
+	push @dec_cp_packed, pack('N', hex($char->{code}));
+
 	# The character decomposition mapping field in UnicodeData.txt is a list
 	# of unicode codepoints, separated by space. But it can be prefixed with
 	# so-called compatibility formatting tag, like "<compat>", or "<font>".
@@ -163,7 +219,7 @@ foreach my $char (@characters)
 		{
 			foreach my $lcode (@composition_exclusion_codes)
 			{
-				if ($lcode eq $char->{code})
+				if ($lcode eq $code)
 				{
 					$flags .= " | DECOMP_NO_COMPOSE";
 					$comment = "in exclusion list";
@@ -171,11 +227,26 @@ foreach my $char (@characters)
 				}
 			}
 		}
+
+		# Save info for recomposeable codepoints.
+		# Note that this MUST match the macro DECOMPOSITION_NO_COMPOSE in C
+		# above!  See also the inverse lookup in recompose_code() found in
+		# src/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)
 	{
-		print $OUTPUT "\t{0x$code, $class, 0$flags, 0}";
+		print $OT "\t{0x$code, $class, 0$flags, 0}";
 	}
 	elsif ($decomp_size == 1 && length($first_decomp) <= 4)
 	{
@@ -183,12 +254,11 @@ foreach my $char (@characters)
 		# The decomposition consists of a single codepoint, and it fits
 		# in a uint16, so we can store it "inline" in the main table.
 		$flags .= " | DECOMP_INLINE";
-		print $OUTPUT "\t{0x$code, $class, 1$flags, 0x$first_decomp}";
+		print $OT "\t{0x$code, $class, 1$flags, 0x$first_decomp}";
 	}
 	else
 	{
-		print $OUTPUT
-		  "\t{0x$code, $class, $decomp_size$flags, $decomp_index}";
+		print $OT "\t{0x$code, $class, $decomp_size$flags, $decomp_index}";
 
 		# Now save the decompositions into a dedicated area that will
 		# be written afterwards.  First build the entry dedicated to
@@ -205,25 +275,17 @@ foreach my $char (@characters)
 	}
 
 	# Print a comma after all items except the last one.
-	print $OUTPUT "," unless ($code eq $last_code);
-	if ($comment ne "")
-	{
+	print $OT "," unless ($code eq $last_code);
 
-		# If the line is wide already, indent the comment with one tab,
-		# otherwise with two. This is to make the output match the way
-		# pgindent would mangle it. (This is quite hacky. To do this
-		# properly, we should actually track how long the line is so far,
-		# but this works for now.)
-		print $OUTPUT "\t" if ($decomp_index < 10);
+	print $OT "\t/* $comment */" if ($comment ne "");
+	print $OT "\n";
 
-		print $OUTPUT "\t/* $comment */" if ($comment ne "");
-	}
-	print $OUTPUT "\n";
+	$main_index++;
 }
-print $OUTPUT "\n};\n\n";
+print $OT "\n};\n\n";
 
 # Print the array of decomposed codes.
-print $OUTPUT <<HEADER;
+print $OT <<HEADER;
 /* codepoints array  */
 static const uint32 UnicodeDecomp_codepoints[$decomp_index] =
 {
@@ -231,4 +293,114 @@ $decomp_string
 };
 HEADER
 
-close $OUTPUT;
+# Emit the definition of the decomp hash function.
+my $dec_funcname = 'Decomp_hash_func';
+my $dec_func     = PerfectHash::generate_hash_function(\@dec_cp_packed,
+	$dec_funcname, fixed_key_length => 4);
+print $OF "/* Perfect hash function for decomposition */\n";
+print $OF "static $dec_func\n";
+
+# Emit the structure that wraps the hash lookup information into
+# one variable.
+print $OF <<HEADER;
+/* Hash lookup information for decomposition */
+static const pg_unicode_decompinfo UnicodeDecompInfo =
+{
+	UnicodeDecompMain,
+	$dec_funcname,
+	$num_characters
+};
+
+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;
+my $firstentry = 1;
+foreach my $rec (sort recomp_sort @rec_info)
+{
+	# The hash key is formed by concatenating the bytes of the two
+	# codepoints. See also recompose_code() in common/unicode_norm.c.
+	my $hashkey = (hex($rec->{first}) << 32) | hex($rec->{second});
+
+	# We are only interested in the lowest code point that decomposes
+	# to the given code pair.
+	next if $seenit{$hashkey};
+
+	# Save the hash key bytes in network order
+	push @rec_cp_packed, pack('Q>', $hashkey);
+
+	# Append inverse lookup element
+	$recomp_string .= ",\n" if !$firstentry;
+	$recomp_string .= sprintf "\t/* U+%s+%s -> U+%s */ %s",
+	  $rec->{first},
+	  $rec->{second},
+	  $rec->{code},
+	  $rec->{main_index};
+
+	$seenit{$hashkey} = 1;
+	$firstentry = 0;
+}
+
+# Emit the inverse lookup array containing indexes into UnicodeDecompMain.
+my $num_recomps = scalar @rec_cp_packed;
+print $OF <<HEADER;
+/* Inverse lookup array -- contains indexes into UnicodeDecompMain[] */
+static const uint16 RecompInverseLookup[$num_recomps] =
+{
+$recomp_string
+};
+
+HEADER
+
+# Emit the definition of the recomposition hash function.
+my $rec_funcname = 'Recomp_hash_func';
+my $rec_func =
+  PerfectHash::generate_hash_function(\@rec_cp_packed, $rec_funcname,
+	fixed_key_length => 8);
+print $OF "/* Perfect hash function for recomposition */\n";
+print $OF "static $rec_func\n";
+
+# Emit the structure that wraps the hash lookup information into
+# one variable.
+print $OF <<HEADER;
+/* Hash lookup information for recomposition */
+static const pg_unicode_recompinfo UnicodeRecompInfo =
+{
+	RecompInverseLookup,
+	$rec_funcname,
+	$num_recomps
+};
+HEADER
+
+close $OT;
+close $OF;
+
+sub recomp_sort
+{
+	my $a1 = hex($a->{first});
+	my $b1 = hex($b->{first});
+
+	my $a2 = hex($a->{second});
+	my $b2 = hex($b->{second});
+
+	# First sort by the first code point
+	return -1 if $a1 < $b1;
+	return 1  if $a1 > $b1;
+
+	# Then sort by the second code point
+	return -1 if $a2 < $b2;
+	return 1  if $a2 > $b2;
+
+	# Finally sort by the code point that decomposes into first and
+	# second ones.
+	my $acode = hex($a->{code});
+	my $bcode = hex($b->{code});
+
+	return -1 if $acode < $bcode;
+	return -1 if $acode > $bcode;
+
+	die "found duplicate entries of recomposeable code pairs";
+}
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 4bb6a0f587..4ffce0e619 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -19,9 +19,11 @@
 #endif
 
 #include "common/unicode_norm.h"
-#include "common/unicode_norm_table.h"
 #ifndef FRONTEND
+#include "common/unicode_norm_hashfunc.h"
 #include "common/unicode_normprops_table.h"
+#else
+#include "common/unicode_norm_table.h"
 #endif
 #include "port/pg_bswap.h"
 
@@ -44,6 +46,46 @@
 #define NCOUNT		VCOUNT * TCOUNT
 #define SCOUNT		LCOUNT * NCOUNT
 
+/*
+ * get_code_entry
+ *
+ * Get the entry corresponding to code in the decomposition lookup table.
+ * The backend version of this code uses a perfect hash function for the
+ * lookup, while the frontend version uses a binary search.
+ */
+#ifndef FRONTEND
+
+static const pg_unicode_decomposition *
+get_code_entry(pg_wchar code)
+{
+	int			h;
+	uint32		hashkey;
+	pg_unicode_decompinfo decompinfo = UnicodeDecompInfo;
+
+	/*
+	 * Compute the hash function. The hash key is the codepoint with the bytes
+	 * in network order.
+	 */
+	hashkey = pg_hton32(code);
+	h = decompinfo.hash(&hashkey);
+
+	/* An out-of-range result implies no match */
+	if (h < 0 || h >= decompinfo.num_decomps)
+		return NULL;
+
+	/*
+	 * Since it's a perfect hash, we need only match to the specific codepoint
+	 * it identifies.
+	 */
+	if (code != decompinfo.decomps[h].codepoint)
+		return NULL;
+
+	/* Success! */
+	return &decompinfo.decomps[h];
+}
+
+#else
+
 /* comparison routine for bsearch() of decomposition lookup table. */
 static int
 conv_compare(const void *p1, const void *p2)
@@ -56,10 +98,7 @@ conv_compare(const void *p1, const void *p2)
 	return (v1 > v2) ? 1 : ((v1 == v2) ? 0 : -1);
 }
 
-/*
- * Get the entry corresponding to code in the decomposition lookup table.
- */
-static pg_unicode_decomposition *
+static const pg_unicode_decomposition *
 get_code_entry(pg_wchar code)
 {
 	return bsearch(&(code),
@@ -69,6 +108,8 @@ get_code_entry(pg_wchar code)
 				   conv_compare);
 }
 
+#endif							/* !FRONTEND */
+
 /*
  * Given a decomposition entry looked up earlier, get the decomposed
  * characters.
@@ -77,7 +118,7 @@ get_code_entry(pg_wchar code)
  * is only valid until next call to this function!
  */
 static const pg_wchar *
-get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
+get_code_decomposition(const pg_unicode_decomposition *entry, int *dec_size)
 {
 	static pg_wchar x;
 
@@ -104,7 +145,7 @@ get_code_decomposition(pg_unicode_decomposition *entry, int *dec_size)
 static int
 get_decomposed_size(pg_wchar code, bool compat)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			size = 0;
 	int			i;
 	const uint32 *decomp;
@@ -191,17 +232,51 @@ 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
 		 * matches. The comparison just needs to be a perfect match on the
 		 * sub-table of size two, because the start character has already been
-		 * recomposed partially.
+		 * recomposed partially.  This lookup uses a perfect hash function for
+		 * the backend code.
 		 */
+#ifndef FRONTEND
+
+		int			h,
+					inv_lookup_index;
+		uint64		hashkey;
+		pg_unicode_recompinfo recompinfo = UnicodeRecompInfo;
+
+		/*
+		 * Compute the hash function. The hash key is formed by concatenating
+		 * bytes of the two codepoints in network order. See also
+		 * src/common/unicode/generate-unicode_norm_table.pl.
+		 */
+		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;
@@ -216,6 +291,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 				return true;
 			}
 		}
+#endif							/* !FRONTEND */
 	}
 
 	return false;
@@ -231,7 +307,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result)
 static void
 decompose_code(pg_wchar code, bool compat, pg_wchar **result, int *current)
 {
-	pg_unicode_decomposition *entry;
+	const pg_unicode_decomposition *entry;
 	int			i;
 	const uint32 *decomp;
 	int			dec_size;
@@ -358,8 +434,8 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 		pg_wchar	prev = decomp_chars[count - 1];
 		pg_wchar	next = decomp_chars[count];
 		pg_wchar	tmp;
-		pg_unicode_decomposition *prevEntry = get_code_entry(prev);
-		pg_unicode_decomposition *nextEntry = get_code_entry(next);
+		const pg_unicode_decomposition *prevEntry = get_code_entry(prev);
+		const pg_unicode_decomposition *nextEntry = get_code_entry(next);
 
 		/*
 		 * If no entries are found, the character used is either an Hangul
@@ -417,7 +493,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 	for (count = 1; count < decomp_size; count++)
 	{
 		pg_wchar	ch = decomp_chars[count];
-		pg_unicode_decomposition *ch_entry = get_code_entry(ch);
+		const pg_unicode_decomposition *ch_entry = get_code_entry(ch);
 		int			ch_class = (ch_entry == NULL) ? 0 : ch_entry->comb_class;
 		pg_wchar	composite;
 
@@ -458,7 +534,7 @@ unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
 static uint8
 get_canonical_class(pg_wchar ch)
 {
-	pg_unicode_decomposition *entry = get_code_entry(ch);
+	const pg_unicode_decomposition *entry = get_code_entry(ch);
 
 	if (!entry)
 		return 0;
diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns
index 86bdd9d6dc..f08180b0d0 100644
--- a/src/tools/pgindent/exclude_file_patterns
+++ b/src/tools/pgindent/exclude_file_patterns
@@ -18,9 +18,10 @@ src/backend/utils/fmgrprotos\.h$
 # they match pgindent style, they'd look worse not better, so exclude them.
 kwlist_d\.h$
 #
-# This is generated by the scripts from src/common/unicode/.  It uses
+# These are generated by the scripts from src/common/unicode/.  They use
 # hash functions generated by PerfectHash.pm whose format looks worse with
 # pgindent.
+src/include/common/unicode_norm_hashfunc\.h$
 src/include/common/unicode_normprops_table\.h$
 #
 # Exclude ecpg test files to avoid breaking the ecpg regression tests
#18John Naylor
john.naylor@enterprisedb.com
In reply to: Michael Paquier (#17)
Re: speed up unicode decomposition and recomposition

On Thu, Oct 22, 2020 at 12:34 AM Michael Paquier <michael@paquier.xyz>
wrote:

Thanks for the updated version, that was fast. I have found a couple
of places that needed to be adjusted, like the comment at the top of
generate-unicode_norm_table.pl or some comments, an incorrect include
in the new headers and the indentation was not right in perl (we use
perltidy v20170521, see the README in src/tools/pgindent).

Except that, this looks good to me. Attached is the updated version
with all my tweaks, that I would like to commit. If there are any
comments, please feel free of course.

Looks good to me.

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#19Michael Paquier
michael@paquier.xyz
In reply to: John Naylor (#18)
Re: speed up unicode decomposition and recomposition

On Thu, Oct 22, 2020 at 05:50:52AM -0400, John Naylor wrote:

Looks good to me.

Thanks. Committed, then. Great work!
--
Michael

#20John Naylor
john.naylor@enterprisedb.com
In reply to: Michael Paquier (#19)
Re: speed up unicode decomposition and recomposition

On Thu, Oct 22, 2020 at 10:11 PM Michael Paquier <michael@paquier.xyz>
wrote:

On Thu, Oct 22, 2020 at 05:50:52AM -0400, John Naylor wrote:

Looks good to me.

Thanks. Committed, then. Great work!

Thank you!

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#21Tom Lane
tgl@sss.pgh.pa.us
In reply to: John Naylor (#20)
Re: speed up unicode decomposition and recomposition

I chanced to do an --enable-coverage test run today, and I got this
weird message during "make coverage-html":

genhtml: WARNING: function data mismatch at /home/postgres/pgsql/src/common/unicode_norm.c:102

I've never seen anything like that before. I suppose it means that
something about 783f0cc64 is a bit fishy, but I don't know what.

The emitted coverage report looks fairly normal anyway. It says
unicode_norm.c has zero test coverage, which is very possibly correct
since I wasn't running in UTF8 encoding, but I'm not entirely sure of
that either.

This is with RHEL8's lcov-1.13-4.el8 package. I suppose the first
question is does anybody else see that?

regards, tom lane

#22Mark Dilger
mark.dilger@enterprisedb.com
In reply to: Tom Lane (#21)
Re: speed up unicode decomposition and recomposition

On Oct 23, 2020, at 9:07 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

I chanced to do an --enable-coverage test run today, and I got this
weird message during "make coverage-html":

genhtml: WARNING: function data mismatch at /home/postgres/pgsql/src/common/unicode_norm.c:102

I've never seen anything like that before. I suppose it means that
something about 783f0cc64 is a bit fishy, but I don't know what.

The emitted coverage report looks fairly normal anyway. It says
unicode_norm.c has zero test coverage, which is very possibly correct
since I wasn't running in UTF8 encoding, but I'm not entirely sure of
that either.

This is with RHEL8's lcov-1.13-4.el8 package. I suppose the first
question is does anybody else see that?

I don't see it on mac nor on ubuntu64. I get 70.6% coverage of lines and 90.9% of functions on ubuntu.


Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#23Michael Paquier
michael@paquier.xyz
In reply to: Mark Dilger (#22)
1 attachment(s)
Re: speed up unicode decomposition and recomposition

On Fri, Oct 23, 2020 at 04:18:13PM -0700, Mark Dilger wrote:

On Oct 23, 2020, at 9:07 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

genhtml: WARNING: function data mismatch at /home/postgres/pgsql/src/common/unicode_norm.c:102

I've never seen anything like that before. I suppose it means that
something about 783f0cc64 is a bit fishy, but I don't know what.

The emitted coverage report looks fairly normal anyway. It says
unicode_norm.c has zero test coverage, which is very possibly correct
since I wasn't running in UTF8 encoding, but I'm not entirely sure of
that either.

I don't see it on mac nor on ubuntu64. I get 70.6% coverage of
lines and 90.9% of functions on ubuntu.

I can see the problem on Debian GID with lcov 1.14-2. This points to
the second declaration of get_code_entry(). I think that genhtml,
because it considers the code of unicode_norm.c as a whole without its
CFLAGS, gets confused because it finds the same function to index as
defined twice. It expects only one definition, hence the warning. So
I think that this can lead to some incorrect data in the HTML report,
and the attached patch takes care of fixing that. Tom, does it take
care of the issue on your side?
--
Michael

Attachments:

unicode-coverage-fix.patchtext/x-diff; charset=us-asciiDownload
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index 4ffce0e619..7cc8faa63a 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -53,11 +53,26 @@
  * The backend version of this code uses a perfect hash function for the
  * lookup, while the frontend version uses a binary search.
  */
-#ifndef FRONTEND
+#ifdef FRONTEND
+/* comparison routine for bsearch() of decomposition lookup table. */
+static int
+conv_compare(const void *p1, const void *p2)
+{
+	uint32		v1,
+				v2;
+
+	v1 = *(const uint32 *) p1;
+	v2 = ((const pg_unicode_decomposition *) p2)->codepoint;
+	return (v1 > v2) ? 1 : ((v1 == v2) ? 0 : -1);
+}
+
+#endif
 
 static const pg_unicode_decomposition *
 get_code_entry(pg_wchar code)
 {
+#ifndef FRONTEND
+
 	int			h;
 	uint32		hashkey;
 	pg_unicode_decompinfo decompinfo = UnicodeDecompInfo;
@@ -82,33 +97,17 @@ get_code_entry(pg_wchar code)
 
 	/* Success! */
 	return &decompinfo.decomps[h];
-}
 
 #else
 
-/* comparison routine for bsearch() of decomposition lookup table. */
-static int
-conv_compare(const void *p1, const void *p2)
-{
-	uint32		v1,
-				v2;
-
-	v1 = *(const uint32 *) p1;
-	v2 = ((const pg_unicode_decomposition *) p2)->codepoint;
-	return (v1 > v2) ? 1 : ((v1 == v2) ? 0 : -1);
-}
-
-static const pg_unicode_decomposition *
-get_code_entry(pg_wchar code)
-{
 	return bsearch(&(code),
 				   UnicodeDecompMain,
 				   lengthof(UnicodeDecompMain),
 				   sizeof(pg_unicode_decomposition),
 				   conv_compare);
+#endif
 }
 
-#endif							/* !FRONTEND */
 
 /*
  * Given a decomposition entry looked up earlier, get the decomposed
#24Tom Lane
tgl@sss.pgh.pa.us
In reply to: Michael Paquier (#23)
Re: speed up unicode decomposition and recomposition

Michael Paquier <michael@paquier.xyz> writes:

On Fri, Oct 23, 2020 at 04:18:13PM -0700, Mark Dilger wrote:

On Oct 23, 2020, at 9:07 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

genhtml: WARNING: function data mismatch at /home/postgres/pgsql/src/common/unicode_norm.c:102

I can see the problem on Debian GID with lcov 1.14-2. This points to
the second declaration of get_code_entry(). I think that genhtml,
because it considers the code of unicode_norm.c as a whole without its
CFLAGS, gets confused because it finds the same function to index as
defined twice. It expects only one definition, hence the warning. So
I think that this can lead to some incorrect data in the HTML report,
and the attached patch takes care of fixing that. Tom, does it take
care of the issue on your side?

Good catch! Yeah, that fixes it for me.

I'd advise not putting conv_compare() between get_code_entry() and
the header comment for get_code_entry(). Looks good otherwise.

regards, tom lane

#25Michael Paquier
michael@paquier.xyz
In reply to: Tom Lane (#24)
Re: speed up unicode decomposition and recomposition

On Fri, Oct 23, 2020 at 08:24:06PM -0400, Tom Lane wrote:

I'd advise not putting conv_compare() between get_code_entry() and
the header comment for get_code_entry(). Looks good otherwise.

Indeed. I have adjusted the position of the comment, and applied the
fix. Thanks for the report.
--
Michael

#26John Naylor
john.naylor@enterprisedb.com
In reply to: Michael Paquier (#25)
1 attachment(s)
Re: speed up unicode decomposition and recomposition

There is a latent bug in the way code pairs for recomposition are sorted
due to a copy-pasto on my part. Makes no difference now, but it could in
the future. While looking, it seems pg_bswap.h should actually be
backend-only. Both fixed in the attached.

--
John Naylor
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

Attachments:

minor-fixes-in-unicode-norm.patchapplication/octet-stream; name=minor-fixes-in-unicode-norm.patchDownload
diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl
index e4d3ccc234..804841c1b1 100644
--- a/src/common/unicode/generate-unicode_norm_table.pl
+++ b/src/common/unicode/generate-unicode_norm_table.pl
@@ -400,7 +400,7 @@ sub recomp_sort
 	my $bcode = hex($b->{code});
 
 	return -1 if $acode < $bcode;
-	return -1 if $acode > $bcode;
+	return 1 if $acode > $bcode;
 
 	die "found duplicate entries of recomposeable code pairs";
 }
diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c
index abb83cbf98..d46e33d322 100644
--- a/src/common/unicode_norm.c
+++ b/src/common/unicode_norm.c
@@ -22,10 +22,10 @@
 #ifndef FRONTEND
 #include "common/unicode_norm_hashfunc.h"
 #include "common/unicode_normprops_table.h"
+#include "port/pg_bswap.h"
 #else
 #include "common/unicode_norm_table.h"
 #endif
-#include "port/pg_bswap.h"
 
 #ifndef FRONTEND
 #define ALLOC(size) palloc(size)
#27Michael Paquier
michael@paquier.xyz
In reply to: John Naylor (#26)
Re: speed up unicode decomposition and recomposition

On Fri, Nov 06, 2020 at 06:20:00PM -0400, John Naylor wrote:

There is a latent bug in the way code pairs for recomposition are sorted
due to a copy-pasto on my part. Makes no difference now, but it could in
the future. While looking, it seems pg_bswap.h should actually be
backend-only. Both fixed in the attached.

Thanks John. Both look right to me. I'll apply both in a bit.
--
Michael

#28Michael Paquier
michael@paquier.xyz
In reply to: Michael Paquier (#27)
Re: speed up unicode decomposition and recomposition

On Sat, Nov 07, 2020 at 09:29:30AM +0900, Michael Paquier wrote:

Thanks John. Both look right to me. I'll apply both in a bit.

Done that now. Just for the note: you forgot to run pgperltidy.
--
Michael