From ee1ac8f16d0b881336e886b54566851c78b070cc Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 3 Mar 2017 14:40:23 +0900 Subject: [PATCH 10/10] Consider characters excluded from composition in conversion tables Noted by Kyotaro Horiguchi. --- src/common/utf_norm_generate.pl | 111 ++++++++++++++++++++++++ src/include/common/utf_norm_table.h | 164 +----------------------------------- 2 files changed, 113 insertions(+), 162 deletions(-) diff --git a/src/common/utf_norm_generate.pl b/src/common/utf_norm_generate.pl index 73c7925572..e03316e074 100644 --- a/src/common/utf_norm_generate.pl +++ b/src/common/utf_norm_generate.pl @@ -43,6 +43,93 @@ my $input_file = $ARGV[0]; my $output_file = $ARGV[1]; my $output_base = basename($output_file); +# Script-specific and post composition that need to be excluded from the tables +# generated per http://www.unicode.org/reports/tr15/. +my @no_recomp_codes = ( + '0958', # DEVANAGARI LETTER QA + '0959', # DEVANAGARI LETTER KHHA + '095A', # DEVANAGARI LETTER GHHA + '095B', # DEVANAGARI LETTER ZA + '095C', # DEVANAGARI LETTER DDDHA + '095D', # DEVANAGARI LETTER RHA + '095E', # DEVANAGARI LETTER FA + '095F', # DEVANAGARI LETTER YYA + '09DC', # BENGALI LETTER RRA + '09DD', # BENGALI LETTER RHA + '09DF', # BENGALI LETTER YYA + '0A33', # GURMUKHI LETTER LLA + '0A36', # GURMUKHI LETTER SHA + '0A59', # GURMUKHI LETTER KHHA + '0A5A', # GURMUKHI LETTER GHHA + '0A5B', # GURMUKHI LETTER ZA + '0A5E', # GURMUKHI LETTER FA + '0B5C', # ORIYA LETTER RRA + '0B5D', # ORIYA LETTER RHA + '0F43', # TIBETAN LETTER GHA + '0F4D', # TIBETAN LETTER DDHA + '0F52', # TIBETAN LETTER DHA + '0F57', # TIBETAN LETTER BHA + '0F5C', # TIBETAN LETTER DZHA + '0F69', # TIBETAN LETTER KSSA + '0F76', # TIBETAN VOWEL SIGN VOCALIC R + '0F78', # TIBETAN VOWEL SIGN VOCALIC L + '0F93', # TIBETAN SUBJOINED LETTER GHA + '0F9D', # TIBETAN SUBJOINED LETTER DDHA + '0FA2', # TIBETAN SUBJOINED LETTER DHA + '0FA7', # TIBETAN SUBJOINED LETTER BHA + '0FAC', # TIBETAN SUBJOINED LETTER DZHA + '0FB9', # TIBETAN SUBJOINED LETTER KSSA + # 'FB1D' # HEBREW LETTER YOD WITH HIRIQ: see below for $OPTYWH + 'FB1F', # HEBREW LIGATURE YIDDISH YOD YOD PATAH + 'FB2A', # HEBREW LETTER SHIN WITH SHIN DOT + 'FB2B', # HEBREW LETTER SHIN WITH SIN DOT + 'FB2C', # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT + 'FB2D', # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT + 'FB2E', # HEBREW LETTER ALEF WITH PATAH + 'FB2F', # HEBREW LETTER ALEF WITH QAMATS + 'FB30', # HEBREW LETTER ALEF WITH MAPIQ + 'FB31', # HEBREW LETTER BET WITH DAGESH + 'FB32', # HEBREW LETTER GIMEL WITH DAGESH + 'FB33', # HEBREW LETTER DALET WITH DAGESH + 'FB34', # HEBREW LETTER HE WITH MAPIQ + 'FB35', # HEBREW LETTER VAV WITH DAGESH + 'FB36', # HEBREW LETTER ZAYIN WITH DAGESH + 'FB38', # HEBREW LETTER TET WITH DAGESH + 'FB39', # HEBREW LETTER YOD WITH DAGESH + 'FB3A', # HEBREW LETTER FINAL KAF WITH DAGESH + 'FB3B', # HEBREW LETTER KAF WITH DAGESH + 'FB3C', # HEBREW LETTER LAMED WITH DAGESH + 'FB3E', # HEBREW LETTER MEM WITH DAGESH + 'FB40', # HEBREW LETTER NUN WITH DAGESH + 'FB41', # HEBREW LETTER SAMEKH WITH DAGESH + 'FB43', # HEBREW LETTER FINAL PE WITH DAGESH + 'FB44', # HEBREW LETTER PE WITH DAGESH + 'FB46', # HEBREW LETTER TSADI WITH DAGESH + 'FB47', # HEBREW LETTER QOF WITH DAGESH + 'FB48', # HEBREW LETTER RESH WITH DAGESH + 'FB49', # HEBREW LETTER SHIN WITH DAGESH + 'FB4A', # HEBREW LETTER TAV WITH DAGESH + 'FB4B', # HEBREW LETTER VAV WITH HOLAM + 'FB4C', # HEBREW LETTER BET WITH RAFE + 'FB4D', # HEBREW LETTER KAF WITH RAFE + 'FB4E', # HEBREW LETTER PE WITH RAFE + ## post composition exclusion + '2ADC', # FORKING + '1D15E', # MUSICAL SYMBOL HALF NOTE + '1D15F', # MUSICAL SYMBOL QUARTER NOTE + '1D160', # MUSICAL SYMBOL EIGHTH NOTE + '1D161', # MUSICAL SYMBOL SIXTEENTH NOTE + '1D162', # MUSICAL SYMBOL THIRTY-SECOND NOTE + '1D163', # MUSICAL SYMBOL SIXTY-FOURTH NOTE + '1D164', # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE + '1D1BB', # MUSICAL SYMBOL MINIMA + '1D1BC', # MUSICAL SYMBOL MINIMA BLACK + '1D1BD', # MUSICAL SYMBOL SEMIMINIMA WHITE + '1D1BE', # MUSICAL SYMBOL SEMIMINIMA BLACK + '1D1BF', # MUSICAL SYMBOL FUSA WHITE + '1D1C0' # MUSICAL SYMBOL FUSA BLACK + ); + # Count number of lines in input file to get size of table. my $input_lines = 0; open(my $FH, $input_file) or die "Could not open input file $input_file: $!."; @@ -54,6 +141,18 @@ while (my $line = <$FH>) # Skip codes longer than 4 bytes, or 8 characters. next if length($code) > 8; + # Skip codes that cannot be composed + my $found_no_recomp = 0; + foreach my $lcode (@no_recomp_codes) + { + if ($lcode eq $elts[0]) + { + $found_no_recomp = 1; + last; + } + } + next if $found_no_recomp; + # Skip characters with no decompositions and a class of 0. next if $elts[3] eq '0' && $elts[5] eq ''; @@ -116,6 +215,18 @@ while ( my $line = <$INPUT> ) # Skip codes longer than 4 bytes, or 8 characters. next if length($code) > 8; + # Skip codes that cannot be composed + my $found_no_recomp = 0; + foreach my $lcode (@no_recomp_codes) + { + if ($lcode eq $elts[0]) + { + $found_no_recomp = 1; + last; + } + } + next if $found_no_recomp; + # Skip characters with no decompositions and a class of 0. # to reduce the table size. next if $elts[3] eq '0' && $elts[5] eq ''; diff --git a/src/include/common/utf_norm_table.h b/src/include/common/utf_norm_table.h index e84f9fd693..9fa3b7ca99 100644 --- a/src/include/common/utf_norm_table.h +++ b/src/include/common/utf_norm_table.h @@ -24,7 +24,7 @@ typedef struct } pg_utf_decomposition; /* conversion table */ -static const pg_utf_decomposition UtfDecompMain[ 6532 ] = +static const pg_utf_decomposition UtfDecompMain[ 6452 ] = { {0xc2a0, 0x00, 1}, {0xc2a8, 0x00, 2}, @@ -766,29 +766,12 @@ static const pg_utf_decomposition UtfDecompMain[ 6532 ] = {0xe0a592, 0xdc, 0}, {0xe0a593, 0xe6, 0}, {0xe0a594, 0xe6, 0}, - {0xe0a598, 0x00, 2}, - {0xe0a599, 0x00, 2}, - {0xe0a59a, 0x00, 2}, - {0xe0a59b, 0x00, 2}, - {0xe0a59c, 0x00, 2}, - {0xe0a59d, 0x00, 2}, - {0xe0a59e, 0x00, 2}, - {0xe0a59f, 0x00, 2}, {0xe0a6bc, 0x07, 0}, {0xe0a78b, 0x00, 2}, {0xe0a78c, 0x00, 2}, {0xe0a78d, 0x09, 0}, - {0xe0a79c, 0x00, 2}, - {0xe0a79d, 0x00, 2}, - {0xe0a79f, 0x00, 2}, - {0xe0a8b3, 0x00, 2}, - {0xe0a8b6, 0x00, 2}, {0xe0a8bc, 0x07, 0}, {0xe0a98d, 0x09, 0}, - {0xe0a999, 0x00, 2}, - {0xe0a99a, 0x00, 2}, - {0xe0a99b, 0x00, 2}, - {0xe0a99e, 0x00, 2}, {0xe0aabc, 0x07, 0}, {0xe0ab8d, 0x09, 0}, {0xe0acbc, 0x07, 0}, @@ -796,8 +779,6 @@ static const pg_utf_decomposition UtfDecompMain[ 6532 ] = {0xe0ad8b, 0x00, 2}, {0xe0ad8c, 0x00, 2}, {0xe0ad8d, 0x09, 0}, - {0xe0ad9c, 0x00, 2}, - {0xe0ad9d, 0x00, 2}, {0xe0ae94, 0x00, 2}, {0xe0af8a, 0x00, 2}, {0xe0af8b, 0x00, 2}, @@ -846,20 +827,12 @@ static const pg_utf_decomposition UtfDecompMain[ 6532 ] = {0xe0bcb5, 0xdc, 0}, {0xe0bcb7, 0xdc, 0}, {0xe0bcb9, 0xd8, 0}, - {0xe0bd83, 0x00, 2}, - {0xe0bd8d, 0x00, 2}, - {0xe0bd92, 0x00, 2}, - {0xe0bd97, 0x00, 2}, - {0xe0bd9c, 0x00, 2}, - {0xe0bda9, 0x00, 2}, {0xe0bdb1, 0x81, 0}, {0xe0bdb2, 0x82, 0}, {0xe0bdb3, 0x00, 2}, {0xe0bdb4, 0x84, 0}, {0xe0bdb5, 0x00, 2}, - {0xe0bdb6, 0x00, 2}, {0xe0bdb7, 0x00, 2}, - {0xe0bdb8, 0x00, 2}, {0xe0bdb9, 0x00, 2}, {0xe0bdba, 0x82, 0}, {0xe0bdbb, 0x82, 0}, @@ -872,12 +845,6 @@ static const pg_utf_decomposition UtfDecompMain[ 6532 ] = {0xe0be84, 0x09, 0}, {0xe0be86, 0xe6, 0}, {0xe0be87, 0xe6, 0}, - {0xe0be93, 0x00, 2}, - {0xe0be9d, 0x00, 2}, - {0xe0bea2, 0x00, 2}, - {0xe0bea7, 0x00, 2}, - {0xe0beac, 0x00, 2}, - {0xe0beb9, 0x00, 2}, {0xe0bf86, 0xdc, 0}, {0xe180a6, 0x00, 2}, {0xe180b7, 0x07, 0}, @@ -2008,7 +1975,6 @@ static const pg_utf_decomposition UtfDecompMain[ 6532 ] = {0xe2a9b4, 0x00, 3}, {0xe2a9b5, 0x00, 2}, {0xe2a9b6, 0x00, 3}, - {0xe2ab9c, 0x00, 2}, {0xe2b1bc, 0x00, 1}, {0xe2b1bd, 0x00, 1}, {0xe2b3af, 0xe6, 0}, @@ -3483,7 +3449,6 @@ static const pg_utf_decomposition UtfDecompMain[ 6532 ] = {0xefac97, 0x00, 2}, {0xefac9d, 0x00, 2}, {0xefac9e, 0x1a, 0}, - {0xefac9f, 0x00, 2}, {0xefaca0, 0x00, 1}, {0xefaca1, 0x00, 1}, {0xefaca2, 0x00, 1}, @@ -3494,38 +3459,6 @@ static const pg_utf_decomposition UtfDecompMain[ 6532 ] = {0xefaca7, 0x00, 1}, {0xefaca8, 0x00, 1}, {0xefaca9, 0x00, 1}, - {0xefacaa, 0x00, 2}, - {0xefacab, 0x00, 2}, - {0xefacac, 0x00, 2}, - {0xefacad, 0x00, 2}, - {0xefacae, 0x00, 2}, - {0xefacaf, 0x00, 2}, - {0xefacb0, 0x00, 2}, - {0xefacb1, 0x00, 2}, - {0xefacb2, 0x00, 2}, - {0xefacb3, 0x00, 2}, - {0xefacb4, 0x00, 2}, - {0xefacb5, 0x00, 2}, - {0xefacb6, 0x00, 2}, - {0xefacb8, 0x00, 2}, - {0xefacb9, 0x00, 2}, - {0xefacba, 0x00, 2}, - {0xefacbb, 0x00, 2}, - {0xefacbc, 0x00, 2}, - {0xefacbe, 0x00, 2}, - {0xefad80, 0x00, 2}, - {0xefad81, 0x00, 2}, - {0xefad83, 0x00, 2}, - {0xefad84, 0x00, 2}, - {0xefad86, 0x00, 2}, - {0xefad87, 0x00, 2}, - {0xefad88, 0x00, 2}, - {0xefad89, 0x00, 2}, - {0xefad8a, 0x00, 2}, - {0xefad8b, 0x00, 2}, - {0xefad8c, 0x00, 2}, - {0xefad8d, 0x00, 2}, - {0xefad8e, 0x00, 2}, {0xefad8f, 0x00, 2}, {0xefad90, 0x00, 1}, {0xefad91, 0x00, 1}, @@ -4646,13 +4579,6 @@ static const pg_utf_decomposition UtfDecompMain[ 6532 ] = {0xe19ab335, 0xe6, 0}, {0xe19ab336, 0xe6, 0}, {0xe1af8945, 0x01, 0}, - {0xe1b49545, 0x00, 2}, - {0xe1b49546, 0x00, 2}, - {0xe1b49630, 0x00, 2}, - {0xe1b49631, 0x00, 2}, - {0xe1b49632, 0x00, 2}, - {0xe1b49633, 0x00, 2}, - {0xe1b49634, 0x00, 2}, {0xe1b49635, 0xd8, 0}, {0xe1b49636, 0xd8, 0}, {0xe1b49637, 0x01, 0}, @@ -4683,12 +4609,6 @@ static const pg_utf_decomposition UtfDecompMain[ 6532 ] = {0xe1b49a42, 0xe6, 0}, {0xe1b49a43, 0xe6, 0}, {0xe1b49a44, 0xe6, 0}, - {0xe1b49b42, 0x00, 2}, - {0xe1b49b43, 0x00, 2}, - {0xe1b49b44, 0x00, 2}, - {0xe1b49b45, 0x00, 2}, - {0xe1b49b46, 0x00, 2}, - {0xe1b49c30, 0x00, 2}, {0xe1b4a432, 0xe6, 0}, {0xe1b4a433, 0xe6, 0}, {0xe1b4a434, 0xe6, 0}, @@ -10146,7 +10066,7 @@ typedef struct uint32 decomp[2]; /* size of decomposition code list */ } pg_utf_decomposition_size_2; -static const pg_utf_decomposition_size_2 UtfDecomp_2 [ 1671 ] = +static const pg_utf_decomposition_size_2 UtfDecomp_2 [ 1591 ] = { {0xc2a8, {0x20, 0xcc88}}, {0xc2af, {0x20, 0xcc84}}, @@ -10521,30 +10441,11 @@ static const pg_utf_decomposition_size_2 UtfDecomp_2 [ 1671 ] = {0xe0a4a9, {0xe0a4a8, 0xe0a4bc}}, {0xe0a4b1, {0xe0a4b0, 0xe0a4bc}}, {0xe0a4b4, {0xe0a4b3, 0xe0a4bc}}, - {0xe0a598, {0xe0a495, 0xe0a4bc}}, - {0xe0a599, {0xe0a496, 0xe0a4bc}}, - {0xe0a59a, {0xe0a497, 0xe0a4bc}}, - {0xe0a59b, {0xe0a49c, 0xe0a4bc}}, - {0xe0a59c, {0xe0a4a1, 0xe0a4bc}}, - {0xe0a59d, {0xe0a4a2, 0xe0a4bc}}, - {0xe0a59e, {0xe0a4ab, 0xe0a4bc}}, - {0xe0a59f, {0xe0a4af, 0xe0a4bc}}, {0xe0a78b, {0xe0a787, 0xe0a6be}}, {0xe0a78c, {0xe0a787, 0xe0a797}}, - {0xe0a79c, {0xe0a6a1, 0xe0a6bc}}, - {0xe0a79d, {0xe0a6a2, 0xe0a6bc}}, - {0xe0a79f, {0xe0a6af, 0xe0a6bc}}, - {0xe0a8b3, {0xe0a8b2, 0xe0a8bc}}, - {0xe0a8b6, {0xe0a8b8, 0xe0a8bc}}, - {0xe0a999, {0xe0a896, 0xe0a8bc}}, - {0xe0a99a, {0xe0a897, 0xe0a8bc}}, - {0xe0a99b, {0xe0a89c, 0xe0a8bc}}, - {0xe0a99e, {0xe0a8ab, 0xe0a8bc}}, {0xe0ad88, {0xe0ad87, 0xe0ad96}}, {0xe0ad8b, {0xe0ad87, 0xe0acbe}}, {0xe0ad8c, {0xe0ad87, 0xe0ad97}}, - {0xe0ad9c, {0xe0aca1, 0xe0acbc}}, - {0xe0ad9d, {0xe0aca2, 0xe0acbc}}, {0xe0ae94, {0xe0ae92, 0xe0af97}}, {0xe0af8a, {0xe0af86, 0xe0aebe}}, {0xe0af8b, {0xe0af87, 0xe0aebe}}, @@ -10566,25 +10467,11 @@ static const pg_utf_decomposition_size_2 UtfDecomp_2 [ 1671 ] = {0xe0bab3, {0xe0bb8d, 0xe0bab2}}, {0xe0bb9c, {0xe0baab, 0xe0ba99}}, {0xe0bb9d, {0xe0baab, 0xe0baa1}}, - {0xe0bd83, {0xe0bd82, 0xe0beb7}}, - {0xe0bd8d, {0xe0bd8c, 0xe0beb7}}, - {0xe0bd92, {0xe0bd91, 0xe0beb7}}, - {0xe0bd97, {0xe0bd96, 0xe0beb7}}, - {0xe0bd9c, {0xe0bd9b, 0xe0beb7}}, - {0xe0bda9, {0xe0bd80, 0xe0beb5}}, {0xe0bdb3, {0xe0bdb1, 0xe0bdb2}}, {0xe0bdb5, {0xe0bdb1, 0xe0bdb4}}, - {0xe0bdb6, {0xe0beb2, 0xe0be80}}, {0xe0bdb7, {0xe0beb2, 0xe0be81}}, - {0xe0bdb8, {0xe0beb3, 0xe0be80}}, {0xe0bdb9, {0xe0beb3, 0xe0be81}}, {0xe0be81, {0xe0bdb1, 0xe0be80}}, - {0xe0be93, {0xe0be92, 0xe0beb7}}, - {0xe0be9d, {0xe0be9c, 0xe0beb7}}, - {0xe0bea2, {0xe0bea1, 0xe0beb7}}, - {0xe0bea7, {0xe0bea6, 0xe0beb7}}, - {0xe0beac, {0xe0beab, 0xe0beb7}}, - {0xe0beb9, {0xe0be90, 0xe0beb5}}, {0xe180a6, {0xe180a5, 0xe180ae}}, {0xe1ac86, {0xe1ac85, 0xe1acb5}}, {0xe1ac88, {0xe1ac87, 0xe1acb5}}, @@ -11149,7 +11036,6 @@ static const pg_utf_decomposition_size_2 UtfDecomp_2 [ 1671 ] = {0xe2928f, {0x38, 0x2e}}, {0xe29290, {0x39, 0x2e}}, {0xe2a9b5, {0x3d, 0x3d}}, - {0xe2ab9c, {0xe2ab9d, 0xccb8}}, {0xe3818c, {0xe3818b, 0xe38299}}, {0xe3818e, {0xe3818d, 0xe38299}}, {0xe38190, {0xe3818f, 0xe38299}}, @@ -11388,39 +11274,6 @@ static const pg_utf_decomposition_size_2 UtfDecomp_2 [ 1671 ] = {0xefac96, {0xd5be, 0xd5b6}}, {0xefac97, {0xd5b4, 0xd5ad}}, {0xefac9d, {0xd799, 0xd6b4}}, - {0xefac9f, {0xd7b2, 0xd6b7}}, - {0xefacaa, {0xd7a9, 0xd781}}, - {0xefacab, {0xd7a9, 0xd782}}, - {0xefacac, {0xefad89, 0xd781}}, - {0xefacad, {0xefad89, 0xd782}}, - {0xefacae, {0xd790, 0xd6b7}}, - {0xefacaf, {0xd790, 0xd6b8}}, - {0xefacb0, {0xd790, 0xd6bc}}, - {0xefacb1, {0xd791, 0xd6bc}}, - {0xefacb2, {0xd792, 0xd6bc}}, - {0xefacb3, {0xd793, 0xd6bc}}, - {0xefacb4, {0xd794, 0xd6bc}}, - {0xefacb5, {0xd795, 0xd6bc}}, - {0xefacb6, {0xd796, 0xd6bc}}, - {0xefacb8, {0xd798, 0xd6bc}}, - {0xefacb9, {0xd799, 0xd6bc}}, - {0xefacba, {0xd79a, 0xd6bc}}, - {0xefacbb, {0xd79b, 0xd6bc}}, - {0xefacbc, {0xd79c, 0xd6bc}}, - {0xefacbe, {0xd79e, 0xd6bc}}, - {0xefad80, {0xd7a0, 0xd6bc}}, - {0xefad81, {0xd7a1, 0xd6bc}}, - {0xefad83, {0xd7a3, 0xd6bc}}, - {0xefad84, {0xd7a4, 0xd6bc}}, - {0xefad86, {0xd7a6, 0xd6bc}}, - {0xefad87, {0xd7a7, 0xd6bc}}, - {0xefad88, {0xd7a8, 0xd6bc}}, - {0xefad89, {0xd7a9, 0xd6bc}}, - {0xefad8a, {0xd7aa, 0xd6bc}}, - {0xefad8b, {0xd795, 0xd6b9}}, - {0xefad8c, {0xd791, 0xd6bf}}, - {0xefad8d, {0xd79b, 0xd6bf}}, - {0xefad8e, {0xd7a4, 0xd6bf}}, {0xefad8f, {0xd790, 0xd79c}}, {0xefafaa, {0xd8a6, 0xd8a7}}, {0xefafab, {0xd8a6, 0xd8a7}}, @@ -11783,19 +11636,6 @@ static const pg_utf_decomposition_size_2 UtfDecomp_2 [ 1671 ] = {0xe1858b45, {0xe1858b39, 0xe1858b44}}, {0xe1859b41, {0xe1859b38, 0xe1859a46}}, {0xe1859b42, {0xe1859b39, 0xe1859a46}}, - {0xe1b49545, {0xe1b49537, 0xe1b49635}}, - {0xe1b49546, {0xe1b49538, 0xe1b49635}}, - {0xe1b49630, {0xe1b49546, 0xe1b49645}}, - {0xe1b49631, {0xe1b49546, 0xe1b49646}}, - {0xe1b49632, {0xe1b49546, 0xe1b49730}}, - {0xe1b49633, {0xe1b49546, 0xe1b49731}}, - {0xe1b49634, {0xe1b49546, 0xe1b49732}}, - {0xe1b49b42, {0xe1b49b39, 0xe1b49635}}, - {0xe1b49b43, {0xe1b49b41, 0xe1b49635}}, - {0xe1b49b44, {0xe1b49b42, 0xe1b49645}}, - {0xe1b49b45, {0xe1b49b43, 0xe1b49645}}, - {0xe1b49b46, {0xe1b49b42, 0xe1b49646}}, - {0xe1b49c30, {0xe1b49b43, 0xe1b49646}}, {0xe1bc9030, {0x30, 0x2e}}, {0xe1bc9031, {0x30, 0x2c}}, {0xe1bc9032, {0x31, 0x2c}}, -- 2.12.0