From e707607ab0c9935ea744e43bc2b2948b5502360b Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Thu, 30 Jan 2014 05:04:28 +0200 Subject: Update HB to 7691a154e50f8c8c77bbd94787686262955bf5d4 Change-Id: I7dae9d74f338d3beeb1677a1676a07b66c05bb93 Reviewed-by: Lars Knoll --- .../harfbuzz-ng/include/harfbuzz/hb-ot-shape.h | 1 + src/3rdparty/harfbuzz-ng/src/config.h | 4 + .../harfbuzz-ng/src/hb-buffer-serialize.cc | 2 +- src/3rdparty/harfbuzz-ng/src/hb-common.h | 8 +- src/3rdparty/harfbuzz-ng/src/hb-fallback-shape.cc | 138 -- src/3rdparty/harfbuzz-ng/src/hb-font-private.hh | 6 + .../harfbuzz-ng/src/hb-open-type-private.hh | 2 +- .../harfbuzz-ng/src/hb-ot-layout-gpos-table.hh | 28 +- src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h | 5 - .../harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc | 3 +- .../harfbuzz-ng/src/hb-ot-shape-complex-default.cc | 184 +- .../harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc | 417 ++++ .../harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc | 172 ++ .../src/hb-ot-shape-complex-indic-machine.hh | 2083 ++++++++++++-------- .../harfbuzz-ng/src/hb-ot-shape-complex-indic.cc | 8 +- .../src/hb-ot-shape-complex-myanmar-machine.hh | 369 ++-- .../harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc | 9 +- .../harfbuzz-ng/src/hb-ot-shape-complex-private.hh | 38 +- .../harfbuzz-ng/src/hb-ot-shape-complex-sea.cc | 9 +- .../harfbuzz-ng/src/hb-ot-shape-complex-thai.cc | 4 +- .../harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc | 61 + .../harfbuzz-ng/src/hb-ot-shape-fallback.cc | 6 +- .../src/hb-ot-shape-normalize-private.hh | 1 + .../harfbuzz-ng/src/hb-ot-shape-normalize.cc | 36 +- .../harfbuzz-ng/src/hb-ot-shape-private.hh | 15 + src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc | 58 +- src/3rdparty/harfbuzz-ng/src/hb-ot-shape.h | 54 + src/3rdparty/harfbuzz-ng/src/hb-ot.h | 9 +- src/3rdparty/harfbuzz-ng/src/hb-private.hh | 6 + src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh | 2 + src/3rdparty/harfbuzz-ng/src/hb-unicode-private.hh | 21 +- src/3rdparty/harfbuzz.pri | 5 +- 32 files changed, 2307 insertions(+), 1457 deletions(-) create mode 100644 src/3rdparty/harfbuzz-ng/include/harfbuzz/hb-ot-shape.h delete mode 100644 src/3rdparty/harfbuzz-ng/src/hb-fallback-shape.cc create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-ot-shape.h diff --git a/src/3rdparty/harfbuzz-ng/include/harfbuzz/hb-ot-shape.h b/src/3rdparty/harfbuzz-ng/include/harfbuzz/hb-ot-shape.h new file mode 100644 index 0000000000..ac21ff2f8c --- /dev/null +++ b/src/3rdparty/harfbuzz-ng/include/harfbuzz/hb-ot-shape.h @@ -0,0 +1 @@ +#include "../../src/hb-ot-shape.h" diff --git a/src/3rdparty/harfbuzz-ng/src/config.h b/src/3rdparty/harfbuzz-ng/src/config.h index fe9a450533..db706987fe 100644 --- a/src/3rdparty/harfbuzz-ng/src/config.h +++ b/src/3rdparty/harfbuzz-ng/src/config.h @@ -14,6 +14,10 @@ # define HB_INTERNAL Q_DECL_HIDDEN #endif +#if !defined(QT_NO_DEBUG) +# define NDEBUG +#endif + // because strdup() is not part of strict Posix, declare it here extern "C" char *strdup(const char *src); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer-serialize.cc b/src/3rdparty/harfbuzz-ng/src/hb-buffer-serialize.cc index 4541db23bd..263bc81dc4 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-buffer-serialize.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer-serialize.cc @@ -204,7 +204,7 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer, *p++ = '+'; p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance)); - if (pos->y_advance) + if (pos[i].y_advance) p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance)); } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-common.h b/src/3rdparty/harfbuzz-ng/src/hb-common.h index e445504550..c8bfd8825a 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-common.h +++ b/src/3rdparty/harfbuzz-ng/src/hb-common.h @@ -94,6 +94,7 @@ typedef uint32_t hb_tag_t; #define HB_UNTAG(tag) ((uint8_t)((tag)>>24)), ((uint8_t)((tag)>>16)), ((uint8_t)((tag)>>8)), ((uint8_t)(tag)) #define HB_TAG_NONE HB_TAG(0,0,0,0) +#define HB_TAG_MAX HB_TAG(0xff,0xff,0xff,0xff) /* len=-1 means str is NUL-terminated. */ hb_tag_t @@ -270,7 +271,12 @@ typedef enum /*6.1*/ HB_SCRIPT_TAKRI = HB_TAG ('T','a','k','r'), /* No script set. */ - /*---*/ HB_SCRIPT_INVALID = HB_TAG_NONE + /*---*/ HB_SCRIPT_INVALID = HB_TAG_NONE, + + /* Dummy value to ensure any hb_tag_t value can be passed/stored as hb_script_t + * without risking undefined behavior. */ + /*---*/ _HB_SCRIPT_MAX_VALUE = HB_TAG_MAX + } hb_script_t; /* These are moved out of hb_script_t because glib-mkenums chokes otherwise. */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-fallback-shape.cc b/src/3rdparty/harfbuzz-ng/src/hb-fallback-shape.cc deleted file mode 100644 index b894a4a47d..0000000000 --- a/src/3rdparty/harfbuzz-ng/src/hb-fallback-shape.cc +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright © 2011 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Behdad Esfahbod - */ - -#define HB_SHAPER fallback -#include "hb-shaper-impl-private.hh" - - -/* - * shaper face data - */ - -struct hb_fallback_shaper_face_data_t {}; - -hb_fallback_shaper_face_data_t * -_hb_fallback_shaper_face_data_create (hb_face_t *face HB_UNUSED) -{ - return (hb_fallback_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED; -} - -void -_hb_fallback_shaper_face_data_destroy (hb_fallback_shaper_face_data_t *data HB_UNUSED) -{ -} - - -/* - * shaper font data - */ - -struct hb_fallback_shaper_font_data_t {}; - -hb_fallback_shaper_font_data_t * -_hb_fallback_shaper_font_data_create (hb_font_t *font HB_UNUSED) -{ - return (hb_fallback_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED; -} - -void -_hb_fallback_shaper_font_data_destroy (hb_fallback_shaper_font_data_t *data HB_UNUSED) -{ -} - - -/* - * shaper shape_plan data - */ - -struct hb_fallback_shaper_shape_plan_data_t {}; - -hb_fallback_shaper_shape_plan_data_t * -_hb_fallback_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED, - const hb_feature_t *user_features HB_UNUSED, - unsigned int num_user_features HB_UNUSED) -{ - return (hb_fallback_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED; -} - -void -_hb_fallback_shaper_shape_plan_data_destroy (hb_fallback_shaper_shape_plan_data_t *data HB_UNUSED) -{ -} - - -/* - * shaper - */ - -hb_bool_t -_hb_fallback_shape (hb_shape_plan_t *shape_plan HB_UNUSED, - hb_font_t *font, - hb_buffer_t *buffer, - const hb_feature_t *features HB_UNUSED, - unsigned int num_features HB_UNUSED) -{ - /* TODO - * - * - Apply fallback kern. - * - Handle Variation Selectors? - * - Apply normalization? - * - * This will make the fallback shaper into a dumb "TrueType" - * shaper which many people unfortunately still request. - */ - - hb_codepoint_t space; - font->get_glyph (' ', 0, &space); - - buffer->clear_positions (); - - unsigned int count = buffer->len; - - for (unsigned int i = 0; i < count; i++) - { - if (buffer->unicode->is_default_ignorable (buffer->info[i].codepoint)) { - buffer->info[i].codepoint = space; - buffer->pos[i].x_advance = 0; - buffer->pos[i].y_advance = 0; - continue; - } - font->get_glyph (buffer->info[i].codepoint, 0, &buffer->info[i].codepoint); - font->get_glyph_advance_for_direction (buffer->info[i].codepoint, - buffer->props.direction, - &buffer->pos[i].x_advance, - &buffer->pos[i].y_advance); - font->subtract_glyph_origin_for_direction (buffer->info[i].codepoint, - buffer->props.direction, - &buffer->pos[i].x_offset, - &buffer->pos[i].y_offset); - } - - if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction)) - hb_buffer_reverse (buffer); - - return true; -} diff --git a/src/3rdparty/harfbuzz-ng/src/hb-font-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-font-private.hh index 431d0477c2..33bbf7143a 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-font-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-font-private.hh @@ -144,6 +144,12 @@ struct hb_font_t { /* Public getters */ + inline hb_bool_t has_glyph (hb_codepoint_t unicode) + { + hb_codepoint_t glyph; + return get_glyph (unicode, 0, &glyph); + } + inline hb_bool_t get_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector, hb_codepoint_t *glyph) { diff --git a/src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh index 437ecd57f8..558103a8ec 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-open-type-private.hh @@ -592,7 +592,7 @@ struct LONGDATETIME TRACE_SANITIZE (this); return TRACE_RETURN (likely (c->check_struct (this))); } - private: + protected: LONG major; ULONG minor; public: diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh index 5e4326ef0c..7c0a4ea666 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh @@ -109,11 +109,13 @@ struct ValueFormat : USHORT if (format & xPlacement) glyph_pos.x_offset += font->em_scale_x (get_short (values++)); if (format & yPlacement) glyph_pos.y_offset += font->em_scale_y (get_short (values++)); if (format & xAdvance) { - if (likely (horizontal)) glyph_pos.x_advance += font->em_scale_x (get_short (values++)); else values++; + if (likely (horizontal)) glyph_pos.x_advance += font->em_scale_x (get_short (values)); + values++; } /* y_advance values grow downward but font-space grows upward, hence negation */ if (format & yAdvance) { - if (unlikely (!horizontal)) glyph_pos.y_advance -= font->em_scale_y (get_short (values++)); else values++; + if (unlikely (!horizontal)) glyph_pos.y_advance -= font->em_scale_y (get_short (values)); + values++; } if (!has_device ()) return; @@ -125,17 +127,21 @@ struct ValueFormat : USHORT /* pixel -> fractional pixel */ if (format & xPlaDevice) { - if (x_ppem) glyph_pos.x_offset += (base + get_device (values++)).get_x_delta (font); else values++; + if (x_ppem) glyph_pos.x_offset += (base + get_device (values)).get_x_delta (font); + values++; } if (format & yPlaDevice) { - if (y_ppem) glyph_pos.y_offset += (base + get_device (values++)).get_y_delta (font); else values++; + if (y_ppem) glyph_pos.y_offset += (base + get_device (values)).get_y_delta (font); + values++; } if (format & xAdvDevice) { - if (horizontal && x_ppem) glyph_pos.x_advance += (base + get_device (values++)).get_x_delta (font); else values++; + if (horizontal && x_ppem) glyph_pos.x_advance += (base + get_device (values)).get_x_delta (font); + values++; } if (format & yAdvDevice) { /* y_advance values grow downward but font-space grows upward, hence negation */ - if (!horizontal && y_ppem) glyph_pos.y_advance -= (base + get_device (values++)).get_y_delta (font); else values++; + if (!horizontal && y_ppem) glyph_pos.y_advance -= (base + get_device (values)).get_y_delta (font); + values++; } } @@ -240,12 +246,12 @@ struct AnchorFormat2 unsigned int x_ppem = font->x_ppem; unsigned int y_ppem = font->y_ppem; hb_position_t cx, cy; - hb_bool_t ret = false; + hb_bool_t ret; - if (x_ppem || y_ppem) - ret = font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy); - *x = x_ppem && ret ? cx : font->em_scale_x (xCoordinate); - *y = y_ppem && ret ? cy : font->em_scale_y (yCoordinate); + ret = (x_ppem || y_ppem) && + font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy); + *x = ret && x_ppem ? cx : font->em_scale_x (xCoordinate); + *y = ret && y_ppem ? cy : font->em_scale_y (yCoordinate); } inline bool sanitize (hb_sanitize_context_t *c) { diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h index dfc7f2446f..d90eff374d 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h @@ -193,11 +193,6 @@ hb_ot_layout_collect_lookups (hb_face_t *face, const hb_tag_t *features, hb_set_t *lookup_indexes /* OUT */); -void -hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan, - hb_tag_t table_tag, - hb_set_t *lookup_indexes /* OUT */); - void hb_ot_layout_lookup_collect_glyphs (hb_face_t *face, hb_tag_t table_tag, diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc index 4f6c86e8ee..ea6d85c1e6 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc @@ -199,7 +199,6 @@ collect_features_arabic (hb_ot_shape_planner_t *plan) map->add_global_bool_feature (HB_TAG('c','a','l','t')); map->add_gsub_pause (NULL); - map->add_global_bool_feature (HB_TAG('c','s','w','h')); map->add_global_bool_feature (HB_TAG('m','s','e','t')); } @@ -366,7 +365,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic = data_create_arabic, data_destroy_arabic, NULL, /* preprocess_text_arabic */ - NULL, /* normalization_preference */ + HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, NULL, /* decompose */ NULL, /* compose */ setup_masks_arabic, diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-default.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-default.cc index d6afa0e1c1..f7f097eeda 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-default.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-default.cc @@ -27,194 +27,18 @@ #include "hb-ot-shape-complex-private.hh" -/* TODO Add kana, and other small shapers here */ - - -/* The default shaper *only* adds additional per-script features.*/ - -static const hb_tag_t hangul_features[] = -{ - HB_TAG('l','j','m','o'), - HB_TAG('v','j','m','o'), - HB_TAG('t','j','m','o'), - HB_TAG_NONE -}; - -static const hb_tag_t tibetan_features[] = -{ - HB_TAG('a','b','v','s'), - HB_TAG('b','l','w','s'), - HB_TAG('a','b','v','m'), - HB_TAG('b','l','w','m'), - HB_TAG_NONE -}; - -static void -collect_features_default (hb_ot_shape_planner_t *plan) -{ - const hb_tag_t *script_features = NULL; - - switch ((hb_tag_t) plan->props.script) - { - /* Unicode-1.1 additions */ - case HB_SCRIPT_HANGUL: - script_features = hangul_features; - break; - - /* Unicode-2.0 additions */ - case HB_SCRIPT_TIBETAN: - script_features = tibetan_features; - break; - } - - for (; script_features && *script_features; script_features++) - plan->map.add_global_bool_feature (*script_features); -} - -static hb_ot_shape_normalization_mode_t -normalization_preference_default (const hb_segment_properties_t *props) -{ - return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS; -} - -static bool -compose_default (const hb_ot_shape_normalize_context_t *c, - hb_codepoint_t a, - hb_codepoint_t b, - hb_codepoint_t *ab) -{ - /* Hebrew presentation-form shaping. - * https://bugzilla.mozilla.org/show_bug.cgi?id=728866 - * Hebrew presentation forms with dagesh, for characters 0x05D0..0x05EA; - * Note that some letters do not have a dagesh presForm encoded. - */ - static const hb_codepoint_t sDageshForms[0x05EA - 0x05D0 + 1] = { - 0xFB30, /* ALEF */ - 0xFB31, /* BET */ - 0xFB32, /* GIMEL */ - 0xFB33, /* DALET */ - 0xFB34, /* HE */ - 0xFB35, /* VAV */ - 0xFB36, /* ZAYIN */ - 0x0000, /* HET */ - 0xFB38, /* TET */ - 0xFB39, /* YOD */ - 0xFB3A, /* FINAL KAF */ - 0xFB3B, /* KAF */ - 0xFB3C, /* LAMED */ - 0x0000, /* FINAL MEM */ - 0xFB3E, /* MEM */ - 0x0000, /* FINAL NUN */ - 0xFB40, /* NUN */ - 0xFB41, /* SAMEKH */ - 0x0000, /* AYIN */ - 0xFB43, /* FINAL PE */ - 0xFB44, /* PE */ - 0x0000, /* FINAL TSADI */ - 0xFB46, /* TSADI */ - 0xFB47, /* QOF */ - 0xFB48, /* RESH */ - 0xFB49, /* SHIN */ - 0xFB4A /* TAV */ - }; - - bool found = c->unicode->compose (a, b, ab); - - if (!found && (b & ~0x7F) == 0x0580) { - /* Special-case Hebrew presentation forms that are excluded from - * standard normalization, but wanted for old fonts. */ - switch (b) { - case 0x05B4: /* HIRIQ */ - if (a == 0x05D9) { /* YOD */ - *ab = 0xFB1D; - found = true; - } - break; - case 0x05B7: /* patah */ - if (a == 0x05F2) { /* YIDDISH YOD YOD */ - *ab = 0xFB1F; - found = true; - } else if (a == 0x05D0) { /* ALEF */ - *ab = 0xFB2E; - found = true; - } - break; - case 0x05B8: /* QAMATS */ - if (a == 0x05D0) { /* ALEF */ - *ab = 0xFB2F; - found = true; - } - break; - case 0x05B9: /* HOLAM */ - if (a == 0x05D5) { /* VAV */ - *ab = 0xFB4B; - found = true; - } - break; - case 0x05BC: /* DAGESH */ - if (a >= 0x05D0 && a <= 0x05EA) { - *ab = sDageshForms[a - 0x05D0]; - found = (*ab != 0); - } else if (a == 0xFB2A) { /* SHIN WITH SHIN DOT */ - *ab = 0xFB2C; - found = true; - } else if (a == 0xFB2B) { /* SHIN WITH SIN DOT */ - *ab = 0xFB2D; - found = true; - } - break; - case 0x05BF: /* RAFE */ - switch (a) { - case 0x05D1: /* BET */ - *ab = 0xFB4C; - found = true; - break; - case 0x05DB: /* KAF */ - *ab = 0xFB4D; - found = true; - break; - case 0x05E4: /* PE */ - *ab = 0xFB4E; - found = true; - break; - } - break; - case 0x05C1: /* SHIN DOT */ - if (a == 0x05E9) { /* SHIN */ - *ab = 0xFB2A; - found = true; - } else if (a == 0xFB49) { /* SHIN WITH DAGESH */ - *ab = 0xFB2C; - found = true; - } - break; - case 0x05C2: /* SIN DOT */ - if (a == 0x05E9) { /* SHIN */ - *ab = 0xFB2B; - found = true; - } else if (a == 0xFB49) { /* SHIN WITH DAGESH */ - *ab = 0xFB2D; - found = true; - } - break; - } - } - - return found; -} - const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default = { "default", - collect_features_default, + NULL, /* collect_features */ NULL, /* override_features */ NULL, /* data_create */ NULL, /* data_destroy */ NULL, /* preprocess_text */ - normalization_preference_default, + HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, NULL, /* decompose */ - compose_default, + NULL, /* compose */ NULL, /* setup_masks */ - HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE, + HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT, true, /* fallback_position */ }; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc new file mode 100644 index 0000000000..47aa44fedb --- /dev/null +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc @@ -0,0 +1,417 @@ +/* + * Copyright © 2013 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#include "hb-ot-shape-complex-private.hh" + + +/* Hangul shaper */ + + +/* Same order as the feature array below */ +enum { + NONE, + + LJMO, + VJMO, + TJMO, + + FIRST_HANGUL_FEATURE = LJMO, + HANGUL_FEATURE_COUNT = TJMO + 1 +}; + +static const hb_tag_t hangul_features[HANGUL_FEATURE_COUNT] = +{ + HB_TAG_NONE, + HB_TAG('l','j','m','o'), + HB_TAG('v','j','m','o'), + HB_TAG('t','j','m','o') +}; + +static void +collect_features_hangul (hb_ot_shape_planner_t *plan) +{ + hb_ot_map_builder_t *map = &plan->map; + + for (unsigned int i = FIRST_HANGUL_FEATURE; i < HANGUL_FEATURE_COUNT; i++) + map->add_feature (hangul_features[i], 1, F_NONE); +} + +struct hangul_shape_plan_t +{ + ASSERT_POD (); + + hb_mask_t mask_array[HANGUL_FEATURE_COUNT]; +}; + +static void * +data_create_hangul (const hb_ot_shape_plan_t *plan) +{ + hangul_shape_plan_t *hangul_plan = (hangul_shape_plan_t *) calloc (1, sizeof (hangul_shape_plan_t)); + if (unlikely (!hangul_plan)) + return NULL; + + for (unsigned int i = 0; i < HANGUL_FEATURE_COUNT; i++) + hangul_plan->mask_array[i] = plan->map.get_1_mask (hangul_features[i]); + + return hangul_plan; +} + +static void +data_destroy_hangul (void *data) +{ + free (data); +} + +/* Constants for algorithmic hangul syllable [de]composition. */ +#define LBase 0x1100 +#define VBase 0x1161 +#define TBase 0x11A7 +#define LCount 19 +#define VCount 21 +#define TCount 28 +#define SBase 0xAC00 +#define NCount (VCount * TCount) +#define SCount (LCount * NCount) + +#define isCombiningL(u) (hb_in_range ((u), LBase, LBase+LCount-1)) +#define isCombiningV(u) (hb_in_range ((u), VBase, VBase+VCount-1)) +#define isCombiningT(u) (hb_in_range ((u), TBase+1, TBase+TCount-1)) +#define isCombinedS(u) (hb_in_range ((u), SBase, SBase+SCount-1)) + +#define isL(u) (hb_in_ranges ((u), 0x1100, 0x115F, 0xA960, 0xA97C)) +#define isV(u) (hb_in_ranges ((u), 0x1160, 0x11A7, 0xD7B0, 0xD7C6)) +#define isT(u) (hb_in_ranges ((u), 0x11A8, 0x11FF, 0xD7CB, 0xD7FB)) + +#define isHangulTone(u) (hb_in_range ((u), 0x302e, 0x302f)) + +/* buffer var allocations */ +#define hangul_shaping_feature() complex_var_u8_0() /* hangul jamo shaping feature */ + +static bool +is_zero_width_char (hb_font_t *font, + hb_codepoint_t unicode) +{ + hb_codepoint_t glyph; + return hb_font_get_glyph (font, unicode, 0, &glyph) && hb_font_get_glyph_h_advance (font, glyph) == 0; +} + +static void +preprocess_text_hangul (const hb_ot_shape_plan_t *plan, + hb_buffer_t *buffer, + hb_font_t *font) +{ + HB_BUFFER_ALLOCATE_VAR (buffer, hangul_shaping_feature); + + /* Hangul syllables come in two shapes: LV, and LVT. Of those: + * + * - LV can be precomposed, or decomposed. Lets call those + * and , + * - LVT can be fully precomposed, partically precomposed, or + * fully decomposed. Ie. , , or . + * + * The composition / decomposition is mechanical. However, not + * all sequences compose, and not all sequences + * compose. + * + * Here are the specifics: + * + * - : U+1100..115F, U+A960..A97F + * - : U+1160..11A7, U+D7B0..D7C7 + * - : U+11A8..11FF, U+D7CB..D7FB + * + * - Only the sequences for the 11xx ranges combine. + * - Only sequences for T in U+11A8..11C3 combine. + * + * Here is what we want to accomplish in this shaper: + * + * - If the whole syllable can be precomposed, do that, + * - Otherwise, fully decompose and apply ljmo/vjmo/tjmo features. + * - If a valid syllable is followed by a Hangul tone mark, reorder the tone + * mark to precede the whole syllable - unless it is a zero-width glyph, in + * which case we leave it untouched, assuming it's designed to overstrike. + * + * That is, of the different possible syllables: + * + * + * + * + * + * + * + * + * - needs no work. + * + * - and can stay the way they are if the font supports them, otherwise we + * should fully decompose them if font supports. + * + * - and we should compose if the whole thing can be composed. + * + * - we should compose if the whole thing can be composed, otherwise we should + * decompose. + */ + + buffer->clear_output (); + unsigned int start = 0, end = 0; /* Extent of most recently seen syllable; + * valid only if start < end + */ + unsigned int count = buffer->len; + + for (buffer->idx = 0; buffer->idx < count;) + { + hb_codepoint_t u = buffer->cur().codepoint; + + if (isHangulTone (u)) + { + /* + * We could cache the width of the tone marks and the existence of dotted-circle, + * but the use of the Hangul tone mark characters seems to be rare enough that + * I didn't bother for now. + */ + if (start < end && end == buffer->out_len) + { + /* Tone mark follows a valid syllable; move it in front, unless it's zero width. */ + buffer->next_glyph (); + if (!is_zero_width_char (font, u)) + { + hb_glyph_info_t *info = buffer->out_info; + hb_glyph_info_t tone = info[end]; + memmove (&info[start + 1], &info[start], (end - start) * sizeof (hb_glyph_info_t)); + info[start] = tone; + } + /* Merge clusters across the (possibly reordered) syllable+tone. + * We want to merge even in the zero-width tone mark case here, + * so that clustering behavior isn't dependent on how the tone mark + * is handled by the font. + */ + buffer->merge_out_clusters (start, end + 1); + } + else + { + /* No valid syllable as base for tone mark; try to insert dotted circle. */ + if (font->has_glyph (0x25cc)) + { + hb_codepoint_t chars[2]; + if (!is_zero_width_char (font, u)) { + chars[0] = u; + chars[1] = 0x25cc; + } else { + chars[0] = 0x25cc; + chars[1] = u; + } + buffer->replace_glyphs (1, 2, chars); + } + else + { + /* No dotted circle available in the font; just leave tone mark untouched. */ + buffer->next_glyph (); + } + } + start = end = buffer->out_len; + continue; + } + + start = buffer->out_len; /* Remember current position as a potential syllable start; + * will only be used if we set end to a later position. + */ + + if (isL (u) && buffer->idx + 1 < count) + { + hb_codepoint_t l = u; + hb_codepoint_t v = buffer->cur(+1).codepoint; + if (isV (v)) + { + /* Have or . */ + hb_codepoint_t t = 0; + unsigned int tindex = 0; + if (buffer->idx + 2 < count) + { + t = buffer->cur(+2).codepoint; + if (isT (t)) + tindex = t - TBase; /* Only used if isCombiningT (t); otherwise invalid. */ + else + t = 0; /* The next character was not a trailing jamo. */ + } + + /* We've got a syllable ; see if it can potentially be composed. */ + if (isCombiningL (l) && isCombiningV (v) && (t == 0 || isCombiningT (t))) + { + /* Try to compose; if this succeeds, end is set to start+1. */ + hb_codepoint_t s = SBase + (l - LBase) * NCount + (v - VBase) * TCount + tindex; + if (font->has_glyph (s)) + { + buffer->replace_glyphs (t ? 3 : 2, 1, &s); + if (unlikely (buffer->in_error)) + return; + end = start + 1; + continue; + } + } + + /* We didn't compose, either because it's an Old Hangul syllable without a + * precomposed character in Unicode, or because the font didn't support the + * necessary precomposed glyph. + * Set jamo features on the individual glyphs, and advance past them. + */ + buffer->cur().hangul_shaping_feature() = LJMO; + buffer->next_glyph (); + buffer->cur().hangul_shaping_feature() = VJMO; + buffer->next_glyph (); + if (t) + { + buffer->cur().hangul_shaping_feature() = TJMO; + buffer->next_glyph (); + end = start + 3; + } + else + end = start + 2; + buffer->merge_out_clusters (start, end); + continue; + } + } + + else if (isCombinedS (u)) + { + /* Have , , or */ + hb_codepoint_t s = u; + bool has_glyph = font->has_glyph (s); + unsigned int lindex = (s - SBase) / NCount; + unsigned int nindex = (s - SBase) % NCount; + unsigned int vindex = nindex / TCount; + unsigned int tindex = nindex % TCount; + + if (!tindex && + buffer->idx + 1 < count && + isCombiningT (buffer->cur(+1).codepoint)) + { + /* , try to combine. */ + unsigned int new_tindex = buffer->cur(+1).codepoint - TBase; + hb_codepoint_t new_s = s + new_tindex; + if (font->has_glyph (new_s)) + { + buffer->replace_glyphs (2, 1, &new_s); + if (unlikely (buffer->in_error)) + return; + end = start + 1; + continue; + } + } + + /* Otherwise, decompose if font doesn't support or , + * or if having non-combining . Note that we already handled + * combining above. */ + if (!has_glyph || + (!tindex && + buffer->idx + 1 < count && + isT (buffer->cur(+1).codepoint))) + { + hb_codepoint_t decomposed[3] = {LBase + lindex, + VBase + vindex, + TBase + tindex}; + if (font->has_glyph (decomposed[0]) && + font->has_glyph (decomposed[1]) && + (!tindex || font->has_glyph (decomposed[2]))) + { + unsigned int s_len = tindex ? 3 : 2; + buffer->replace_glyphs (1, s_len, decomposed); + if (unlikely (buffer->in_error)) + return; + + /* We decomposed S: apply jamo features to the individual glyphs + * that are now in buffer->out_info. + */ + hb_glyph_info_t *info = buffer->out_info; + + /* If we decomposed an LV because of a non-combining T following, + * we want to include this T in the syllable. + */ + if (has_glyph && !tindex) + { + buffer->next_glyph (); + s_len++; + } + end = start + s_len; + + unsigned int i = start; + info[i++].hangul_shaping_feature() = LJMO; + info[i++].hangul_shaping_feature() = VJMO; + if (i < end) + info[i++].hangul_shaping_feature() = TJMO; + buffer->merge_out_clusters (start, end); + continue; + } + } + + if (has_glyph) + { + /* We didn't decompose the S, so just advance past it. */ + end = start + 1; + buffer->next_glyph (); + continue; + } + } + + /* Didn't find a recognizable syllable, so we leave end <= start; + * this will prevent tone-mark reordering happening. + */ + buffer->next_glyph (); + } + buffer->swap_buffers (); +} + +static void +setup_masks_hangul (const hb_ot_shape_plan_t *plan, + hb_buffer_t *buffer, + hb_font_t *font HB_UNUSED) +{ + const hangul_shape_plan_t *hangul_plan = (const hangul_shape_plan_t *) plan->data; + + if (likely (hangul_plan)) + { + unsigned int count = buffer->len; + hb_glyph_info_t *info = buffer->info; + for (unsigned int i = 0; i < count; i++, info++) + info->mask |= hangul_plan->mask_array[info->hangul_shaping_feature()]; + } + + HB_BUFFER_DEALLOCATE_VAR (buffer, hangul_shaping_feature); +} + + +const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hangul = +{ + "hangul", + collect_features_hangul, + NULL, /* override_features */ + data_create_hangul, /* data_create */ + data_destroy_hangul, /* data_destroy */ + preprocess_text_hangul, + HB_OT_SHAPE_NORMALIZATION_MODE_NONE, + NULL, /* decompose */ + NULL, /* compose */ + setup_masks_hangul, /* setup_masks */ + HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, + false, /* fallback_position */ +}; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc new file mode 100644 index 0000000000..efef8c14ad --- /dev/null +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc @@ -0,0 +1,172 @@ +/* + * Copyright © 2010,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#include "hb-ot-shape-complex-private.hh" + + +static bool +compose_hebrew (const hb_ot_shape_normalize_context_t *c, + hb_codepoint_t a, + hb_codepoint_t b, + hb_codepoint_t *ab) +{ + /* Hebrew presentation-form shaping. + * https://bugzilla.mozilla.org/show_bug.cgi?id=728866 + * Hebrew presentation forms with dagesh, for characters 0x05D0..0x05EA; + * Note that some letters do not have a dagesh presForm encoded. + */ + static const hb_codepoint_t sDageshForms[0x05EA - 0x05D0 + 1] = { + 0xFB30, /* ALEF */ + 0xFB31, /* BET */ + 0xFB32, /* GIMEL */ + 0xFB33, /* DALET */ + 0xFB34, /* HE */ + 0xFB35, /* VAV */ + 0xFB36, /* ZAYIN */ + 0x0000, /* HET */ + 0xFB38, /* TET */ + 0xFB39, /* YOD */ + 0xFB3A, /* FINAL KAF */ + 0xFB3B, /* KAF */ + 0xFB3C, /* LAMED */ + 0x0000, /* FINAL MEM */ + 0xFB3E, /* MEM */ + 0x0000, /* FINAL NUN */ + 0xFB40, /* NUN */ + 0xFB41, /* SAMEKH */ + 0x0000, /* AYIN */ + 0xFB43, /* FINAL PE */ + 0xFB44, /* PE */ + 0x0000, /* FINAL TSADI */ + 0xFB46, /* TSADI */ + 0xFB47, /* QOF */ + 0xFB48, /* RESH */ + 0xFB49, /* SHIN */ + 0xFB4A /* TAV */ + }; + + bool found = c->unicode->compose (a, b, ab); + + if (!found) + { + /* Special-case Hebrew presentation forms that are excluded from + * standard normalization, but wanted for old fonts. */ + switch (b) { + case 0x05B4: /* HIRIQ */ + if (a == 0x05D9) { /* YOD */ + *ab = 0xFB1D; + found = true; + } + break; + case 0x05B7: /* patah */ + if (a == 0x05F2) { /* YIDDISH YOD YOD */ + *ab = 0xFB1F; + found = true; + } else if (a == 0x05D0) { /* ALEF */ + *ab = 0xFB2E; + found = true; + } + break; + case 0x05B8: /* QAMATS */ + if (a == 0x05D0) { /* ALEF */ + *ab = 0xFB2F; + found = true; + } + break; + case 0x05B9: /* HOLAM */ + if (a == 0x05D5) { /* VAV */ + *ab = 0xFB4B; + found = true; + } + break; + case 0x05BC: /* DAGESH */ + if (a >= 0x05D0 && a <= 0x05EA) { + *ab = sDageshForms[a - 0x05D0]; + found = (*ab != 0); + } else if (a == 0xFB2A) { /* SHIN WITH SHIN DOT */ + *ab = 0xFB2C; + found = true; + } else if (a == 0xFB2B) { /* SHIN WITH SIN DOT */ + *ab = 0xFB2D; + found = true; + } + break; + case 0x05BF: /* RAFE */ + switch (a) { + case 0x05D1: /* BET */ + *ab = 0xFB4C; + found = true; + break; + case 0x05DB: /* KAF */ + *ab = 0xFB4D; + found = true; + break; + case 0x05E4: /* PE */ + *ab = 0xFB4E; + found = true; + break; + } + break; + case 0x05C1: /* SHIN DOT */ + if (a == 0x05E9) { /* SHIN */ + *ab = 0xFB2A; + found = true; + } else if (a == 0xFB49) { /* SHIN WITH DAGESH */ + *ab = 0xFB2C; + found = true; + } + break; + case 0x05C2: /* SIN DOT */ + if (a == 0x05E9) { /* SHIN */ + *ab = 0xFB2B; + found = true; + } else if (a == 0xFB49) { /* SHIN WITH DAGESH */ + *ab = 0xFB2D; + found = true; + } + break; + } + } + + return found; +} + + +const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew = +{ + "hebrew", + NULL, /* collect_features */ + NULL, /* override_features */ + NULL, /* data_create */ + NULL, /* data_destroy */ + NULL, /* preprocess_text */ + HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, + NULL, /* decompose */ + compose_hebrew, + NULL, /* setup_masks */ + HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT, + true, /* fallback_position */ +}; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh index 612f7b788a..71621034ee 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic-machine.hh @@ -55,48 +55,52 @@ static const unsigned char _indic_syllable_machine_trans_keys[] = { 4u, 14u, 5u, 7u, 5u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 1u, 16u, 13u, 13u, 4u, 4u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, - 6u, 6u, 16u, 16u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, - 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, - 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, - 5u, 9u, 9u, 9u, 9u, 9u, 3u, 17u, 3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u, - 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, - 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 6u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, - 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, - 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, - 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, - 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 3u, 14u, 3u, 14u, - 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, - 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, - 4u, 14u, 5u, 14u, 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 3u, 17u, 3u, 9u, - 8u, 9u, 3u, 9u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, - 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 6u, 14u, - 3u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, - 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u, 3u, 14u, - 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, - 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, - 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 3u, 17u, - 3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, - 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, - 6u, 14u, 3u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, - 3u, 14u, 4u, 14u, 3u, 14u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, - 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, - 4u, 14u, 1u, 16u, 3u, 17u, 3u, 14u, 4u, 14u, 5u, 14u, 8u, 14u, 5u, 9u, - 9u, 9u, 9u, 9u, 3u, 17u, 3u, 9u, 8u, 9u, 3u, 9u, 3u, 13u, 3u, 14u, - 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, - 5u, 14u, 3u, 14u, 4u, 14u, 6u, 14u, 3u, 14u, 1u, 16u, 3u, 14u, 3u, 14u, - 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, - 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 14u, 3u, 14u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 14u, 1u, 16u, 3u, 17u, 1u, 16u, 4u, 14u, 1u, 16u, - 3u, 17u, 3u, 14u, 4u, 14u, 5u, 9u, 9u, 9u, 9u, 9u, 3u, 14u, 3u, 14u, - 1u, 16u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, - 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 8u, 14u, 3u, 17u, 3u, 9u, 8u, 9u, - 3u, 9u, 3u, 13u, 1u, 16u, 0 + 6u, 6u, 16u, 16u, 1u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, + 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, + 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 18u, 8u, 18u, + 5u, 10u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 18u, 3u, 18u, 8u, 18u, + 3u, 10u, 8u, 10u, 3u, 18u, 3u, 18u, 3u, 18u, 3u, 18u, 4u, 18u, 5u, 18u, + 3u, 18u, 4u, 18u, 5u, 18u, 3u, 18u, 4u, 18u, 5u, 18u, 3u, 18u, 4u, 18u, + 6u, 18u, 3u, 18u, 1u, 18u, 4u, 31u, 4u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, + 1u, 18u, 1u, 18u, 1u, 18u, 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, + 1u, 18u, 1u, 18u, 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, 1u, 18u, + 1u, 18u, 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, 1u, 18u, 1u, 18u, + 1u, 18u, 3u, 31u, 3u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, + 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, + 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 18u, 8u, 18u, + 5u, 10u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 18u, 3u, 18u, 8u, 18u, + 3u, 10u, 8u, 10u, 3u, 18u, 3u, 18u, 3u, 18u, 3u, 18u, 4u, 18u, 5u, 18u, + 3u, 18u, 4u, 18u, 5u, 18u, 3u, 18u, 4u, 18u, 5u, 18u, 3u, 18u, 4u, 18u, + 6u, 18u, 3u, 18u, 1u, 18u, 4u, 31u, 4u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, + 1u, 18u, 1u, 18u, 1u, 18u, 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, + 1u, 18u, 1u, 18u, 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, 1u, 18u, + 1u, 18u, 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, 1u, 18u, 1u, 18u, + 4u, 14u, 1u, 18u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, 3u, 31u, + 4u, 31u, 1u, 18u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, 3u, 31u, + 4u, 31u, 1u, 18u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 18u, 8u, 18u, 5u, 10u, + 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 18u, 3u, 18u, 8u, 18u, 3u, 10u, + 8u, 10u, 3u, 18u, 3u, 18u, 3u, 18u, 3u, 18u, 4u, 18u, 5u, 18u, 3u, 18u, + 4u, 18u, 5u, 18u, 3u, 18u, 4u, 18u, 5u, 18u, 3u, 18u, 4u, 18u, 6u, 18u, + 3u, 18u, 1u, 18u, 4u, 31u, 4u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, + 1u, 18u, 1u, 18u, 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, 1u, 18u, + 1u, 18u, 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, 1u, 18u, 1u, 18u, + 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, 1u, 18u, 1u, 18u, 1u, 18u, + 4u, 14u, 3u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, + 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, + 3u, 31u, 4u, 31u, 1u, 18u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 18u, 8u, 18u, + 5u, 10u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 18u, 3u, 18u, 8u, 18u, + 3u, 10u, 8u, 10u, 3u, 18u, 3u, 18u, 3u, 18u, 3u, 18u, 4u, 18u, 5u, 18u, + 3u, 18u, 4u, 18u, 5u, 18u, 3u, 18u, 4u, 18u, 5u, 18u, 3u, 18u, 4u, 18u, + 6u, 18u, 3u, 18u, 1u, 18u, 4u, 31u, 4u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, + 1u, 18u, 1u, 18u, 1u, 18u, 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, + 1u, 18u, 1u, 18u, 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, 1u, 18u, + 1u, 18u, 1u, 18u, 3u, 31u, 3u, 31u, 1u, 18u, 1u, 18u, 1u, 18u, 1u, 18u, + 1u, 18u, 3u, 31u, 1u, 31u, 3u, 31u, 1u, 31u, 4u, 18u, 1u, 18u, 3u, 31u, + 3u, 31u, 4u, 31u, 5u, 10u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 10u, + 8u, 10u, 3u, 31u, 3u, 31u, 1u, 18u, 3u, 18u, 4u, 18u, 5u, 18u, 3u, 18u, + 4u, 18u, 5u, 18u, 3u, 18u, 4u, 18u, 5u, 18u, 3u, 18u, 4u, 18u, 8u, 18u, + 3u, 18u, 3u, 18u, 8u, 18u, 3u, 18u, 3u, 18u, 1u, 18u, 3u, 10u, 8u, 10u, + 5u, 10u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 0 }; static const char _indic_syllable_machine_key_spans[] = { @@ -121,48 +125,52 @@ static const char _indic_syllable_machine_key_spans[] = { 11, 3, 3, 3, 3, 1, 3, 3, 1, 3, 3, 1, 16, 1, 1, 1, 1, 4, 1, 1, 4, 1, 1, 4, - 1, 1, 16, 15, 12, 11, 16, 15, - 12, 11, 16, 15, 12, 11, 16, 15, - 12, 11, 16, 15, 12, 11, 10, 7, - 5, 1, 1, 15, 7, 2, 7, 11, - 12, 12, 11, 10, 12, 11, 10, 12, - 11, 10, 12, 11, 9, 12, 11, 16, - 12, 12, 16, 16, 16, 16, 16, 12, - 12, 16, 16, 16, 16, 16, 12, 12, - 16, 16, 16, 16, 16, 12, 12, 16, - 16, 16, 16, 16, 12, 12, 12, 12, - 11, 16, 15, 12, 11, 16, 15, 12, - 11, 16, 15, 12, 11, 16, 15, 12, - 11, 10, 7, 5, 1, 1, 15, 7, - 2, 7, 11, 12, 12, 11, 10, 12, - 11, 10, 12, 11, 10, 12, 11, 9, - 12, 16, 12, 12, 16, 16, 16, 16, - 16, 12, 12, 16, 16, 16, 16, 16, - 12, 12, 16, 16, 16, 16, 16, 12, - 12, 16, 16, 16, 16, 11, 16, 12, - 12, 11, 16, 15, 12, 11, 16, 15, - 12, 11, 16, 15, 12, 11, 16, 15, - 12, 11, 10, 7, 5, 1, 1, 15, - 7, 2, 7, 11, 12, 12, 11, 10, - 12, 11, 10, 12, 11, 10, 12, 11, - 9, 12, 16, 12, 12, 16, 16, 16, - 16, 16, 12, 12, 16, 16, 16, 16, - 16, 12, 12, 16, 16, 16, 16, 16, - 12, 12, 16, 16, 16, 16, 16, 11, - 12, 11, 12, 12, 11, 16, 15, 12, - 11, 16, 15, 12, 11, 16, 15, 12, - 11, 16, 15, 12, 11, 10, 7, 5, - 1, 1, 15, 7, 2, 7, 11, 12, - 12, 11, 10, 12, 11, 10, 12, 11, - 10, 12, 11, 9, 12, 16, 12, 12, - 16, 16, 16, 16, 16, 12, 12, 16, - 16, 16, 16, 16, 12, 12, 16, 16, - 16, 16, 16, 12, 12, 16, 16, 16, - 16, 16, 12, 16, 15, 16, 11, 16, - 15, 12, 11, 5, 1, 1, 12, 12, - 16, 12, 11, 10, 12, 11, 10, 12, - 11, 10, 12, 11, 7, 15, 7, 2, - 7, 11, 16 + 1, 1, 31, 29, 29, 28, 18, 29, + 29, 28, 18, 29, 29, 28, 18, 29, + 29, 28, 18, 29, 29, 28, 14, 11, + 6, 2, 2, 1, 6, 16, 16, 11, + 8, 3, 16, 16, 16, 16, 15, 14, + 16, 15, 14, 16, 15, 14, 16, 15, + 13, 16, 18, 28, 15, 29, 29, 18, + 18, 18, 18, 18, 29, 29, 18, 18, + 18, 18, 18, 29, 29, 18, 18, 18, + 18, 18, 29, 29, 18, 18, 18, 18, + 18, 29, 29, 29, 29, 28, 18, 29, + 29, 28, 18, 29, 29, 28, 18, 29, + 29, 28, 18, 29, 29, 28, 14, 11, + 6, 2, 2, 1, 6, 16, 16, 11, + 8, 3, 16, 16, 16, 16, 15, 14, + 16, 15, 14, 16, 15, 14, 16, 15, + 13, 16, 18, 28, 15, 29, 29, 18, + 18, 18, 18, 18, 29, 29, 18, 18, + 18, 18, 18, 29, 29, 18, 18, 18, + 18, 18, 29, 29, 18, 18, 18, 18, + 11, 18, 29, 29, 28, 18, 29, 29, + 28, 18, 29, 29, 28, 18, 29, 29, + 28, 18, 29, 29, 28, 14, 11, 6, + 2, 2, 1, 6, 16, 16, 11, 8, + 3, 16, 16, 16, 16, 15, 14, 16, + 15, 14, 16, 15, 14, 16, 15, 13, + 16, 18, 28, 15, 29, 29, 18, 18, + 18, 18, 18, 29, 29, 18, 18, 18, + 18, 18, 29, 29, 18, 18, 18, 18, + 18, 29, 29, 18, 18, 18, 18, 18, + 11, 29, 11, 29, 29, 28, 18, 29, + 29, 28, 18, 29, 29, 28, 18, 29, + 29, 28, 18, 29, 29, 28, 14, 11, + 6, 2, 2, 1, 6, 16, 16, 11, + 8, 3, 16, 16, 16, 16, 15, 14, + 16, 15, 14, 16, 15, 14, 16, 15, + 13, 16, 18, 28, 15, 29, 29, 18, + 18, 18, 18, 18, 29, 29, 18, 18, + 18, 18, 18, 29, 29, 18, 18, 18, + 18, 18, 29, 29, 18, 18, 18, 18, + 18, 29, 31, 29, 31, 15, 18, 29, + 29, 28, 6, 2, 2, 1, 6, 8, + 3, 29, 29, 18, 16, 15, 14, 16, + 15, 14, 16, 15, 14, 16, 15, 11, + 16, 16, 11, 16, 16, 18, 8, 3, + 6, 2, 2, 1, 6 }; static const short _indic_syllable_machine_index_offsets[] = { @@ -187,48 +195,52 @@ static const short _indic_syllable_machine_index_offsets[] = { 848, 860, 864, 868, 872, 876, 878, 882, 886, 888, 892, 896, 898, 915, 917, 919, 921, 923, 928, 930, 932, 937, 939, 941, - 946, 948, 950, 967, 983, 996, 1008, 1025, - 1041, 1054, 1066, 1083, 1099, 1112, 1124, 1141, - 1157, 1170, 1182, 1199, 1215, 1228, 1240, 1251, - 1259, 1265, 1267, 1269, 1285, 1293, 1296, 1304, - 1316, 1329, 1342, 1354, 1365, 1378, 1390, 1401, - 1414, 1426, 1437, 1450, 1462, 1472, 1485, 1497, - 1514, 1527, 1540, 1557, 1574, 1591, 1608, 1625, - 1638, 1651, 1668, 1685, 1702, 1719, 1736, 1749, - 1762, 1779, 1796, 1813, 1830, 1847, 1860, 1873, - 1890, 1907, 1924, 1941, 1958, 1971, 1984, 1997, - 2010, 2022, 2039, 2055, 2068, 2080, 2097, 2113, - 2126, 2138, 2155, 2171, 2184, 2196, 2213, 2229, - 2242, 2254, 2265, 2273, 2279, 2281, 2283, 2299, - 2307, 2310, 2318, 2330, 2343, 2356, 2368, 2379, - 2392, 2404, 2415, 2428, 2440, 2451, 2464, 2476, - 2486, 2499, 2516, 2529, 2542, 2559, 2576, 2593, - 2610, 2627, 2640, 2653, 2670, 2687, 2704, 2721, - 2738, 2751, 2764, 2781, 2798, 2815, 2832, 2849, - 2862, 2875, 2892, 2909, 2926, 2943, 2955, 2972, - 2985, 2998, 3010, 3027, 3043, 3056, 3068, 3085, - 3101, 3114, 3126, 3143, 3159, 3172, 3184, 3201, - 3217, 3230, 3242, 3253, 3261, 3267, 3269, 3271, - 3287, 3295, 3298, 3306, 3318, 3331, 3344, 3356, - 3367, 3380, 3392, 3403, 3416, 3428, 3439, 3452, - 3464, 3474, 3487, 3504, 3517, 3530, 3547, 3564, - 3581, 3598, 3615, 3628, 3641, 3658, 3675, 3692, - 3709, 3726, 3739, 3752, 3769, 3786, 3803, 3820, - 3837, 3850, 3863, 3880, 3897, 3914, 3931, 3948, - 3960, 3973, 3985, 3998, 4011, 4023, 4040, 4056, - 4069, 4081, 4098, 4114, 4127, 4139, 4156, 4172, - 4185, 4197, 4214, 4230, 4243, 4255, 4266, 4274, - 4280, 4282, 4284, 4300, 4308, 4311, 4319, 4331, - 4344, 4357, 4369, 4380, 4393, 4405, 4416, 4429, - 4441, 4452, 4465, 4477, 4487, 4500, 4517, 4530, - 4543, 4560, 4577, 4594, 4611, 4628, 4641, 4654, - 4671, 4688, 4705, 4722, 4739, 4752, 4765, 4782, - 4799, 4816, 4833, 4850, 4863, 4876, 4893, 4910, - 4927, 4944, 4961, 4974, 4991, 5007, 5024, 5036, - 5053, 5069, 5082, 5094, 5100, 5102, 5104, 5117, - 5130, 5147, 5160, 5172, 5183, 5196, 5208, 5219, - 5232, 5244, 5255, 5268, 5280, 5288, 5304, 5312, - 5315, 5323, 5335 + 946, 948, 950, 982, 1012, 1042, 1071, 1090, + 1120, 1150, 1179, 1198, 1228, 1258, 1287, 1306, + 1336, 1366, 1395, 1414, 1444, 1474, 1503, 1518, + 1530, 1537, 1540, 1543, 1545, 1552, 1569, 1586, + 1598, 1607, 1611, 1628, 1645, 1662, 1679, 1695, + 1710, 1727, 1743, 1758, 1775, 1791, 1806, 1823, + 1839, 1853, 1870, 1889, 1918, 1934, 1964, 1994, + 2013, 2032, 2051, 2070, 2089, 2119, 2149, 2168, + 2187, 2206, 2225, 2244, 2274, 2304, 2323, 2342, + 2361, 2380, 2399, 2429, 2459, 2478, 2497, 2516, + 2535, 2554, 2584, 2614, 2644, 2674, 2703, 2722, + 2752, 2782, 2811, 2830, 2860, 2890, 2919, 2938, + 2968, 2998, 3027, 3046, 3076, 3106, 3135, 3150, + 3162, 3169, 3172, 3175, 3177, 3184, 3201, 3218, + 3230, 3239, 3243, 3260, 3277, 3294, 3311, 3327, + 3342, 3359, 3375, 3390, 3407, 3423, 3438, 3455, + 3471, 3485, 3502, 3521, 3550, 3566, 3596, 3626, + 3645, 3664, 3683, 3702, 3721, 3751, 3781, 3800, + 3819, 3838, 3857, 3876, 3906, 3936, 3955, 3974, + 3993, 4012, 4031, 4061, 4091, 4110, 4129, 4148, + 4167, 4179, 4198, 4228, 4258, 4287, 4306, 4336, + 4366, 4395, 4414, 4444, 4474, 4503, 4522, 4552, + 4582, 4611, 4630, 4660, 4690, 4719, 4734, 4746, + 4753, 4756, 4759, 4761, 4768, 4785, 4802, 4814, + 4823, 4827, 4844, 4861, 4878, 4895, 4911, 4926, + 4943, 4959, 4974, 4991, 5007, 5022, 5039, 5055, + 5069, 5086, 5105, 5134, 5150, 5180, 5210, 5229, + 5248, 5267, 5286, 5305, 5335, 5365, 5384, 5403, + 5422, 5441, 5460, 5490, 5520, 5539, 5558, 5577, + 5596, 5615, 5645, 5675, 5694, 5713, 5732, 5751, + 5770, 5782, 5812, 5824, 5854, 5884, 5913, 5932, + 5962, 5992, 6021, 6040, 6070, 6100, 6129, 6148, + 6178, 6208, 6237, 6256, 6286, 6316, 6345, 6360, + 6372, 6379, 6382, 6385, 6387, 6394, 6411, 6428, + 6440, 6449, 6453, 6470, 6487, 6504, 6521, 6537, + 6552, 6569, 6585, 6600, 6617, 6633, 6648, 6665, + 6681, 6695, 6712, 6731, 6760, 6776, 6806, 6836, + 6855, 6874, 6893, 6912, 6931, 6961, 6991, 7010, + 7029, 7048, 7067, 7086, 7116, 7146, 7165, 7184, + 7203, 7222, 7241, 7271, 7301, 7320, 7339, 7358, + 7377, 7396, 7426, 7458, 7488, 7520, 7536, 7555, + 7585, 7615, 7644, 7651, 7654, 7657, 7659, 7666, + 7675, 7679, 7709, 7739, 7758, 7775, 7791, 7806, + 7823, 7839, 7854, 7871, 7887, 7902, 7919, 7935, + 7947, 7964, 7981, 7993, 8010, 8027, 8046, 8055, + 8059, 8066, 8069, 8072, 8074 }; static const short _indic_syllable_machine_indicies[] = { @@ -351,625 +363,970 @@ static const short _indic_syllable_machine_indicies[] = { 172, 0, 173, 0, 174, 159, 159, 160, 0, 175, 0, 176, 0, 177, 156, 156, 157, 0, 178, 0, 179, 0, 181, 182, - 183, 184, 185, 186, 81, 187, 188, 180, - 189, 189, 152, 190, 191, 192, 180, 194, - 195, 196, 197, 5, 198, 199, 200, 193, - 193, 37, 201, 193, 193, 181, 193, 202, - 195, 203, 203, 5, 198, 199, 200, 193, - 193, 193, 201, 193, 195, 203, 203, 5, - 198, 199, 200, 193, 193, 193, 201, 193, - 204, 193, 193, 193, 18, 205, 193, 198, - 199, 193, 193, 193, 193, 206, 193, 204, - 193, 207, 208, 209, 210, 5, 198, 199, - 200, 193, 193, 35, 211, 193, 193, 204, - 193, 212, 208, 213, 213, 5, 198, 199, - 200, 193, 193, 193, 211, 193, 208, 213, - 213, 5, 198, 199, 200, 193, 193, 193, - 211, 193, 214, 193, 193, 193, 18, 215, - 193, 198, 199, 193, 193, 193, 193, 206, - 193, 214, 193, 216, 217, 218, 219, 5, - 198, 199, 200, 193, 193, 33, 220, 193, - 193, 214, 193, 221, 217, 222, 222, 5, - 198, 199, 200, 193, 193, 193, 220, 193, - 217, 222, 222, 5, 198, 199, 200, 193, - 193, 193, 220, 193, 223, 193, 193, 193, - 18, 224, 193, 198, 199, 193, 193, 193, - 193, 206, 193, 223, 193, 225, 226, 227, - 228, 5, 198, 199, 200, 193, 193, 31, - 229, 193, 193, 223, 193, 230, 226, 231, - 231, 5, 198, 199, 200, 193, 193, 193, - 229, 193, 226, 231, 231, 5, 198, 199, - 200, 193, 193, 193, 229, 193, 232, 193, - 193, 193, 18, 233, 193, 198, 199, 193, - 193, 193, 193, 206, 193, 232, 193, 234, - 235, 236, 237, 5, 198, 199, 200, 193, - 193, 29, 238, 193, 193, 232, 193, 239, - 235, 240, 240, 5, 198, 199, 200, 193, - 193, 193, 238, 193, 235, 240, 240, 5, - 198, 199, 200, 193, 193, 193, 238, 193, - 18, 241, 193, 198, 199, 193, 193, 193, - 193, 206, 193, 198, 199, 193, 193, 193, - 193, 206, 193, 242, 193, 193, 193, 199, - 193, 199, 193, 243, 193, 244, 193, 245, - 246, 193, 198, 199, 193, 193, 193, 3, - 193, 193, 193, 1, 193, 2, 193, 193, - 193, 193, 198, 199, 193, 198, 199, 193, - 244, 193, 193, 193, 193, 198, 199, 193, - 244, 193, 245, 193, 193, 198, 199, 193, - 193, 193, 3, 193, 18, 193, 247, 247, - 5, 198, 199, 193, 193, 193, 193, 206, - 193, 248, 27, 249, 250, 8, 198, 199, - 193, 193, 193, 193, 206, 193, 27, 249, - 250, 8, 198, 199, 193, 193, 193, 193, - 206, 193, 249, 249, 8, 198, 199, 193, - 193, 193, 193, 206, 193, 251, 24, 252, - 253, 11, 198, 199, 193, 193, 193, 193, - 206, 193, 24, 252, 253, 11, 198, 199, - 193, 193, 193, 193, 206, 193, 252, 252, - 11, 198, 199, 193, 193, 193, 193, 206, - 193, 254, 21, 255, 256, 14, 198, 199, - 193, 193, 193, 193, 206, 193, 21, 255, - 256, 14, 198, 199, 193, 193, 193, 193, - 206, 193, 255, 255, 14, 198, 199, 193, - 193, 193, 193, 206, 193, 257, 18, 193, - 258, 193, 198, 199, 193, 193, 193, 193, - 206, 193, 18, 193, 258, 193, 198, 199, - 193, 193, 193, 193, 206, 193, 259, 193, - 198, 199, 193, 193, 193, 193, 206, 193, - 18, 193, 193, 193, 193, 198, 199, 193, - 193, 193, 193, 206, 193, 235, 240, 240, - 5, 198, 199, 193, 193, 193, 193, 238, - 193, 1, 2, 193, 193, 18, 241, 193, - 198, 199, 193, 193, 193, 193, 206, 193, - 1, 193, 234, 235, 240, 240, 5, 198, - 199, 200, 193, 193, 193, 238, 193, 234, - 235, 236, 240, 5, 198, 199, 200, 193, - 193, 29, 238, 193, 232, 193, 260, 193, - 247, 247, 5, 198, 199, 193, 193, 193, - 193, 206, 193, 232, 193, 232, 193, 193, - 193, 193, 193, 193, 198, 199, 193, 193, - 193, 193, 206, 193, 232, 193, 232, 193, - 193, 193, 193, 261, 193, 198, 199, 193, - 193, 193, 193, 206, 193, 232, 193, 232, - 193, 260, 193, 193, 193, 193, 198, 199, - 193, 193, 193, 193, 206, 193, 232, 193, - 232, 2, 193, 193, 18, 233, 193, 198, - 199, 193, 193, 193, 193, 206, 193, 232, - 193, 225, 226, 231, 231, 5, 198, 199, - 200, 193, 193, 193, 229, 193, 225, 226, - 227, 231, 5, 198, 199, 200, 193, 193, - 31, 229, 193, 223, 193, 262, 193, 247, - 247, 5, 198, 199, 193, 193, 193, 193, - 206, 193, 223, 193, 223, 193, 193, 193, - 193, 193, 193, 198, 199, 193, 193, 193, - 193, 206, 193, 223, 193, 223, 193, 193, - 193, 193, 263, 193, 198, 199, 193, 193, - 193, 193, 206, 193, 223, 193, 223, 193, - 262, 193, 193, 193, 193, 198, 199, 193, - 193, 193, 193, 206, 193, 223, 193, 223, - 2, 193, 193, 18, 224, 193, 198, 199, - 193, 193, 193, 193, 206, 193, 223, 193, - 216, 217, 222, 222, 5, 198, 199, 200, - 193, 193, 193, 220, 193, 216, 217, 218, - 222, 5, 198, 199, 200, 193, 193, 33, - 220, 193, 214, 193, 264, 193, 247, 247, - 5, 198, 199, 193, 193, 193, 193, 206, - 193, 214, 193, 214, 193, 193, 193, 193, - 193, 193, 198, 199, 193, 193, 193, 193, - 206, 193, 214, 193, 214, 193, 193, 193, - 193, 265, 193, 198, 199, 193, 193, 193, - 193, 206, 193, 214, 193, 214, 193, 264, - 193, 193, 193, 193, 198, 199, 193, 193, - 193, 193, 206, 193, 214, 193, 214, 2, - 193, 193, 18, 215, 193, 198, 199, 193, - 193, 193, 193, 206, 193, 214, 193, 207, - 208, 213, 213, 5, 198, 199, 200, 193, - 193, 193, 211, 193, 207, 208, 209, 213, - 5, 198, 199, 200, 193, 193, 35, 211, - 193, 204, 193, 266, 193, 247, 247, 5, - 198, 199, 193, 193, 193, 193, 206, 193, - 204, 193, 204, 193, 193, 193, 193, 193, - 193, 198, 199, 193, 193, 193, 193, 206, - 193, 204, 193, 204, 193, 193, 193, 193, - 267, 193, 198, 199, 193, 193, 193, 193, - 206, 193, 204, 193, 204, 193, 266, 193, - 193, 193, 193, 198, 199, 193, 193, 193, - 193, 206, 193, 204, 193, 204, 2, 193, - 193, 18, 205, 193, 198, 199, 193, 193, - 193, 193, 206, 193, 204, 193, 194, 195, - 203, 203, 5, 198, 199, 200, 193, 193, - 193, 201, 193, 194, 195, 196, 203, 5, - 198, 199, 200, 193, 193, 37, 201, 193, - 269, 270, 271, 272, 43, 273, 274, 268, - 268, 268, 75, 275, 268, 276, 270, 277, - 272, 43, 273, 274, 268, 268, 268, 268, - 275, 268, 270, 277, 272, 43, 273, 274, - 268, 268, 268, 268, 275, 268, 278, 268, - 268, 268, 56, 279, 268, 273, 274, 268, - 268, 268, 268, 280, 268, 278, 268, 281, - 282, 283, 284, 43, 273, 274, 268, 268, - 268, 73, 285, 268, 268, 278, 268, 286, - 282, 287, 287, 43, 273, 274, 268, 268, - 268, 268, 285, 268, 282, 287, 287, 43, - 273, 274, 268, 268, 268, 268, 285, 268, - 288, 268, 268, 268, 56, 289, 268, 273, - 274, 268, 268, 268, 268, 280, 268, 288, - 268, 290, 291, 292, 293, 43, 273, 274, - 268, 268, 268, 71, 294, 268, 268, 288, - 268, 295, 291, 296, 296, 43, 273, 274, - 268, 268, 268, 268, 294, 268, 291, 296, - 296, 43, 273, 274, 268, 268, 268, 268, - 294, 268, 297, 268, 268, 268, 56, 298, - 268, 273, 274, 268, 268, 268, 268, 280, - 268, 297, 268, 299, 300, 301, 302, 43, - 273, 274, 268, 268, 268, 69, 303, 268, - 268, 297, 268, 304, 300, 305, 305, 43, - 273, 274, 268, 268, 268, 268, 303, 268, - 300, 305, 305, 43, 273, 274, 268, 268, - 268, 268, 303, 268, 306, 268, 268, 268, - 56, 307, 268, 273, 274, 268, 268, 268, - 268, 280, 268, 306, 268, 308, 309, 310, - 311, 43, 273, 274, 268, 268, 268, 67, - 312, 268, 268, 306, 268, 313, 309, 314, - 314, 43, 273, 274, 268, 268, 268, 268, - 312, 268, 309, 314, 314, 43, 273, 274, - 268, 268, 268, 268, 312, 268, 56, 315, - 268, 273, 274, 268, 268, 268, 268, 280, - 268, 273, 274, 268, 268, 268, 268, 280, - 268, 316, 268, 268, 268, 274, 268, 274, - 268, 317, 268, 318, 268, 319, 320, 268, - 273, 274, 268, 268, 268, 41, 268, 268, - 268, 39, 268, 40, 268, 268, 268, 268, - 273, 274, 268, 273, 274, 268, 318, 268, - 268, 268, 268, 273, 274, 268, 318, 268, - 319, 268, 268, 273, 274, 268, 268, 268, - 41, 268, 56, 268, 321, 321, 43, 273, - 274, 268, 268, 268, 268, 280, 268, 322, - 65, 323, 324, 46, 273, 274, 268, 268, - 268, 268, 280, 268, 65, 323, 324, 46, - 273, 274, 268, 268, 268, 268, 280, 268, - 323, 323, 46, 273, 274, 268, 268, 268, - 268, 280, 268, 325, 62, 326, 327, 49, - 273, 274, 268, 268, 268, 268, 280, 268, - 62, 326, 327, 49, 273, 274, 268, 268, - 268, 268, 280, 268, 326, 326, 49, 273, - 274, 268, 268, 268, 268, 280, 268, 328, - 59, 329, 330, 52, 273, 274, 268, 268, - 268, 268, 280, 268, 59, 329, 330, 52, - 273, 274, 268, 268, 268, 268, 280, 268, - 329, 329, 52, 273, 274, 268, 268, 268, - 268, 280, 268, 331, 56, 268, 332, 268, - 273, 274, 268, 268, 268, 268, 280, 268, - 56, 268, 332, 268, 273, 274, 268, 268, - 268, 268, 280, 268, 333, 268, 273, 274, - 268, 268, 268, 268, 280, 268, 56, 268, - 268, 268, 268, 273, 274, 268, 268, 268, - 268, 280, 268, 39, 40, 268, 268, 56, - 315, 268, 273, 274, 268, 268, 268, 268, - 280, 268, 39, 268, 308, 309, 314, 314, - 43, 273, 274, 268, 268, 268, 268, 312, - 268, 308, 309, 310, 314, 43, 273, 274, - 268, 268, 268, 67, 312, 268, 306, 268, - 334, 268, 321, 321, 43, 273, 274, 268, - 268, 268, 268, 280, 268, 306, 268, 306, - 268, 268, 268, 268, 268, 268, 273, 274, - 268, 268, 268, 268, 280, 268, 306, 268, - 306, 268, 268, 268, 268, 335, 268, 273, - 274, 268, 268, 268, 268, 280, 268, 306, - 268, 306, 268, 334, 268, 268, 268, 268, - 273, 274, 268, 268, 268, 268, 280, 268, - 306, 268, 306, 40, 268, 268, 56, 307, - 268, 273, 274, 268, 268, 268, 268, 280, - 268, 306, 268, 299, 300, 305, 305, 43, - 273, 274, 268, 268, 268, 268, 303, 268, - 299, 300, 301, 305, 43, 273, 274, 268, - 268, 268, 69, 303, 268, 297, 268, 336, - 268, 321, 321, 43, 273, 274, 268, 268, - 268, 268, 280, 268, 297, 268, 297, 268, - 268, 268, 268, 268, 268, 273, 274, 268, - 268, 268, 268, 280, 268, 297, 268, 297, - 268, 268, 268, 268, 337, 268, 273, 274, - 268, 268, 268, 268, 280, 268, 297, 268, - 297, 268, 336, 268, 268, 268, 268, 273, - 274, 268, 268, 268, 268, 280, 268, 297, - 268, 297, 40, 268, 268, 56, 298, 268, - 273, 274, 268, 268, 268, 268, 280, 268, - 297, 268, 290, 291, 296, 296, 43, 273, - 274, 268, 268, 268, 268, 294, 268, 290, - 291, 292, 296, 43, 273, 274, 268, 268, - 268, 71, 294, 268, 288, 268, 338, 268, - 321, 321, 43, 273, 274, 268, 268, 268, - 268, 280, 268, 288, 268, 288, 268, 268, - 268, 268, 268, 268, 273, 274, 268, 268, - 268, 268, 280, 268, 288, 268, 288, 268, - 268, 268, 268, 339, 268, 273, 274, 268, - 268, 268, 268, 280, 268, 288, 268, 288, - 268, 338, 268, 268, 268, 268, 273, 274, - 268, 268, 268, 268, 280, 268, 288, 268, - 288, 40, 268, 268, 56, 289, 268, 273, - 274, 268, 268, 268, 268, 280, 268, 288, - 268, 281, 282, 287, 287, 43, 273, 274, - 268, 268, 268, 268, 285, 268, 281, 282, - 283, 287, 43, 273, 274, 268, 268, 268, - 73, 285, 268, 278, 268, 340, 268, 321, - 321, 43, 273, 274, 268, 268, 268, 268, - 280, 268, 278, 268, 278, 268, 268, 268, - 268, 268, 268, 273, 274, 268, 268, 268, - 268, 280, 268, 278, 268, 278, 268, 268, - 268, 268, 341, 268, 273, 274, 268, 268, - 268, 268, 280, 268, 278, 268, 278, 268, - 340, 268, 268, 268, 268, 273, 274, 268, - 268, 268, 268, 280, 268, 278, 268, 74, - 42, 42, 43, 268, 268, 268, 268, 268, - 268, 74, 268, 278, 40, 268, 268, 56, - 279, 268, 273, 274, 268, 268, 268, 268, - 280, 268, 278, 268, 269, 270, 277, 272, - 43, 273, 274, 268, 268, 268, 268, 275, - 268, 343, 184, 344, 344, 81, 187, 188, - 342, 342, 342, 342, 190, 342, 184, 344, - 344, 81, 187, 188, 342, 342, 342, 342, - 190, 342, 345, 342, 342, 342, 95, 346, - 342, 187, 188, 342, 342, 342, 342, 347, - 342, 345, 342, 348, 349, 350, 351, 81, - 187, 188, 342, 342, 342, 112, 352, 342, - 342, 345, 342, 353, 349, 354, 354, 81, - 187, 188, 342, 342, 342, 342, 352, 342, - 349, 354, 354, 81, 187, 188, 342, 342, - 342, 342, 352, 342, 355, 342, 342, 342, - 95, 356, 342, 187, 188, 342, 342, 342, - 342, 347, 342, 355, 342, 357, 358, 359, - 360, 81, 187, 188, 342, 342, 342, 110, - 361, 342, 342, 355, 342, 362, 358, 363, - 363, 81, 187, 188, 342, 342, 342, 342, - 361, 342, 358, 363, 363, 81, 187, 188, - 342, 342, 342, 342, 361, 342, 364, 342, - 342, 342, 95, 365, 342, 187, 188, 342, - 342, 342, 342, 347, 342, 364, 342, 366, - 367, 368, 369, 81, 187, 188, 342, 342, - 342, 108, 370, 342, 342, 364, 342, 371, - 367, 372, 372, 81, 187, 188, 342, 342, - 342, 342, 370, 342, 367, 372, 372, 81, - 187, 188, 342, 342, 342, 342, 370, 342, - 373, 342, 342, 342, 95, 374, 342, 187, - 188, 342, 342, 342, 342, 347, 342, 373, - 342, 375, 376, 377, 378, 81, 187, 188, - 342, 342, 342, 106, 379, 342, 342, 373, - 342, 380, 376, 381, 381, 81, 187, 188, - 342, 342, 342, 342, 379, 342, 376, 381, - 381, 81, 187, 188, 342, 342, 342, 342, - 379, 342, 95, 382, 342, 187, 188, 342, - 342, 342, 342, 347, 342, 187, 188, 342, - 342, 342, 342, 347, 342, 383, 342, 342, - 342, 188, 342, 188, 342, 384, 342, 385, - 342, 386, 387, 342, 187, 188, 342, 342, - 342, 79, 342, 342, 342, 77, 342, 78, - 342, 342, 342, 342, 187, 188, 342, 187, - 188, 342, 385, 342, 342, 342, 342, 187, - 188, 342, 385, 342, 386, 342, 342, 187, - 188, 342, 342, 342, 79, 342, 95, 342, - 388, 388, 81, 187, 188, 342, 342, 342, - 342, 347, 342, 389, 104, 390, 391, 85, - 187, 188, 342, 342, 342, 342, 347, 342, - 104, 390, 391, 85, 187, 188, 342, 342, - 342, 342, 347, 342, 390, 390, 85, 187, - 188, 342, 342, 342, 342, 347, 342, 392, - 101, 393, 394, 88, 187, 188, 342, 342, - 342, 342, 347, 342, 101, 393, 394, 88, - 187, 188, 342, 342, 342, 342, 347, 342, - 393, 393, 88, 187, 188, 342, 342, 342, - 342, 347, 342, 395, 98, 396, 397, 91, - 187, 188, 342, 342, 342, 342, 347, 342, - 98, 396, 397, 91, 187, 188, 342, 342, - 342, 342, 347, 342, 396, 396, 91, 187, - 188, 342, 342, 342, 342, 347, 342, 398, - 95, 342, 399, 342, 187, 188, 342, 342, - 342, 342, 347, 342, 95, 342, 399, 342, - 187, 188, 342, 342, 342, 342, 347, 342, - 400, 342, 187, 188, 342, 342, 342, 342, - 347, 342, 95, 342, 342, 342, 342, 187, - 188, 342, 342, 342, 342, 347, 342, 77, - 78, 342, 342, 95, 382, 342, 187, 188, - 342, 342, 342, 342, 347, 342, 77, 342, - 375, 376, 381, 381, 81, 187, 188, 342, - 342, 342, 342, 379, 342, 375, 376, 377, - 381, 81, 187, 188, 342, 342, 342, 106, - 379, 342, 373, 342, 401, 342, 388, 388, - 81, 187, 188, 342, 342, 342, 342, 347, - 342, 373, 342, 373, 342, 342, 342, 342, - 342, 342, 187, 188, 342, 342, 342, 342, - 347, 342, 373, 342, 373, 342, 342, 342, - 342, 402, 342, 187, 188, 342, 342, 342, - 342, 347, 342, 373, 342, 373, 342, 401, - 342, 342, 342, 342, 187, 188, 342, 342, - 342, 342, 347, 342, 373, 342, 373, 78, - 342, 342, 95, 374, 342, 187, 188, 342, - 342, 342, 342, 347, 342, 373, 342, 366, - 367, 372, 372, 81, 187, 188, 342, 342, - 342, 342, 370, 342, 366, 367, 368, 372, - 81, 187, 188, 342, 342, 342, 108, 370, - 342, 364, 342, 403, 342, 388, 388, 81, - 187, 188, 342, 342, 342, 342, 347, 342, - 364, 342, 364, 342, 342, 342, 342, 342, - 342, 187, 188, 342, 342, 342, 342, 347, - 342, 364, 342, 364, 342, 342, 342, 342, - 404, 342, 187, 188, 342, 342, 342, 342, - 347, 342, 364, 342, 364, 342, 403, 342, - 342, 342, 342, 187, 188, 342, 342, 342, - 342, 347, 342, 364, 342, 364, 78, 342, - 342, 95, 365, 342, 187, 188, 342, 342, - 342, 342, 347, 342, 364, 342, 357, 358, - 363, 363, 81, 187, 188, 342, 342, 342, - 342, 361, 342, 357, 358, 359, 363, 81, - 187, 188, 342, 342, 342, 110, 361, 342, - 355, 342, 405, 342, 388, 388, 81, 187, - 188, 342, 342, 342, 342, 347, 342, 355, - 342, 355, 342, 342, 342, 342, 342, 342, - 187, 188, 342, 342, 342, 342, 347, 342, - 355, 342, 355, 342, 342, 342, 342, 406, - 342, 187, 188, 342, 342, 342, 342, 347, - 342, 355, 342, 355, 342, 405, 342, 342, - 342, 342, 187, 188, 342, 342, 342, 342, - 347, 342, 355, 342, 355, 78, 342, 342, - 95, 356, 342, 187, 188, 342, 342, 342, - 342, 347, 342, 355, 342, 348, 349, 354, - 354, 81, 187, 188, 342, 342, 342, 342, - 352, 342, 348, 349, 350, 354, 81, 187, - 188, 342, 342, 342, 112, 352, 342, 345, - 342, 407, 342, 388, 388, 81, 187, 188, - 342, 342, 342, 342, 347, 342, 345, 342, - 345, 342, 342, 342, 342, 342, 342, 187, - 188, 342, 342, 342, 342, 347, 342, 345, - 342, 345, 342, 342, 342, 342, 408, 342, - 187, 188, 342, 342, 342, 342, 347, 342, - 345, 342, 345, 342, 407, 342, 342, 342, - 342, 187, 188, 342, 342, 342, 342, 347, - 342, 345, 342, 345, 78, 342, 342, 95, - 346, 342, 187, 188, 342, 342, 342, 342, - 347, 342, 345, 342, 113, 80, 80, 81, - 409, 409, 409, 409, 409, 152, 113, 409, - 183, 184, 344, 344, 81, 187, 188, 342, - 342, 342, 342, 190, 342, 113, 80, 80, - 81, 409, 409, 409, 409, 409, 409, 113, - 409, 411, 412, 413, 414, 119, 415, 416, - 410, 410, 410, 151, 417, 410, 418, 412, - 414, 414, 119, 415, 416, 410, 410, 410, - 410, 417, 410, 412, 414, 414, 119, 415, - 416, 410, 410, 410, 410, 417, 410, 419, - 410, 410, 410, 132, 420, 410, 415, 416, - 410, 410, 410, 410, 421, 410, 419, 410, - 422, 423, 424, 425, 119, 415, 416, 410, - 410, 410, 149, 426, 410, 410, 419, 410, - 427, 423, 428, 428, 119, 415, 416, 410, - 410, 410, 410, 426, 410, 423, 428, 428, - 119, 415, 416, 410, 410, 410, 410, 426, - 410, 429, 410, 410, 410, 132, 430, 410, - 415, 416, 410, 410, 410, 410, 421, 410, - 429, 410, 431, 432, 433, 434, 119, 415, - 416, 410, 410, 410, 147, 435, 410, 410, - 429, 410, 436, 432, 437, 437, 119, 415, - 416, 410, 410, 410, 410, 435, 410, 432, - 437, 437, 119, 415, 416, 410, 410, 410, - 410, 435, 410, 438, 410, 410, 410, 132, - 439, 410, 415, 416, 410, 410, 410, 410, - 421, 410, 438, 410, 440, 441, 442, 443, - 119, 415, 416, 410, 410, 410, 145, 444, - 410, 410, 438, 410, 445, 441, 446, 446, - 119, 415, 416, 410, 410, 410, 410, 444, - 410, 441, 446, 446, 119, 415, 416, 410, - 410, 410, 410, 444, 410, 447, 410, 410, - 410, 132, 448, 410, 415, 416, 410, 410, - 410, 410, 421, 410, 447, 410, 449, 450, - 451, 452, 119, 415, 416, 410, 410, 410, - 143, 453, 410, 410, 447, 410, 454, 450, - 455, 455, 119, 415, 416, 410, 410, 410, - 410, 453, 410, 450, 455, 455, 119, 415, - 416, 410, 410, 410, 410, 453, 410, 132, - 456, 410, 415, 416, 410, 410, 410, 410, - 421, 410, 415, 416, 410, 410, 410, 410, - 421, 410, 457, 410, 410, 410, 416, 410, - 416, 410, 458, 410, 459, 410, 460, 461, - 410, 415, 416, 410, 410, 410, 117, 410, - 410, 410, 115, 410, 116, 410, 410, 410, - 410, 415, 416, 410, 415, 416, 410, 459, - 410, 410, 410, 410, 415, 416, 410, 459, - 410, 460, 410, 410, 415, 416, 410, 410, - 410, 117, 410, 132, 410, 462, 462, 119, - 415, 416, 410, 410, 410, 410, 421, 410, - 463, 141, 464, 465, 122, 415, 416, 410, - 410, 410, 410, 421, 410, 141, 464, 465, - 122, 415, 416, 410, 410, 410, 410, 421, - 410, 464, 464, 122, 415, 416, 410, 410, - 410, 410, 421, 410, 466, 138, 467, 468, - 125, 415, 416, 410, 410, 410, 410, 421, - 410, 138, 467, 468, 125, 415, 416, 410, - 410, 410, 410, 421, 410, 467, 467, 125, - 415, 416, 410, 410, 410, 410, 421, 410, - 469, 135, 470, 471, 128, 415, 416, 410, - 410, 410, 410, 421, 410, 135, 470, 471, - 128, 415, 416, 410, 410, 410, 410, 421, - 410, 470, 470, 128, 415, 416, 410, 410, - 410, 410, 421, 410, 472, 132, 410, 473, - 410, 415, 416, 410, 410, 410, 410, 421, - 410, 132, 410, 473, 410, 415, 416, 410, - 410, 410, 410, 421, 410, 474, 410, 415, - 416, 410, 410, 410, 410, 421, 410, 132, - 410, 410, 410, 410, 415, 416, 410, 410, - 410, 410, 421, 410, 115, 116, 410, 410, - 132, 456, 410, 415, 416, 410, 410, 410, - 410, 421, 410, 115, 410, 449, 450, 455, - 455, 119, 415, 416, 410, 410, 410, 410, - 453, 410, 449, 450, 451, 455, 119, 415, - 416, 410, 410, 410, 143, 453, 410, 447, - 410, 475, 410, 462, 462, 119, 415, 416, - 410, 410, 410, 410, 421, 410, 447, 410, - 447, 410, 410, 410, 410, 410, 410, 415, - 416, 410, 410, 410, 410, 421, 410, 447, - 410, 447, 410, 410, 410, 410, 476, 410, - 415, 416, 410, 410, 410, 410, 421, 410, - 447, 410, 447, 410, 475, 410, 410, 410, - 410, 415, 416, 410, 410, 410, 410, 421, - 410, 447, 410, 447, 116, 410, 410, 132, - 448, 410, 415, 416, 410, 410, 410, 410, - 421, 410, 447, 410, 440, 441, 446, 446, - 119, 415, 416, 410, 410, 410, 410, 444, - 410, 440, 441, 442, 446, 119, 415, 416, - 410, 410, 410, 145, 444, 410, 438, 410, - 477, 410, 462, 462, 119, 415, 416, 410, - 410, 410, 410, 421, 410, 438, 410, 438, - 410, 410, 410, 410, 410, 410, 415, 416, - 410, 410, 410, 410, 421, 410, 438, 410, - 438, 410, 410, 410, 410, 478, 410, 415, - 416, 410, 410, 410, 410, 421, 410, 438, - 410, 438, 410, 477, 410, 410, 410, 410, - 415, 416, 410, 410, 410, 410, 421, 410, - 438, 410, 438, 116, 410, 410, 132, 439, - 410, 415, 416, 410, 410, 410, 410, 421, - 410, 438, 410, 431, 432, 437, 437, 119, - 415, 416, 410, 410, 410, 410, 435, 410, - 431, 432, 433, 437, 119, 415, 416, 410, - 410, 410, 147, 435, 410, 429, 410, 479, - 410, 462, 462, 119, 415, 416, 410, 410, - 410, 410, 421, 410, 429, 410, 429, 410, - 410, 410, 410, 410, 410, 415, 416, 410, - 410, 410, 410, 421, 410, 429, 410, 429, - 410, 410, 410, 410, 480, 410, 415, 416, - 410, 410, 410, 410, 421, 410, 429, 410, - 429, 410, 479, 410, 410, 410, 410, 415, - 416, 410, 410, 410, 410, 421, 410, 429, - 410, 429, 116, 410, 410, 132, 430, 410, - 415, 416, 410, 410, 410, 410, 421, 410, - 429, 410, 422, 423, 428, 428, 119, 415, - 416, 410, 410, 410, 410, 426, 410, 422, - 423, 424, 428, 119, 415, 416, 410, 410, - 410, 149, 426, 410, 419, 410, 481, 410, - 462, 462, 119, 415, 416, 410, 410, 410, - 410, 421, 410, 419, 410, 419, 410, 410, - 410, 410, 410, 410, 415, 416, 410, 410, - 410, 410, 421, 410, 419, 410, 419, 410, - 410, 410, 410, 482, 410, 415, 416, 410, - 410, 410, 410, 421, 410, 419, 410, 419, - 410, 481, 410, 410, 410, 410, 415, 416, - 410, 410, 410, 410, 421, 410, 419, 410, - 419, 116, 410, 410, 132, 420, 410, 415, - 416, 410, 410, 410, 410, 421, 410, 419, - 410, 411, 412, 414, 414, 119, 415, 416, - 410, 410, 410, 410, 417, 410, 181, 182, - 183, 184, 483, 344, 81, 187, 188, 342, - 189, 189, 152, 190, 342, 181, 342, 194, - 484, 196, 197, 5, 198, 199, 200, 193, - 193, 37, 201, 193, 193, 181, 193, 204, - 182, 183, 184, 485, 486, 81, 487, 488, - 193, 189, 189, 152, 489, 193, 204, 193, - 113, 80, 80, 81, 198, 199, 193, 193, - 193, 152, 490, 193, 491, 2, 342, 342, - 342, 408, 342, 187, 188, 342, 342, 342, - 342, 347, 342, 491, 342, 492, 349, 493, - 494, 81, 487, 488, 193, 193, 193, 153, - 352, 193, 193, 491, 193, 495, 349, 354, - 354, 81, 487, 488, 193, 193, 193, 193, - 352, 193, 349, 354, 354, 81, 487, 488, - 193, 193, 193, 193, 352, 193, 496, 193, - 193, 193, 488, 193, 488, 193, 243, 193, - 492, 349, 354, 354, 81, 487, 488, 193, - 193, 193, 193, 352, 193, 492, 349, 493, - 354, 81, 487, 488, 193, 193, 193, 153, - 352, 193, 204, 193, 266, 113, 497, 497, - 155, 198, 199, 193, 193, 193, 193, 490, - 193, 204, 193, 498, 179, 499, 500, 157, - 487, 488, 193, 193, 193, 193, 501, 193, - 179, 499, 500, 157, 487, 488, 193, 193, - 193, 193, 501, 193, 499, 499, 157, 487, - 488, 193, 193, 193, 193, 501, 193, 502, - 176, 503, 504, 160, 487, 488, 193, 193, - 193, 193, 501, 193, 176, 503, 504, 160, - 487, 488, 193, 193, 193, 193, 501, 193, - 503, 503, 160, 487, 488, 193, 193, 193, - 193, 501, 193, 505, 173, 506, 507, 163, - 487, 488, 193, 193, 193, 193, 501, 193, - 173, 506, 507, 163, 487, 488, 193, 193, - 193, 193, 501, 193, 506, 506, 163, 487, - 488, 193, 193, 193, 193, 501, 193, 508, - 170, 193, 509, 193, 487, 488, 193, 193, - 193, 193, 501, 193, 170, 193, 509, 193, - 487, 488, 193, 193, 193, 193, 501, 193, - 487, 488, 193, 193, 193, 193, 501, 193, - 510, 193, 511, 512, 193, 487, 488, 193, - 193, 193, 167, 193, 193, 193, 165, 193, - 166, 193, 193, 193, 193, 487, 488, 193, - 487, 488, 193, 510, 193, 193, 193, 193, - 487, 488, 193, 510, 193, 511, 193, 193, - 487, 488, 193, 193, 193, 167, 193, 491, - 166, 342, 342, 95, 346, 342, 187, 188, - 342, 342, 342, 342, 347, 342, 491, 342, - 0 + 183, 184, 185, 186, 81, 187, 188, 189, + 190, 190, 152, 191, 192, 193, 194, 195, + 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 196, 180, 198, 199, + 200, 201, 5, 202, 203, 204, 197, 197, + 37, 205, 197, 197, 206, 207, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 208, 197, 209, 199, 210, 210, + 5, 202, 203, 204, 197, 197, 197, 205, + 197, 197, 206, 207, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 208, 197, 199, 210, 210, 5, 202, 203, + 204, 197, 197, 197, 205, 197, 197, 206, + 207, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 208, 197, 211, + 197, 197, 197, 18, 212, 197, 202, 203, + 204, 197, 197, 197, 213, 197, 211, 197, + 207, 197, 214, 215, 216, 217, 5, 202, + 203, 204, 197, 197, 35, 218, 197, 197, + 206, 207, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 208, 197, + 219, 215, 220, 220, 5, 202, 203, 204, + 197, 197, 197, 218, 197, 197, 206, 207, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 208, 197, 215, 220, + 220, 5, 202, 203, 204, 197, 197, 197, + 218, 197, 197, 206, 207, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 208, 197, 221, 197, 197, 197, 18, + 222, 197, 202, 203, 204, 197, 197, 197, + 213, 197, 221, 197, 207, 197, 223, 224, + 225, 226, 5, 202, 203, 204, 197, 197, + 33, 227, 197, 197, 206, 207, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 208, 197, 228, 224, 229, 229, + 5, 202, 203, 204, 197, 197, 197, 227, + 197, 197, 206, 207, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 208, 197, 224, 229, 229, 5, 202, 203, + 204, 197, 197, 197, 227, 197, 197, 206, + 207, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 208, 197, 230, + 197, 197, 197, 18, 231, 197, 202, 203, + 204, 197, 197, 197, 213, 197, 230, 197, + 207, 197, 232, 233, 234, 235, 5, 202, + 203, 204, 197, 197, 31, 236, 197, 197, + 206, 207, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 208, 197, + 237, 233, 238, 238, 5, 202, 203, 204, + 197, 197, 197, 236, 197, 197, 206, 207, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 208, 197, 233, 238, + 238, 5, 202, 203, 204, 197, 197, 197, + 236, 197, 197, 206, 207, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 208, 197, 239, 197, 197, 197, 18, + 240, 197, 202, 203, 204, 197, 197, 197, + 213, 197, 239, 197, 207, 197, 241, 242, + 243, 244, 5, 202, 203, 204, 197, 197, + 29, 245, 197, 197, 206, 207, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 208, 197, 246, 242, 247, 247, + 5, 202, 203, 204, 197, 197, 197, 245, + 197, 197, 206, 207, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 208, 197, 242, 247, 247, 5, 202, 203, + 204, 197, 197, 197, 245, 197, 197, 206, + 207, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 208, 197, 18, + 248, 197, 202, 203, 204, 197, 197, 197, + 213, 197, 197, 197, 207, 197, 202, 203, + 204, 197, 197, 197, 213, 197, 197, 197, + 207, 197, 249, 197, 197, 250, 203, 204, + 197, 203, 204, 197, 203, 251, 197, 203, + 197, 249, 197, 197, 197, 203, 204, 197, + 252, 197, 253, 254, 197, 202, 203, 204, + 197, 197, 3, 197, 197, 197, 197, 207, + 197, 2, 197, 197, 197, 197, 202, 203, + 204, 197, 197, 197, 197, 197, 197, 197, + 207, 197, 202, 203, 204, 197, 197, 197, + 197, 197, 197, 197, 207, 197, 255, 197, + 197, 197, 197, 202, 203, 204, 197, 202, + 203, 204, 197, 252, 197, 197, 197, 197, + 202, 203, 204, 197, 197, 197, 197, 197, + 197, 197, 207, 197, 252, 197, 253, 197, + 197, 202, 203, 204, 197, 197, 3, 197, + 197, 197, 197, 207, 197, 18, 197, 256, + 256, 5, 202, 203, 204, 197, 197, 197, + 213, 197, 197, 197, 207, 197, 257, 27, + 258, 259, 8, 202, 203, 204, 197, 197, + 197, 213, 197, 197, 197, 207, 197, 27, + 258, 259, 8, 202, 203, 204, 197, 197, + 197, 213, 197, 197, 197, 207, 197, 258, + 258, 8, 202, 203, 204, 197, 197, 197, + 213, 197, 197, 197, 207, 197, 260, 24, + 261, 262, 11, 202, 203, 204, 197, 197, + 197, 213, 197, 197, 197, 207, 197, 24, + 261, 262, 11, 202, 203, 204, 197, 197, + 197, 213, 197, 197, 197, 207, 197, 261, + 261, 11, 202, 203, 204, 197, 197, 197, + 213, 197, 197, 197, 207, 197, 263, 21, + 264, 265, 14, 202, 203, 204, 197, 197, + 197, 213, 197, 197, 197, 207, 197, 21, + 264, 265, 14, 202, 203, 204, 197, 197, + 197, 213, 197, 197, 197, 207, 197, 264, + 264, 14, 202, 203, 204, 197, 197, 197, + 213, 197, 197, 197, 207, 197, 266, 18, + 197, 267, 197, 202, 203, 204, 197, 197, + 197, 213, 197, 197, 197, 207, 197, 18, + 197, 267, 197, 202, 203, 204, 197, 197, + 197, 213, 197, 197, 197, 207, 197, 268, + 197, 202, 203, 204, 197, 197, 197, 213, + 197, 197, 197, 207, 197, 18, 197, 197, + 197, 197, 202, 203, 204, 197, 197, 197, + 213, 197, 197, 197, 207, 197, 1, 2, + 197, 197, 18, 248, 197, 202, 203, 204, + 197, 197, 197, 213, 197, 1, 197, 207, + 197, 242, 247, 247, 5, 202, 203, 204, + 197, 197, 197, 245, 197, 197, 197, 207, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 208, 197, 242, 247, + 247, 5, 202, 203, 204, 197, 197, 197, + 245, 197, 197, 197, 207, 197, 241, 242, + 247, 247, 5, 202, 203, 204, 197, 197, + 197, 245, 197, 197, 206, 207, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 208, 197, 241, 242, 243, 247, + 5, 202, 203, 204, 197, 197, 29, 245, + 197, 197, 206, 207, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 208, 197, 239, 197, 269, 197, 256, 256, + 5, 202, 203, 204, 197, 197, 197, 213, + 197, 239, 197, 207, 197, 239, 197, 197, + 197, 197, 197, 197, 202, 203, 204, 197, + 197, 197, 213, 197, 239, 197, 207, 197, + 239, 197, 197, 197, 197, 270, 197, 202, + 203, 204, 197, 197, 197, 213, 197, 239, + 197, 207, 197, 239, 197, 269, 197, 197, + 197, 197, 202, 203, 204, 197, 197, 197, + 213, 197, 239, 197, 207, 197, 239, 2, + 197, 197, 18, 240, 197, 202, 203, 204, + 197, 197, 197, 213, 197, 239, 197, 207, + 197, 232, 233, 238, 238, 5, 202, 203, + 204, 197, 197, 197, 236, 197, 197, 206, + 207, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 208, 197, 232, + 233, 234, 238, 5, 202, 203, 204, 197, + 197, 31, 236, 197, 197, 206, 207, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 208, 197, 230, 197, 271, + 197, 256, 256, 5, 202, 203, 204, 197, + 197, 197, 213, 197, 230, 197, 207, 197, + 230, 197, 197, 197, 197, 197, 197, 202, + 203, 204, 197, 197, 197, 213, 197, 230, + 197, 207, 197, 230, 197, 197, 197, 197, + 272, 197, 202, 203, 204, 197, 197, 197, + 213, 197, 230, 197, 207, 197, 230, 197, + 271, 197, 197, 197, 197, 202, 203, 204, + 197, 197, 197, 213, 197, 230, 197, 207, + 197, 230, 2, 197, 197, 18, 231, 197, + 202, 203, 204, 197, 197, 197, 213, 197, + 230, 197, 207, 197, 223, 224, 229, 229, + 5, 202, 203, 204, 197, 197, 197, 227, + 197, 197, 206, 207, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 208, 197, 223, 224, 225, 229, 5, 202, + 203, 204, 197, 197, 33, 227, 197, 197, + 206, 207, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 208, 197, + 221, 197, 273, 197, 256, 256, 5, 202, + 203, 204, 197, 197, 197, 213, 197, 221, + 197, 207, 197, 221, 197, 197, 197, 197, + 197, 197, 202, 203, 204, 197, 197, 197, + 213, 197, 221, 197, 207, 197, 221, 197, + 197, 197, 197, 274, 197, 202, 203, 204, + 197, 197, 197, 213, 197, 221, 197, 207, + 197, 221, 197, 273, 197, 197, 197, 197, + 202, 203, 204, 197, 197, 197, 213, 197, + 221, 197, 207, 197, 221, 2, 197, 197, + 18, 222, 197, 202, 203, 204, 197, 197, + 197, 213, 197, 221, 197, 207, 197, 214, + 215, 220, 220, 5, 202, 203, 204, 197, + 197, 197, 218, 197, 197, 206, 207, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 208, 197, 214, 215, 216, + 220, 5, 202, 203, 204, 197, 197, 35, + 218, 197, 197, 206, 207, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 208, 197, 211, 197, 275, 197, 256, + 256, 5, 202, 203, 204, 197, 197, 197, + 213, 197, 211, 197, 207, 197, 211, 197, + 197, 197, 197, 197, 197, 202, 203, 204, + 197, 197, 197, 213, 197, 211, 197, 207, + 197, 211, 197, 197, 197, 197, 276, 197, + 202, 203, 204, 197, 197, 197, 213, 197, + 211, 197, 207, 197, 211, 197, 275, 197, + 197, 197, 197, 202, 203, 204, 197, 197, + 197, 213, 197, 211, 197, 207, 197, 211, + 2, 197, 197, 18, 212, 197, 202, 203, + 204, 197, 197, 197, 213, 197, 211, 197, + 207, 197, 198, 199, 210, 210, 5, 202, + 203, 204, 197, 197, 197, 205, 197, 197, + 206, 207, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 208, 197, + 198, 199, 200, 210, 5, 202, 203, 204, + 197, 197, 37, 205, 197, 197, 206, 207, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 208, 197, 278, 279, + 280, 281, 43, 282, 283, 284, 277, 277, + 75, 285, 277, 277, 286, 287, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 288, 277, 289, 279, 290, 281, + 43, 282, 283, 284, 277, 277, 277, 285, + 277, 277, 286, 287, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 288, 277, 279, 290, 281, 43, 282, 283, + 284, 277, 277, 277, 285, 277, 277, 286, + 287, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 288, 277, 291, + 277, 277, 277, 56, 292, 277, 282, 283, + 284, 277, 277, 277, 293, 277, 291, 277, + 287, 277, 294, 295, 296, 297, 43, 282, + 283, 284, 277, 277, 73, 298, 277, 277, + 286, 287, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 288, 277, + 299, 295, 300, 300, 43, 282, 283, 284, + 277, 277, 277, 298, 277, 277, 286, 287, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 288, 277, 295, 300, + 300, 43, 282, 283, 284, 277, 277, 277, + 298, 277, 277, 286, 287, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 288, 277, 301, 277, 277, 277, 56, + 302, 277, 282, 283, 284, 277, 277, 277, + 293, 277, 301, 277, 287, 277, 303, 304, + 305, 306, 43, 282, 283, 284, 277, 277, + 71, 307, 277, 277, 286, 287, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 288, 277, 308, 304, 309, 309, + 43, 282, 283, 284, 277, 277, 277, 307, + 277, 277, 286, 287, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 288, 277, 304, 309, 309, 43, 282, 283, + 284, 277, 277, 277, 307, 277, 277, 286, + 287, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 288, 277, 310, + 277, 277, 277, 56, 311, 277, 282, 283, + 284, 277, 277, 277, 293, 277, 310, 277, + 287, 277, 312, 313, 314, 315, 43, 282, + 283, 284, 277, 277, 69, 316, 277, 277, + 286, 287, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 288, 277, + 317, 313, 318, 318, 43, 282, 283, 284, + 277, 277, 277, 316, 277, 277, 286, 287, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 288, 277, 313, 318, + 318, 43, 282, 283, 284, 277, 277, 277, + 316, 277, 277, 286, 287, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 288, 277, 319, 277, 277, 277, 56, + 320, 277, 282, 283, 284, 277, 277, 277, + 293, 277, 319, 277, 287, 277, 321, 322, + 323, 324, 43, 282, 283, 284, 277, 277, + 67, 325, 277, 277, 286, 287, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 288, 277, 326, 322, 327, 327, + 43, 282, 283, 284, 277, 277, 277, 325, + 277, 277, 286, 287, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 288, 277, 322, 327, 327, 43, 282, 283, + 284, 277, 277, 277, 325, 277, 277, 286, + 287, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 288, 277, 56, + 328, 277, 282, 283, 284, 277, 277, 277, + 293, 277, 277, 277, 287, 277, 282, 283, + 284, 277, 277, 277, 293, 277, 277, 277, + 287, 277, 329, 277, 277, 330, 283, 284, + 277, 283, 284, 277, 283, 331, 277, 283, + 277, 329, 277, 277, 277, 283, 284, 277, + 332, 277, 333, 334, 277, 282, 283, 284, + 277, 277, 41, 277, 277, 277, 277, 287, + 277, 40, 277, 277, 277, 277, 282, 283, + 284, 277, 277, 277, 277, 277, 277, 277, + 287, 277, 282, 283, 284, 277, 277, 277, + 277, 277, 277, 277, 287, 277, 335, 277, + 277, 277, 277, 282, 283, 284, 277, 282, + 283, 284, 277, 332, 277, 277, 277, 277, + 282, 283, 284, 277, 277, 277, 277, 277, + 277, 277, 287, 277, 332, 277, 333, 277, + 277, 282, 283, 284, 277, 277, 41, 277, + 277, 277, 277, 287, 277, 56, 277, 336, + 336, 43, 282, 283, 284, 277, 277, 277, + 293, 277, 277, 277, 287, 277, 337, 65, + 338, 339, 46, 282, 283, 284, 277, 277, + 277, 293, 277, 277, 277, 287, 277, 65, + 338, 339, 46, 282, 283, 284, 277, 277, + 277, 293, 277, 277, 277, 287, 277, 338, + 338, 46, 282, 283, 284, 277, 277, 277, + 293, 277, 277, 277, 287, 277, 340, 62, + 341, 342, 49, 282, 283, 284, 277, 277, + 277, 293, 277, 277, 277, 287, 277, 62, + 341, 342, 49, 282, 283, 284, 277, 277, + 277, 293, 277, 277, 277, 287, 277, 341, + 341, 49, 282, 283, 284, 277, 277, 277, + 293, 277, 277, 277, 287, 277, 343, 59, + 344, 345, 52, 282, 283, 284, 277, 277, + 277, 293, 277, 277, 277, 287, 277, 59, + 344, 345, 52, 282, 283, 284, 277, 277, + 277, 293, 277, 277, 277, 287, 277, 344, + 344, 52, 282, 283, 284, 277, 277, 277, + 293, 277, 277, 277, 287, 277, 346, 56, + 277, 347, 277, 282, 283, 284, 277, 277, + 277, 293, 277, 277, 277, 287, 277, 56, + 277, 347, 277, 282, 283, 284, 277, 277, + 277, 293, 277, 277, 277, 287, 277, 348, + 277, 282, 283, 284, 277, 277, 277, 293, + 277, 277, 277, 287, 277, 56, 277, 277, + 277, 277, 282, 283, 284, 277, 277, 277, + 293, 277, 277, 277, 287, 277, 39, 40, + 277, 277, 56, 328, 277, 282, 283, 284, + 277, 277, 277, 293, 277, 39, 277, 287, + 277, 322, 327, 327, 43, 282, 283, 284, + 277, 277, 277, 325, 277, 277, 277, 287, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 288, 277, 322, 327, + 327, 43, 282, 283, 284, 277, 277, 277, + 325, 277, 277, 277, 287, 277, 321, 322, + 327, 327, 43, 282, 283, 284, 277, 277, + 277, 325, 277, 277, 286, 287, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 288, 277, 321, 322, 323, 327, + 43, 282, 283, 284, 277, 277, 67, 325, + 277, 277, 286, 287, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 288, 277, 319, 277, 349, 277, 336, 336, + 43, 282, 283, 284, 277, 277, 277, 293, + 277, 319, 277, 287, 277, 319, 277, 277, + 277, 277, 277, 277, 282, 283, 284, 277, + 277, 277, 293, 277, 319, 277, 287, 277, + 319, 277, 277, 277, 277, 350, 277, 282, + 283, 284, 277, 277, 277, 293, 277, 319, + 277, 287, 277, 319, 277, 349, 277, 277, + 277, 277, 282, 283, 284, 277, 277, 277, + 293, 277, 319, 277, 287, 277, 319, 40, + 277, 277, 56, 320, 277, 282, 283, 284, + 277, 277, 277, 293, 277, 319, 277, 287, + 277, 312, 313, 318, 318, 43, 282, 283, + 284, 277, 277, 277, 316, 277, 277, 286, + 287, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 288, 277, 312, + 313, 314, 318, 43, 282, 283, 284, 277, + 277, 69, 316, 277, 277, 286, 287, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 288, 277, 310, 277, 351, + 277, 336, 336, 43, 282, 283, 284, 277, + 277, 277, 293, 277, 310, 277, 287, 277, + 310, 277, 277, 277, 277, 277, 277, 282, + 283, 284, 277, 277, 277, 293, 277, 310, + 277, 287, 277, 310, 277, 277, 277, 277, + 352, 277, 282, 283, 284, 277, 277, 277, + 293, 277, 310, 277, 287, 277, 310, 277, + 351, 277, 277, 277, 277, 282, 283, 284, + 277, 277, 277, 293, 277, 310, 277, 287, + 277, 310, 40, 277, 277, 56, 311, 277, + 282, 283, 284, 277, 277, 277, 293, 277, + 310, 277, 287, 277, 303, 304, 309, 309, + 43, 282, 283, 284, 277, 277, 277, 307, + 277, 277, 286, 287, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 288, 277, 303, 304, 305, 309, 43, 282, + 283, 284, 277, 277, 71, 307, 277, 277, + 286, 287, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 288, 277, + 301, 277, 353, 277, 336, 336, 43, 282, + 283, 284, 277, 277, 277, 293, 277, 301, + 277, 287, 277, 301, 277, 277, 277, 277, + 277, 277, 282, 283, 284, 277, 277, 277, + 293, 277, 301, 277, 287, 277, 301, 277, + 277, 277, 277, 354, 277, 282, 283, 284, + 277, 277, 277, 293, 277, 301, 277, 287, + 277, 301, 277, 353, 277, 277, 277, 277, + 282, 283, 284, 277, 277, 277, 293, 277, + 301, 277, 287, 277, 301, 40, 277, 277, + 56, 302, 277, 282, 283, 284, 277, 277, + 277, 293, 277, 301, 277, 287, 277, 294, + 295, 300, 300, 43, 282, 283, 284, 277, + 277, 277, 298, 277, 277, 286, 287, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 288, 277, 294, 295, 296, + 300, 43, 282, 283, 284, 277, 277, 73, + 298, 277, 277, 286, 287, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 288, 277, 291, 277, 355, 277, 336, + 336, 43, 282, 283, 284, 277, 277, 277, + 293, 277, 291, 277, 287, 277, 291, 277, + 277, 277, 277, 277, 277, 282, 283, 284, + 277, 277, 277, 293, 277, 291, 277, 287, + 277, 291, 277, 277, 277, 277, 356, 277, + 282, 283, 284, 277, 277, 277, 293, 277, + 291, 277, 287, 277, 291, 277, 355, 277, + 277, 277, 277, 282, 283, 284, 277, 277, + 277, 293, 277, 291, 277, 287, 277, 74, + 42, 42, 43, 277, 277, 277, 277, 277, + 277, 74, 277, 291, 40, 277, 277, 56, + 292, 277, 282, 283, 284, 277, 277, 277, + 293, 277, 291, 277, 287, 277, 278, 279, + 290, 281, 43, 282, 283, 284, 277, 277, + 277, 285, 277, 277, 286, 287, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 288, 277, 358, 184, 359, 359, + 81, 187, 188, 189, 357, 357, 357, 191, + 357, 357, 194, 360, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 196, 357, 184, 359, 359, 81, 187, 188, + 189, 357, 357, 357, 191, 357, 357, 194, + 360, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 196, 357, 361, + 357, 357, 357, 95, 362, 357, 187, 188, + 189, 357, 357, 357, 363, 357, 361, 357, + 360, 357, 364, 365, 366, 367, 81, 187, + 188, 189, 357, 357, 112, 368, 357, 357, + 194, 360, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 196, 357, + 369, 365, 370, 370, 81, 187, 188, 189, + 357, 357, 357, 368, 357, 357, 194, 360, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 196, 357, 365, 370, + 370, 81, 187, 188, 189, 357, 357, 357, + 368, 357, 357, 194, 360, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 196, 357, 371, 357, 357, 357, 95, + 372, 357, 187, 188, 189, 357, 357, 357, + 363, 357, 371, 357, 360, 357, 373, 374, + 375, 376, 81, 187, 188, 189, 357, 357, + 110, 377, 357, 357, 194, 360, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 196, 357, 378, 374, 379, 379, + 81, 187, 188, 189, 357, 357, 357, 377, + 357, 357, 194, 360, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 196, 357, 374, 379, 379, 81, 187, 188, + 189, 357, 357, 357, 377, 357, 357, 194, + 360, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 196, 357, 380, + 357, 357, 357, 95, 381, 357, 187, 188, + 189, 357, 357, 357, 363, 357, 380, 357, + 360, 357, 382, 383, 384, 385, 81, 187, + 188, 189, 357, 357, 108, 386, 357, 357, + 194, 360, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 196, 357, + 387, 383, 388, 388, 81, 187, 188, 189, + 357, 357, 357, 386, 357, 357, 194, 360, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 196, 357, 383, 388, + 388, 81, 187, 188, 189, 357, 357, 357, + 386, 357, 357, 194, 360, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 196, 357, 389, 357, 357, 357, 95, + 390, 357, 187, 188, 189, 357, 357, 357, + 363, 357, 389, 357, 360, 357, 391, 392, + 393, 394, 81, 187, 188, 189, 357, 357, + 106, 395, 357, 357, 194, 360, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 196, 357, 396, 392, 397, 397, + 81, 187, 188, 189, 357, 357, 357, 395, + 357, 357, 194, 360, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 196, 357, 392, 397, 397, 81, 187, 188, + 189, 357, 357, 357, 395, 357, 357, 194, + 360, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 196, 357, 95, + 398, 357, 187, 188, 189, 357, 357, 357, + 363, 357, 357, 357, 360, 357, 187, 188, + 189, 357, 357, 357, 363, 357, 357, 357, + 360, 357, 399, 357, 357, 400, 188, 189, + 357, 188, 189, 357, 188, 401, 357, 188, + 357, 399, 357, 357, 357, 188, 189, 357, + 402, 357, 403, 404, 357, 187, 188, 189, + 357, 357, 79, 357, 357, 357, 357, 360, + 357, 78, 357, 357, 357, 357, 187, 188, + 189, 357, 357, 357, 357, 357, 357, 357, + 360, 357, 187, 188, 189, 357, 357, 357, + 357, 357, 357, 357, 360, 357, 405, 357, + 357, 357, 357, 187, 188, 189, 357, 187, + 188, 189, 357, 402, 357, 357, 357, 357, + 187, 188, 189, 357, 357, 357, 357, 357, + 357, 357, 360, 357, 402, 357, 403, 357, + 357, 187, 188, 189, 357, 357, 79, 357, + 357, 357, 357, 360, 357, 95, 357, 406, + 406, 81, 187, 188, 189, 357, 357, 357, + 363, 357, 357, 357, 360, 357, 407, 104, + 408, 409, 85, 187, 188, 189, 357, 357, + 357, 363, 357, 357, 357, 360, 357, 104, + 408, 409, 85, 187, 188, 189, 357, 357, + 357, 363, 357, 357, 357, 360, 357, 408, + 408, 85, 187, 188, 189, 357, 357, 357, + 363, 357, 357, 357, 360, 357, 410, 101, + 411, 412, 88, 187, 188, 189, 357, 357, + 357, 363, 357, 357, 357, 360, 357, 101, + 411, 412, 88, 187, 188, 189, 357, 357, + 357, 363, 357, 357, 357, 360, 357, 411, + 411, 88, 187, 188, 189, 357, 357, 357, + 363, 357, 357, 357, 360, 357, 413, 98, + 414, 415, 91, 187, 188, 189, 357, 357, + 357, 363, 357, 357, 357, 360, 357, 98, + 414, 415, 91, 187, 188, 189, 357, 357, + 357, 363, 357, 357, 357, 360, 357, 414, + 414, 91, 187, 188, 189, 357, 357, 357, + 363, 357, 357, 357, 360, 357, 416, 95, + 357, 417, 357, 187, 188, 189, 357, 357, + 357, 363, 357, 357, 357, 360, 357, 95, + 357, 417, 357, 187, 188, 189, 357, 357, + 357, 363, 357, 357, 357, 360, 357, 418, + 357, 187, 188, 189, 357, 357, 357, 363, + 357, 357, 357, 360, 357, 95, 357, 357, + 357, 357, 187, 188, 189, 357, 357, 357, + 363, 357, 357, 357, 360, 357, 77, 78, + 357, 357, 95, 398, 357, 187, 188, 189, + 357, 357, 357, 363, 357, 77, 357, 360, + 357, 392, 397, 397, 81, 187, 188, 189, + 357, 357, 357, 395, 357, 357, 357, 360, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 196, 357, 392, 397, + 397, 81, 187, 188, 189, 357, 357, 357, + 395, 357, 357, 357, 360, 357, 391, 392, + 397, 397, 81, 187, 188, 189, 357, 357, + 357, 395, 357, 357, 194, 360, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 196, 357, 391, 392, 393, 397, + 81, 187, 188, 189, 357, 357, 106, 395, + 357, 357, 194, 360, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 196, 357, 389, 357, 419, 357, 406, 406, + 81, 187, 188, 189, 357, 357, 357, 363, + 357, 389, 357, 360, 357, 389, 357, 357, + 357, 357, 357, 357, 187, 188, 189, 357, + 357, 357, 363, 357, 389, 357, 360, 357, + 389, 357, 357, 357, 357, 420, 357, 187, + 188, 189, 357, 357, 357, 363, 357, 389, + 357, 360, 357, 389, 357, 419, 357, 357, + 357, 357, 187, 188, 189, 357, 357, 357, + 363, 357, 389, 357, 360, 357, 389, 78, + 357, 357, 95, 390, 357, 187, 188, 189, + 357, 357, 357, 363, 357, 389, 357, 360, + 357, 382, 383, 388, 388, 81, 187, 188, + 189, 357, 357, 357, 386, 357, 357, 194, + 360, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 196, 357, 382, + 383, 384, 388, 81, 187, 188, 189, 357, + 357, 108, 386, 357, 357, 194, 360, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 196, 357, 380, 357, 421, + 357, 406, 406, 81, 187, 188, 189, 357, + 357, 357, 363, 357, 380, 357, 360, 357, + 380, 357, 357, 357, 357, 357, 357, 187, + 188, 189, 357, 357, 357, 363, 357, 380, + 357, 360, 357, 380, 357, 357, 357, 357, + 422, 357, 187, 188, 189, 357, 357, 357, + 363, 357, 380, 357, 360, 357, 380, 357, + 421, 357, 357, 357, 357, 187, 188, 189, + 357, 357, 357, 363, 357, 380, 357, 360, + 357, 380, 78, 357, 357, 95, 381, 357, + 187, 188, 189, 357, 357, 357, 363, 357, + 380, 357, 360, 357, 373, 374, 379, 379, + 81, 187, 188, 189, 357, 357, 357, 377, + 357, 357, 194, 360, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 196, 357, 373, 374, 375, 379, 81, 187, + 188, 189, 357, 357, 110, 377, 357, 357, + 194, 360, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 196, 357, + 371, 357, 423, 357, 406, 406, 81, 187, + 188, 189, 357, 357, 357, 363, 357, 371, + 357, 360, 357, 371, 357, 357, 357, 357, + 357, 357, 187, 188, 189, 357, 357, 357, + 363, 357, 371, 357, 360, 357, 371, 357, + 357, 357, 357, 424, 357, 187, 188, 189, + 357, 357, 357, 363, 357, 371, 357, 360, + 357, 371, 357, 423, 357, 357, 357, 357, + 187, 188, 189, 357, 357, 357, 363, 357, + 371, 357, 360, 357, 371, 78, 357, 357, + 95, 372, 357, 187, 188, 189, 357, 357, + 357, 363, 357, 371, 357, 360, 357, 364, + 365, 370, 370, 81, 187, 188, 189, 357, + 357, 357, 368, 357, 357, 194, 360, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 196, 357, 364, 365, 366, + 370, 81, 187, 188, 189, 357, 357, 112, + 368, 357, 357, 194, 360, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 196, 357, 361, 357, 425, 357, 406, + 406, 81, 187, 188, 189, 357, 357, 357, + 363, 357, 361, 357, 360, 357, 361, 357, + 357, 357, 357, 357, 357, 187, 188, 189, + 357, 357, 357, 363, 357, 361, 357, 360, + 357, 361, 357, 357, 357, 357, 426, 357, + 187, 188, 189, 357, 357, 357, 363, 357, + 361, 357, 360, 357, 361, 357, 425, 357, + 357, 357, 357, 187, 188, 189, 357, 357, + 357, 363, 357, 361, 357, 360, 357, 361, + 78, 357, 357, 95, 362, 357, 187, 188, + 189, 357, 357, 357, 363, 357, 361, 357, + 360, 357, 113, 80, 80, 81, 427, 427, + 427, 427, 427, 152, 113, 427, 183, 184, + 359, 359, 81, 187, 188, 189, 357, 357, + 357, 191, 357, 357, 194, 360, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 196, 357, 113, 80, 80, 81, + 427, 427, 427, 427, 427, 427, 113, 427, + 429, 430, 431, 432, 119, 433, 434, 435, + 428, 428, 151, 436, 428, 428, 437, 438, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 439, 428, 440, 430, + 432, 432, 119, 433, 434, 435, 428, 428, + 428, 436, 428, 428, 437, 438, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 439, 428, 430, 432, 432, 119, + 433, 434, 435, 428, 428, 428, 436, 428, + 428, 437, 438, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 439, + 428, 441, 428, 428, 428, 132, 442, 428, + 433, 434, 435, 428, 428, 428, 443, 428, + 441, 428, 438, 428, 444, 445, 446, 447, + 119, 433, 434, 435, 428, 428, 149, 448, + 428, 428, 437, 438, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 439, 428, 449, 445, 450, 450, 119, 433, + 434, 435, 428, 428, 428, 448, 428, 428, + 437, 438, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 439, 428, + 445, 450, 450, 119, 433, 434, 435, 428, + 428, 428, 448, 428, 428, 437, 438, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 439, 428, 451, 428, 428, + 428, 132, 452, 428, 433, 434, 435, 428, + 428, 428, 443, 428, 451, 428, 438, 428, + 453, 454, 455, 456, 119, 433, 434, 435, + 428, 428, 147, 457, 428, 428, 437, 438, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 439, 428, 458, 454, + 459, 459, 119, 433, 434, 435, 428, 428, + 428, 457, 428, 428, 437, 438, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 439, 428, 454, 459, 459, 119, + 433, 434, 435, 428, 428, 428, 457, 428, + 428, 437, 438, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 439, + 428, 460, 428, 428, 428, 132, 461, 428, + 433, 434, 435, 428, 428, 428, 443, 428, + 460, 428, 438, 428, 462, 463, 464, 465, + 119, 433, 434, 435, 428, 428, 145, 466, + 428, 428, 437, 438, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 439, 428, 467, 463, 468, 468, 119, 433, + 434, 435, 428, 428, 428, 466, 428, 428, + 437, 438, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 439, 428, + 463, 468, 468, 119, 433, 434, 435, 428, + 428, 428, 466, 428, 428, 437, 438, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 439, 428, 469, 428, 428, + 428, 132, 470, 428, 433, 434, 435, 428, + 428, 428, 443, 428, 469, 428, 438, 428, + 471, 472, 473, 474, 119, 433, 434, 435, + 428, 428, 143, 475, 428, 428, 437, 438, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 439, 428, 476, 472, + 477, 477, 119, 433, 434, 435, 428, 428, + 428, 475, 428, 428, 437, 438, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 439, 428, 472, 477, 477, 119, + 433, 434, 435, 428, 428, 428, 475, 428, + 428, 437, 438, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 439, + 428, 132, 478, 428, 433, 434, 435, 428, + 428, 428, 443, 428, 428, 428, 438, 428, + 433, 434, 435, 428, 428, 428, 443, 428, + 428, 428, 438, 428, 479, 428, 428, 480, + 434, 435, 428, 434, 435, 428, 434, 481, + 428, 434, 428, 479, 428, 428, 428, 434, + 435, 428, 482, 428, 483, 484, 428, 433, + 434, 435, 428, 428, 117, 428, 428, 428, + 428, 438, 428, 116, 428, 428, 428, 428, + 433, 434, 435, 428, 428, 428, 428, 428, + 428, 428, 438, 428, 433, 434, 435, 428, + 428, 428, 428, 428, 428, 428, 438, 428, + 485, 428, 428, 428, 428, 433, 434, 435, + 428, 433, 434, 435, 428, 482, 428, 428, + 428, 428, 433, 434, 435, 428, 428, 428, + 428, 428, 428, 428, 438, 428, 482, 428, + 483, 428, 428, 433, 434, 435, 428, 428, + 117, 428, 428, 428, 428, 438, 428, 132, + 428, 486, 486, 119, 433, 434, 435, 428, + 428, 428, 443, 428, 428, 428, 438, 428, + 487, 141, 488, 489, 122, 433, 434, 435, + 428, 428, 428, 443, 428, 428, 428, 438, + 428, 141, 488, 489, 122, 433, 434, 435, + 428, 428, 428, 443, 428, 428, 428, 438, + 428, 488, 488, 122, 433, 434, 435, 428, + 428, 428, 443, 428, 428, 428, 438, 428, + 490, 138, 491, 492, 125, 433, 434, 435, + 428, 428, 428, 443, 428, 428, 428, 438, + 428, 138, 491, 492, 125, 433, 434, 435, + 428, 428, 428, 443, 428, 428, 428, 438, + 428, 491, 491, 125, 433, 434, 435, 428, + 428, 428, 443, 428, 428, 428, 438, 428, + 493, 135, 494, 495, 128, 433, 434, 435, + 428, 428, 428, 443, 428, 428, 428, 438, + 428, 135, 494, 495, 128, 433, 434, 435, + 428, 428, 428, 443, 428, 428, 428, 438, + 428, 494, 494, 128, 433, 434, 435, 428, + 428, 428, 443, 428, 428, 428, 438, 428, + 496, 132, 428, 497, 428, 433, 434, 435, + 428, 428, 428, 443, 428, 428, 428, 438, + 428, 132, 428, 497, 428, 433, 434, 435, + 428, 428, 428, 443, 428, 428, 428, 438, + 428, 498, 428, 433, 434, 435, 428, 428, + 428, 443, 428, 428, 428, 438, 428, 132, + 428, 428, 428, 428, 433, 434, 435, 428, + 428, 428, 443, 428, 428, 428, 438, 428, + 115, 116, 428, 428, 132, 478, 428, 433, + 434, 435, 428, 428, 428, 443, 428, 115, + 428, 438, 428, 472, 477, 477, 119, 433, + 434, 435, 428, 428, 428, 475, 428, 428, + 428, 438, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 439, 428, + 472, 477, 477, 119, 433, 434, 435, 428, + 428, 428, 475, 428, 428, 428, 438, 428, + 471, 472, 477, 477, 119, 433, 434, 435, + 428, 428, 428, 475, 428, 428, 437, 438, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 439, 428, 471, 472, + 473, 477, 119, 433, 434, 435, 428, 428, + 143, 475, 428, 428, 437, 438, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 439, 428, 469, 428, 499, 428, + 486, 486, 119, 433, 434, 435, 428, 428, + 428, 443, 428, 469, 428, 438, 428, 469, + 428, 428, 428, 428, 428, 428, 433, 434, + 435, 428, 428, 428, 443, 428, 469, 428, + 438, 428, 469, 428, 428, 428, 428, 500, + 428, 433, 434, 435, 428, 428, 428, 443, + 428, 469, 428, 438, 428, 469, 428, 499, + 428, 428, 428, 428, 433, 434, 435, 428, + 428, 428, 443, 428, 469, 428, 438, 428, + 469, 116, 428, 428, 132, 470, 428, 433, + 434, 435, 428, 428, 428, 443, 428, 469, + 428, 438, 428, 462, 463, 468, 468, 119, + 433, 434, 435, 428, 428, 428, 466, 428, + 428, 437, 438, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 439, + 428, 462, 463, 464, 468, 119, 433, 434, + 435, 428, 428, 145, 466, 428, 428, 437, + 438, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 439, 428, 460, + 428, 501, 428, 486, 486, 119, 433, 434, + 435, 428, 428, 428, 443, 428, 460, 428, + 438, 428, 460, 428, 428, 428, 428, 428, + 428, 433, 434, 435, 428, 428, 428, 443, + 428, 460, 428, 438, 428, 460, 428, 428, + 428, 428, 502, 428, 433, 434, 435, 428, + 428, 428, 443, 428, 460, 428, 438, 428, + 460, 428, 501, 428, 428, 428, 428, 433, + 434, 435, 428, 428, 428, 443, 428, 460, + 428, 438, 428, 460, 116, 428, 428, 132, + 461, 428, 433, 434, 435, 428, 428, 428, + 443, 428, 460, 428, 438, 428, 453, 454, + 459, 459, 119, 433, 434, 435, 428, 428, + 428, 457, 428, 428, 437, 438, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 439, 428, 453, 454, 455, 459, + 119, 433, 434, 435, 428, 428, 147, 457, + 428, 428, 437, 438, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 439, 428, 451, 428, 503, 428, 486, 486, + 119, 433, 434, 435, 428, 428, 428, 443, + 428, 451, 428, 438, 428, 451, 428, 428, + 428, 428, 428, 428, 433, 434, 435, 428, + 428, 428, 443, 428, 451, 428, 438, 428, + 451, 428, 428, 428, 428, 504, 428, 433, + 434, 435, 428, 428, 428, 443, 428, 451, + 428, 438, 428, 451, 428, 503, 428, 428, + 428, 428, 433, 434, 435, 428, 428, 428, + 443, 428, 451, 428, 438, 428, 451, 116, + 428, 428, 132, 452, 428, 433, 434, 435, + 428, 428, 428, 443, 428, 451, 428, 438, + 428, 444, 445, 450, 450, 119, 433, 434, + 435, 428, 428, 428, 448, 428, 428, 437, + 438, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 439, 428, 444, + 445, 446, 450, 119, 433, 434, 435, 428, + 428, 149, 448, 428, 428, 437, 438, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 439, 428, 441, 428, 505, + 428, 486, 486, 119, 433, 434, 435, 428, + 428, 428, 443, 428, 441, 428, 438, 428, + 441, 428, 428, 428, 428, 428, 428, 433, + 434, 435, 428, 428, 428, 443, 428, 441, + 428, 438, 428, 441, 428, 428, 428, 428, + 506, 428, 433, 434, 435, 428, 428, 428, + 443, 428, 441, 428, 438, 428, 441, 428, + 505, 428, 428, 428, 428, 433, 434, 435, + 428, 428, 428, 443, 428, 441, 428, 438, + 428, 441, 116, 428, 428, 132, 442, 428, + 433, 434, 435, 428, 428, 428, 443, 428, + 441, 428, 438, 428, 429, 430, 432, 432, + 119, 433, 434, 435, 428, 428, 428, 436, + 428, 428, 437, 438, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, + 439, 428, 181, 182, 183, 184, 507, 359, + 81, 187, 188, 189, 190, 190, 152, 191, + 357, 181, 194, 360, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 357, + 196, 357, 198, 508, 200, 201, 5, 202, + 203, 204, 197, 197, 37, 205, 197, 197, + 206, 207, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 208, 197, + 211, 182, 183, 184, 509, 510, 81, 511, + 203, 512, 190, 190, 152, 513, 197, 211, + 194, 514, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 196, 197, + 113, 80, 80, 81, 202, 203, 204, 197, + 197, 152, 515, 197, 197, 197, 207, 197, + 516, 2, 357, 357, 357, 426, 357, 187, + 188, 189, 357, 357, 357, 363, 357, 516, + 357, 360, 357, 517, 365, 518, 519, 81, + 511, 203, 512, 197, 197, 153, 368, 197, + 197, 194, 514, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 196, + 197, 520, 365, 370, 370, 81, 511, 203, + 512, 197, 197, 197, 368, 197, 197, 194, + 514, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 196, 197, 365, + 370, 370, 81, 511, 203, 512, 197, 197, + 197, 368, 197, 197, 194, 514, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 196, 197, 521, 197, 197, 522, + 203, 512, 197, 203, 512, 197, 203, 523, + 197, 203, 197, 521, 197, 197, 197, 203, + 512, 197, 524, 197, 197, 197, 197, 511, + 203, 512, 197, 511, 203, 512, 197, 517, + 365, 370, 370, 81, 511, 203, 512, 197, + 197, 197, 368, 197, 197, 194, 514, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 196, 197, 517, 365, 518, + 370, 81, 511, 203, 512, 197, 197, 153, + 368, 197, 197, 194, 514, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, + 197, 196, 197, 211, 197, 275, 113, 525, + 525, 155, 202, 203, 204, 197, 197, 197, + 515, 197, 211, 197, 207, 197, 526, 179, + 527, 528, 157, 511, 203, 512, 197, 197, + 197, 529, 197, 197, 197, 514, 197, 179, + 527, 528, 157, 511, 203, 512, 197, 197, + 197, 529, 197, 197, 197, 514, 197, 527, + 527, 157, 511, 203, 512, 197, 197, 197, + 529, 197, 197, 197, 514, 197, 530, 176, + 531, 532, 160, 511, 203, 512, 197, 197, + 197, 529, 197, 197, 197, 514, 197, 176, + 531, 532, 160, 511, 203, 512, 197, 197, + 197, 529, 197, 197, 197, 514, 197, 531, + 531, 160, 511, 203, 512, 197, 197, 197, + 529, 197, 197, 197, 514, 197, 533, 173, + 534, 535, 163, 511, 203, 512, 197, 197, + 197, 529, 197, 197, 197, 514, 197, 173, + 534, 535, 163, 511, 203, 512, 197, 197, + 197, 529, 197, 197, 197, 514, 197, 534, + 534, 163, 511, 203, 512, 197, 197, 197, + 529, 197, 197, 197, 514, 197, 536, 170, + 197, 537, 197, 511, 203, 512, 197, 197, + 197, 529, 197, 197, 197, 514, 197, 170, + 197, 537, 197, 511, 203, 512, 197, 197, + 197, 529, 197, 197, 197, 514, 197, 511, + 203, 512, 197, 197, 197, 529, 197, 197, + 197, 514, 197, 538, 197, 539, 540, 197, + 511, 203, 512, 197, 197, 167, 197, 197, + 197, 197, 514, 197, 166, 197, 197, 197, + 197, 511, 203, 512, 197, 197, 197, 197, + 197, 197, 197, 514, 197, 511, 203, 512, + 197, 197, 197, 197, 197, 197, 197, 514, + 197, 538, 197, 197, 197, 197, 511, 203, + 512, 197, 197, 197, 197, 197, 197, 197, + 514, 197, 538, 197, 539, 197, 197, 511, + 203, 512, 197, 197, 167, 197, 197, 197, + 197, 514, 197, 516, 166, 357, 357, 95, + 362, 357, 187, 188, 189, 357, 357, 357, + 363, 357, 516, 357, 360, 357, 542, 541, + 541, 541, 541, 543, 544, 545, 541, 543, + 544, 545, 541, 546, 541, 541, 547, 544, + 545, 541, 544, 545, 541, 544, 548, 541, + 544, 541, 546, 541, 541, 541, 544, 545, + 541, 0 }; static const short _indic_syllable_machine_trans_targs[] = { - 170, 195, 197, 198, 3, 201, 4, 6, - 204, 7, 9, 207, 10, 12, 210, 13, - 15, 16, 191, 18, 19, 209, 21, 22, - 206, 24, 25, 203, 212, 216, 220, 223, - 227, 230, 234, 237, 241, 244, 170, 270, - 272, 273, 39, 276, 40, 42, 279, 43, - 45, 282, 46, 48, 285, 49, 51, 52, - 266, 54, 55, 284, 57, 58, 281, 60, - 61, 278, 287, 290, 294, 297, 301, 304, - 308, 311, 315, 319, 170, 343, 345, 346, - 75, 349, 170, 76, 78, 352, 79, 81, - 355, 82, 84, 358, 85, 87, 88, 339, - 90, 91, 357, 93, 94, 354, 96, 97, - 351, 360, 363, 367, 370, 374, 377, 381, - 384, 388, 170, 418, 420, 421, 110, 424, - 111, 113, 427, 114, 116, 430, 117, 119, - 433, 120, 122, 123, 414, 125, 126, 432, - 128, 129, 429, 131, 132, 426, 435, 438, - 442, 445, 449, 452, 456, 459, 463, 466, - 392, 478, 146, 481, 148, 484, 149, 151, - 487, 152, 154, 490, 155, 493, 495, 496, - 159, 160, 492, 162, 163, 489, 165, 166, - 486, 168, 169, 483, 170, 171, 246, 320, - 322, 391, 393, 340, 342, 394, 390, 467, - 468, 170, 172, 174, 35, 245, 192, 194, - 214, 243, 173, 34, 175, 239, 0, 176, - 178, 33, 238, 236, 177, 32, 179, 232, - 180, 182, 31, 231, 229, 181, 30, 183, - 225, 184, 186, 29, 224, 222, 185, 28, - 187, 218, 188, 190, 27, 217, 215, 189, - 26, 200, 193, 170, 196, 1, 199, 2, - 202, 5, 23, 205, 8, 20, 208, 11, - 17, 211, 14, 213, 219, 221, 226, 228, - 233, 235, 240, 242, 170, 247, 249, 71, - 317, 267, 269, 318, 248, 70, 250, 313, - 36, 251, 253, 69, 312, 310, 252, 68, - 254, 306, 255, 257, 67, 305, 303, 256, - 66, 258, 299, 259, 261, 65, 298, 296, - 260, 64, 262, 292, 263, 265, 63, 291, - 289, 264, 62, 275, 268, 170, 271, 37, - 274, 38, 277, 41, 59, 280, 44, 56, - 283, 47, 53, 286, 50, 288, 293, 295, - 300, 302, 307, 309, 314, 316, 170, 321, - 106, 323, 386, 72, 324, 326, 105, 385, - 383, 325, 104, 327, 379, 328, 330, 103, - 378, 376, 329, 102, 331, 372, 332, 334, - 101, 371, 369, 333, 100, 335, 365, 336, - 338, 99, 364, 362, 337, 98, 348, 341, - 170, 344, 73, 347, 74, 350, 77, 95, - 353, 80, 92, 356, 83, 89, 359, 86, - 361, 366, 368, 373, 375, 380, 382, 387, - 389, 170, 170, 395, 397, 142, 141, 415, - 417, 465, 396, 398, 461, 107, 399, 401, - 140, 460, 458, 400, 139, 402, 454, 403, - 405, 138, 453, 451, 404, 137, 406, 447, - 407, 409, 136, 446, 444, 408, 135, 410, - 440, 411, 413, 134, 439, 437, 412, 133, - 423, 416, 170, 419, 108, 422, 109, 425, - 112, 130, 428, 115, 127, 431, 118, 124, - 434, 121, 436, 441, 443, 448, 450, 455, - 457, 462, 464, 143, 469, 470, 480, 475, - 477, 498, 471, 472, 473, 144, 479, 474, - 476, 145, 482, 147, 167, 156, 485, 150, - 164, 488, 153, 161, 491, 158, 494, 157, - 497 + 170, 197, 199, 202, 3, 205, 4, 6, + 208, 7, 9, 211, 10, 12, 214, 13, + 15, 16, 191, 18, 19, 213, 21, 22, + 210, 24, 25, 207, 216, 221, 225, 228, + 232, 235, 239, 242, 246, 249, 170, 277, + 279, 282, 39, 285, 40, 42, 288, 43, + 45, 291, 46, 48, 294, 49, 51, 52, + 271, 54, 55, 293, 57, 58, 290, 60, + 61, 287, 296, 301, 305, 308, 312, 315, + 319, 322, 326, 330, 170, 356, 358, 361, + 75, 364, 170, 76, 78, 367, 79, 81, + 370, 82, 84, 373, 85, 87, 88, 350, + 90, 91, 372, 93, 94, 369, 96, 97, + 366, 375, 380, 384, 387, 391, 394, 398, + 401, 405, 170, 437, 439, 442, 110, 445, + 111, 113, 448, 114, 116, 451, 117, 119, + 454, 120, 122, 123, 431, 125, 126, 453, + 128, 129, 450, 131, 132, 447, 456, 461, + 465, 468, 472, 475, 479, 482, 486, 489, + 409, 505, 146, 508, 148, 511, 149, 151, + 514, 152, 154, 517, 155, 520, 522, 523, + 159, 160, 519, 162, 163, 516, 165, 166, + 513, 168, 169, 510, 170, 171, 251, 331, + 333, 408, 410, 351, 170, 353, 411, 407, + 490, 491, 378, 526, 379, 170, 172, 174, + 35, 250, 192, 170, 194, 248, 219, 200, + 220, 173, 34, 175, 244, 0, 176, 178, + 33, 243, 241, 177, 32, 179, 237, 180, + 182, 31, 236, 234, 181, 30, 183, 230, + 184, 186, 29, 229, 227, 185, 28, 187, + 223, 188, 190, 27, 222, 218, 189, 26, + 204, 193, 196, 195, 198, 1, 203, 201, + 2, 206, 5, 23, 209, 8, 20, 212, + 11, 17, 215, 14, 217, 224, 226, 231, + 233, 238, 240, 245, 247, 170, 252, 254, + 71, 328, 272, 170, 274, 329, 299, 280, + 300, 253, 70, 255, 324, 36, 256, 258, + 69, 323, 321, 257, 68, 259, 317, 260, + 262, 67, 316, 314, 261, 66, 263, 310, + 264, 266, 65, 309, 307, 265, 64, 267, + 303, 268, 270, 63, 302, 298, 269, 62, + 284, 273, 276, 275, 278, 37, 283, 281, + 38, 286, 41, 59, 289, 44, 56, 292, + 47, 53, 295, 50, 297, 304, 306, 311, + 313, 318, 320, 325, 327, 170, 332, 106, + 359, 334, 403, 72, 335, 337, 105, 402, + 400, 336, 104, 338, 396, 339, 341, 103, + 395, 393, 340, 102, 342, 389, 343, 345, + 101, 388, 386, 344, 100, 346, 382, 347, + 349, 99, 381, 377, 348, 98, 363, 352, + 355, 354, 357, 73, 362, 360, 74, 365, + 77, 95, 368, 80, 92, 371, 83, 89, + 374, 86, 376, 383, 385, 390, 392, 397, + 399, 404, 406, 170, 170, 412, 414, 142, + 141, 432, 170, 434, 488, 459, 440, 460, + 413, 415, 484, 107, 416, 418, 140, 483, + 481, 417, 139, 419, 477, 420, 422, 138, + 476, 474, 421, 137, 423, 470, 424, 426, + 136, 469, 467, 425, 135, 427, 463, 428, + 430, 134, 462, 458, 429, 133, 444, 433, + 436, 435, 438, 108, 443, 441, 109, 446, + 112, 130, 449, 115, 127, 452, 118, 124, + 455, 121, 457, 464, 466, 471, 473, 478, + 480, 485, 487, 143, 492, 493, 507, 498, + 500, 525, 503, 494, 495, 496, 144, 506, + 497, 499, 502, 501, 504, 145, 509, 147, + 167, 156, 512, 150, 164, 515, 153, 161, + 518, 158, 521, 157, 524, 170, 527, 528, + 170, 530, 529, 532, 531 }; static const char _indic_syllable_machine_trans_actions[] = { @@ -996,48 +1353,52 @@ static const char _indic_syllable_machine_trans_actions[] = { 2, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 11, 2, 2, 6, - 2, 12, 12, 0, 0, 2, 2, 6, - 2, 13, 2, 2, 0, 2, 0, 0, - 2, 2, 2, 0, 2, 2, 0, 2, + 2, 12, 12, 0, 13, 0, 2, 2, + 6, 2, 6, 0, 6, 14, 2, 2, + 0, 2, 0, 15, 0, 2, 2, 0, + 2, 2, 0, 2, 2, 0, 2, 2, + 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, - 2, 2, 2, 2, 0, 2, 2, 2, - 0, 2, 0, 14, 0, 0, 2, 0, - 2, 0, 0, 2, 0, 0, 2, 0, - 0, 2, 0, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 15, 2, 2, 0, - 2, 0, 0, 2, 2, 0, 2, 2, - 0, 2, 2, 0, 2, 2, 2, 0, - 2, 2, 2, 2, 0, 2, 2, 2, - 0, 2, 2, 2, 2, 0, 2, 2, - 2, 0, 2, 2, 2, 2, 0, 2, - 2, 2, 0, 2, 0, 16, 0, 0, - 2, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 0, 2, 0, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 17, 6, + 2, 0, 0, 0, 0, 0, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 0, 2, 0, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 16, 2, 2, + 0, 2, 0, 17, 0, 2, 2, 0, + 2, 2, 0, 2, 2, 0, 2, 2, + 0, 2, 2, 2, 0, 2, 2, 2, + 2, 0, 2, 2, 2, 0, 2, 2, + 2, 2, 0, 2, 2, 2, 0, 2, + 2, 2, 2, 0, 2, 2, 2, 0, + 2, 0, 0, 0, 0, 0, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 0, 2, 0, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 18, 6, 0, 0, 6, 6, 0, 6, 2, 0, 6, 2, 6, 0, 6, 6, 6, 2, 0, 6, 2, 6, 0, 6, 6, 6, 2, 0, 6, 2, 6, 0, 6, 6, 6, 2, 0, 6, 2, 6, 0, 6, 0, - 18, 0, 0, 2, 0, 2, 0, 0, - 2, 0, 0, 2, 0, 0, 2, 0, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 19, 20, 2, 2, 0, 0, 0, - 0, 2, 2, 2, 2, 0, 2, 2, + 0, 0, 0, 0, 2, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 0, 0, + 2, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 19, 20, 2, 2, 0, + 0, 0, 21, 0, 2, 2, 0, 2, + 2, 2, 2, 0, 2, 2, 0, 2, + 2, 2, 0, 2, 2, 2, 2, 0, + 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, - 2, 0, 2, 2, 2, 0, 2, 2, - 2, 2, 0, 2, 2, 2, 0, 2, - 2, 2, 2, 0, 2, 2, 2, 0, - 2, 0, 21, 0, 0, 2, 0, 2, + 2, 0, 2, 2, 2, 0, 2, 0, + 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 8, 2, 0, - 0, 2, 2, 8, 8, 0, 8, 8, - 0, 0, 2, 0, 0, 0, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 0, - 2 + 0, 2, 0, 2, 8, 8, 0, 8, + 8, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 2, 0, 0, 2, 0, 0, + 2, 0, 0, 0, 2, 22, 0, 0, + 23, 0, 0, 0, 0 }; static const char _indic_syllable_machine_to_state_actions[] = { @@ -1103,7 +1464,11 @@ static const char _indic_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 }; static const char _indic_syllable_machine_from_state_actions[] = { @@ -1169,7 +1534,11 @@ static const char _indic_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 }; static const short _indic_syllable_machine_eof_trans[] = { @@ -1194,48 +1563,52 @@ static const short _indic_syllable_machine_eof_trans[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 269, 269, 269, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 410, - 343, 410, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 411, 411, 411, 411, 411, - 411, 411, 411, 343, 194, 194, 194, 343, - 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 343 + 1, 1, 0, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 358, 358, 358, 358, 358, + 358, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 358, 358, 358, 358, 358, + 358, 358, 358, 358, 358, 358, 358, 358, + 428, 358, 428, 429, 429, 429, 429, 429, + 429, 429, 429, 429, 429, 429, 429, 429, + 429, 429, 429, 429, 429, 429, 429, 429, + 429, 429, 429, 429, 429, 429, 429, 429, + 429, 429, 429, 429, 429, 429, 429, 429, + 429, 429, 429, 429, 429, 429, 429, 429, + 429, 429, 429, 429, 429, 429, 429, 429, + 429, 429, 429, 429, 429, 429, 429, 429, + 429, 429, 429, 429, 429, 429, 429, 429, + 429, 429, 429, 429, 429, 429, 429, 429, + 429, 429, 358, 198, 198, 198, 358, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 198, 358, 542, 542, + 542, 542, 542, 542, 542 }; static const int indic_syllable_machine_start = 170; @@ -1249,7 +1622,7 @@ static const int indic_syllable_machine_en_main = 170; -#line 91 "hb-ot-shape-complex-indic-machine.rl" +#line 98 "hb-ot-shape-complex-indic-machine.rl" #define found_syllable(syllable_type) \ @@ -1269,7 +1642,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 1273 "hb-ot-shape-complex-indic-machine.hh" +#line 1646 "hb-ot-shape-complex-indic-machine.hh" { cs = indic_syllable_machine_start; ts = 0; @@ -1277,7 +1650,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 112 "hb-ot-shape-complex-indic-machine.rl" +#line 119 "hb-ot-shape-complex-indic-machine.rl" p = 0; @@ -1286,7 +1659,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int last = 0; unsigned int syllable_serial = 1; -#line 1290 "hb-ot-shape-complex-indic-machine.hh" +#line 1663 "hb-ot-shape-complex-indic-machine.hh" { int _slen; int _trans; @@ -1300,7 +1673,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 1304 "hb-ot-shape-complex-indic-machine.hh" +#line 1677 "hb-ot-shape-complex-indic-machine.hh" } _keys = _indic_syllable_machine_trans_keys + (cs<<1); @@ -1322,60 +1695,68 @@ _eof_trans: #line 1 "NONE" {te = p+1;} break; - case 14: -#line 83 "hb-ot-shape-complex-indic-machine.rl" + case 15: +#line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (consonant_syllable); }} break; - case 16: -#line 84 "hb-ot-shape-complex-indic-machine.rl" + case 17: +#line 90 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (vowel_syllable); }} break; case 21: -#line 85 "hb-ot-shape-complex-indic-machine.rl" +#line 91 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (standalone_cluster); }} break; - case 18: -#line 86 "hb-ot-shape-complex-indic-machine.rl" + case 23: +#line 92 "hb-ot-shape-complex-indic-machine.rl" + {te = p+1;{ found_syllable (avagraha_cluster); }} + break; + case 13: +#line 93 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 11: -#line 87 "hb-ot-shape-complex-indic-machine.rl" +#line 94 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (non_indic_cluster); }} break; - case 13: -#line 83 "hb-ot-shape-complex-indic-machine.rl" + case 14: +#line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; - case 15: -#line 84 "hb-ot-shape-complex-indic-machine.rl" + case 16: +#line 90 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (vowel_syllable); }} break; case 20: -#line 85 "hb-ot-shape-complex-indic-machine.rl" +#line 91 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (standalone_cluster); }} break; - case 17: -#line 86 "hb-ot-shape-complex-indic-machine.rl" + case 22: +#line 92 "hb-ot-shape-complex-indic-machine.rl" + {te = p;p--;{ found_syllable (avagraha_cluster); }} + break; + case 18: +#line 93 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; case 19: -#line 87 "hb-ot-shape-complex-indic-machine.rl" +#line 94 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (non_indic_cluster); }} break; case 1: -#line 83 "hb-ot-shape-complex-indic-machine.rl" +#line 89 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (consonant_syllable); }} break; case 3: -#line 84 "hb-ot-shape-complex-indic-machine.rl" +#line 90 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (vowel_syllable); }} break; case 7: -#line 85 "hb-ot-shape-complex-indic-machine.rl" +#line 91 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (standalone_cluster); }} break; case 4: -#line 86 "hb-ot-shape-complex-indic-machine.rl" +#line 93 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; case 5: @@ -1384,10 +1765,10 @@ _eof_trans: case 1: {{p = ((te))-1;} found_syllable (consonant_syllable); } break; - case 4: + case 5: {{p = ((te))-1;} found_syllable (broken_cluster); } break; - case 5: + case 6: {{p = ((te))-1;} found_syllable (non_indic_cluster); } break; } @@ -1396,22 +1777,22 @@ _eof_trans: case 8: #line 1 "NONE" {te = p+1;} -#line 83 "hb-ot-shape-complex-indic-machine.rl" +#line 89 "hb-ot-shape-complex-indic-machine.rl" {act = 1;} break; case 6: #line 1 "NONE" {te = p+1;} -#line 86 "hb-ot-shape-complex-indic-machine.rl" - {act = 4;} +#line 93 "hb-ot-shape-complex-indic-machine.rl" + {act = 5;} break; case 12: #line 1 "NONE" {te = p+1;} -#line 87 "hb-ot-shape-complex-indic-machine.rl" - {act = 5;} +#line 94 "hb-ot-shape-complex-indic-machine.rl" + {act = 6;} break; -#line 1415 "hb-ot-shape-complex-indic-machine.hh" +#line 1796 "hb-ot-shape-complex-indic-machine.hh" } _again: @@ -1420,7 +1801,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 1424 "hb-ot-shape-complex-indic-machine.hh" +#line 1805 "hb-ot-shape-complex-indic-machine.hh" } if ( ++p != pe ) @@ -1436,7 +1817,7 @@ _again: } -#line 121 "hb-ot-shape-complex-indic-machine.rl" +#line 128 "hb-ot-shape-complex-indic-machine.rl" } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc index 9edefe305d..1e07d33177 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc @@ -1690,12 +1690,6 @@ clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, } -static hb_ot_shape_normalization_mode_t -normalization_preference_indic (const hb_segment_properties_t *props HB_UNUSED) -{ - return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT; -} - static bool decompose_indic (const hb_ot_shape_normalize_context_t *c, hb_codepoint_t ab, @@ -1806,7 +1800,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic = data_create_indic, data_destroy_indic, NULL, /* preprocess_text */ - normalization_preference_indic, + HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, decompose_indic, compose_indic, setup_masks_indic, diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh index e282f0cfb1..a9c8dbeaac 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh @@ -34,196 +34,197 @@ #line 36 "hb-ot-shape-complex-myanmar-machine.hh" static const unsigned char _myanmar_syllable_machine_trans_keys[] = { - 1u, 30u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, + 1u, 31u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 1u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 0 + 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 8u, 8u, 0 }; static const char _myanmar_syllable_machine_key_spans[] = { - 30, 28, 25, 4, 25, 23, 21, 21, + 31, 28, 25, 4, 25, 23, 21, 21, 27, 27, 27, 27, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 4, 25, 23, 21, 21, 27, 27, 27, 27, 28, 27, 30, 27, 27, 27, 27, 27, - 27, 27, 27, 27 + 27, 27, 27, 27, 1 }; static const short _myanmar_syllable_machine_index_offsets[] = { - 0, 31, 60, 86, 91, 117, 141, 163, - 185, 213, 241, 269, 297, 314, 342, 370, - 398, 426, 454, 482, 510, 538, 566, 592, - 597, 623, 647, 669, 691, 719, 747, 775, - 803, 832, 860, 891, 919, 947, 975, 1003, - 1031, 1059, 1087, 1115 + 0, 32, 61, 87, 92, 118, 142, 164, + 186, 214, 242, 270, 298, 315, 343, 371, + 399, 427, 455, 483, 511, 539, 567, 593, + 598, 624, 648, 670, 692, 720, 748, 776, + 804, 833, 861, 892, 920, 948, 976, 1004, + 1032, 1060, 1088, 1116, 1144 }; static const char _myanmar_syllable_machine_indicies[] = { 1, 1, 2, 3, 4, 4, 0, 5, 0, 6, 0, 1, 0, 0, 0, 7, 0, 8, 1, 0, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 0, 20, - 21, 22, 22, 19, 23, 19, 24, 19, - 19, 19, 19, 19, 19, 19, 25, 19, - 19, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 19, 22, 22, 19, 23, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 36, 19, 19, 19, 19, 19, 19, - 30, 19, 19, 19, 34, 19, 22, 22, - 19, 23, 19, 22, 22, 19, 23, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 30, - 19, 19, 19, 34, 19, 37, 19, 22, - 22, 19, 23, 19, 30, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 30, 19, 22, 22, 19, - 23, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 38, 19, 19, 19, 19, 19, - 19, 30, 19, 22, 22, 19, 23, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 30, - 19, 20, 19, 22, 22, 19, 23, 19, - 24, 19, 19, 19, 19, 19, 19, 19, - 39, 19, 19, 39, 19, 19, 19, 30, - 40, 19, 19, 34, 19, 20, 19, 22, - 22, 19, 23, 19, 24, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 30, 19, 19, 19, 34, - 19, 20, 19, 22, 22, 19, 23, 19, - 24, 19, 19, 19, 19, 19, 19, 19, - 39, 19, 19, 19, 19, 19, 19, 30, - 40, 19, 19, 34, 19, 20, 19, 22, - 22, 19, 23, 19, 24, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 30, 40, 19, 19, 34, - 19, 1, 1, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 1, 19, 20, 19, 22, 22, 19, 23, - 19, 24, 19, 19, 19, 19, 19, 19, - 19, 25, 19, 19, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 19, 20, 19, - 22, 22, 19, 23, 19, 24, 19, 19, - 19, 19, 19, 19, 19, 33, 19, 19, - 19, 19, 19, 19, 30, 31, 32, 33, - 34, 19, 20, 19, 22, 22, 19, 23, - 19, 24, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 30, 31, 32, 33, 34, 19, 20, 19, - 22, 22, 19, 23, 19, 24, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 30, 31, 32, 19, - 34, 19, 20, 19, 22, 22, 19, 23, - 19, 24, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 30, 19, 32, 19, 34, 19, 20, 19, - 22, 22, 19, 23, 19, 24, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 26, 19, 28, 19, 30, 31, 32, 33, - 34, 19, 20, 19, 22, 22, 19, 23, - 19, 24, 19, 19, 19, 19, 19, 19, - 19, 33, 19, 19, 26, 19, 19, 19, - 30, 31, 32, 33, 34, 19, 20, 19, - 22, 22, 19, 23, 19, 24, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 26, 27, 28, 19, 30, 31, 32, 33, - 34, 19, 20, 21, 22, 22, 19, 23, - 19, 24, 19, 19, 19, 19, 19, 19, - 19, 25, 19, 19, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 19, 3, 3, - 41, 5, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 42, 41, 41, 41, 41, - 41, 41, 13, 41, 41, 41, 17, 41, - 3, 3, 41, 5, 41, 3, 3, 41, - 5, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 13, 41, 41, 41, 17, 41, 43, - 41, 3, 3, 41, 5, 41, 13, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 13, 41, 3, - 3, 41, 5, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 44, 41, 41, 41, - 41, 41, 41, 13, 41, 3, 3, 41, - 5, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 13, 41, 2, 41, 3, 3, 41, - 5, 41, 6, 41, 41, 41, 41, 41, - 41, 41, 45, 41, 41, 45, 41, 41, - 41, 13, 46, 41, 41, 17, 41, 2, - 41, 3, 3, 41, 5, 41, 6, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 13, 41, 41, - 41, 17, 41, 2, 41, 3, 3, 41, - 5, 41, 6, 41, 41, 41, 41, 41, - 41, 41, 45, 41, 41, 41, 41, 41, - 41, 13, 46, 41, 41, 17, 41, 2, - 41, 3, 3, 41, 5, 41, 6, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 13, 46, 41, - 41, 17, 41, 20, 21, 22, 22, 19, - 23, 19, 24, 19, 19, 19, 19, 19, - 19, 19, 47, 19, 19, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 19, - 20, 48, 22, 22, 19, 23, 19, 24, - 19, 19, 19, 19, 19, 19, 19, 25, - 19, 19, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 19, 1, 1, 2, 3, - 3, 3, 41, 5, 41, 6, 41, 1, - 41, 41, 41, 1, 41, 8, 1, 41, - 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 41, 2, 41, 3, 3, 41, - 5, 41, 6, 41, 41, 41, 41, 41, - 41, 41, 8, 41, 41, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 41, 2, - 41, 3, 3, 41, 5, 41, 6, 41, - 41, 41, 41, 41, 41, 41, 16, 41, - 41, 41, 41, 41, 41, 13, 14, 15, - 16, 17, 41, 2, 41, 3, 3, 41, - 5, 41, 6, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 13, 14, 15, 16, 17, 41, 2, - 41, 3, 3, 41, 5, 41, 6, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 13, 14, 15, - 41, 17, 41, 2, 41, 3, 3, 41, - 5, 41, 6, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 13, 41, 15, 41, 17, 41, 2, - 41, 3, 3, 41, 5, 41, 6, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 9, 41, 11, 41, 13, 14, 15, - 16, 17, 41, 2, 41, 3, 3, 41, - 5, 41, 6, 41, 41, 41, 41, 41, - 41, 41, 16, 41, 41, 9, 41, 41, - 41, 13, 14, 15, 16, 17, 41, 2, - 41, 3, 3, 41, 5, 41, 6, 41, - 41, 41, 41, 41, 41, 41, 41, 41, - 41, 9, 10, 11, 41, 13, 14, 15, - 16, 17, 41, 2, 3, 3, 3, 41, - 5, 41, 6, 41, 41, 41, 41, 41, - 41, 41, 8, 41, 41, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 41, 0 + 13, 14, 15, 16, 17, 18, 19, 0, + 21, 22, 23, 23, 20, 24, 20, 25, + 20, 20, 20, 20, 20, 20, 20, 26, + 20, 20, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 20, 23, 23, 20, + 24, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 37, 20, 20, 20, 20, 20, + 20, 31, 20, 20, 20, 35, 20, 23, + 23, 20, 24, 20, 23, 23, 20, 24, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 31, 20, 20, 20, 35, 20, 38, 20, + 23, 23, 20, 24, 20, 31, 20, 20, + 20, 20, 20, 20, 20, 39, 20, 20, + 20, 20, 20, 20, 31, 20, 23, 23, + 20, 24, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 39, 20, 20, 20, 20, + 20, 20, 31, 20, 23, 23, 20, 24, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 31, 20, 21, 20, 23, 23, 20, 24, + 20, 25, 20, 20, 20, 20, 20, 20, + 20, 40, 20, 20, 40, 20, 20, 20, + 31, 41, 20, 20, 35, 20, 21, 20, + 23, 23, 20, 24, 20, 25, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 31, 20, 20, 20, + 35, 20, 21, 20, 23, 23, 20, 24, + 20, 25, 20, 20, 20, 20, 20, 20, + 20, 40, 20, 20, 20, 20, 20, 20, + 31, 41, 20, 20, 35, 20, 21, 20, + 23, 23, 20, 24, 20, 25, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 31, 41, 20, 20, + 35, 20, 1, 1, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 1, 20, 21, 20, 23, 23, 20, + 24, 20, 25, 20, 20, 20, 20, 20, + 20, 20, 26, 20, 20, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 20, 21, + 20, 23, 23, 20, 24, 20, 25, 20, + 20, 20, 20, 20, 20, 20, 34, 20, + 20, 20, 20, 20, 20, 31, 32, 33, + 34, 35, 20, 21, 20, 23, 23, 20, + 24, 20, 25, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 31, 32, 33, 34, 35, 20, 21, + 20, 23, 23, 20, 24, 20, 25, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 31, 32, 33, + 20, 35, 20, 21, 20, 23, 23, 20, + 24, 20, 25, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 31, 20, 33, 20, 35, 20, 21, + 20, 23, 23, 20, 24, 20, 25, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 27, 20, 29, 20, 31, 32, 33, + 34, 35, 20, 21, 20, 23, 23, 20, + 24, 20, 25, 20, 20, 20, 20, 20, + 20, 20, 34, 20, 20, 27, 20, 20, + 20, 31, 32, 33, 34, 35, 20, 21, + 20, 23, 23, 20, 24, 20, 25, 20, + 20, 20, 20, 20, 20, 20, 20, 20, + 20, 27, 28, 29, 20, 31, 32, 33, + 34, 35, 20, 21, 22, 23, 23, 20, + 24, 20, 25, 20, 20, 20, 20, 20, + 20, 20, 26, 20, 20, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 20, 3, + 3, 42, 5, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 43, 42, 42, 42, + 42, 42, 42, 13, 42, 42, 42, 17, + 42, 3, 3, 42, 5, 42, 3, 3, + 42, 5, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 13, 42, 42, 42, 17, 42, + 44, 42, 3, 3, 42, 5, 42, 13, + 42, 42, 42, 42, 42, 42, 42, 45, + 42, 42, 42, 42, 42, 42, 13, 42, + 3, 3, 42, 5, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 45, 42, 42, + 42, 42, 42, 42, 13, 42, 3, 3, + 42, 5, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 13, 42, 2, 42, 3, 3, + 42, 5, 42, 6, 42, 42, 42, 42, + 42, 42, 42, 46, 42, 42, 46, 42, + 42, 42, 13, 47, 42, 42, 17, 42, + 2, 42, 3, 3, 42, 5, 42, 6, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 13, 42, + 42, 42, 17, 42, 2, 42, 3, 3, + 42, 5, 42, 6, 42, 42, 42, 42, + 42, 42, 42, 46, 42, 42, 42, 42, + 42, 42, 13, 47, 42, 42, 17, 42, + 2, 42, 3, 3, 42, 5, 42, 6, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 13, 47, + 42, 42, 17, 42, 21, 22, 23, 23, + 20, 24, 20, 25, 20, 20, 20, 20, + 20, 20, 20, 48, 20, 20, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, + 20, 21, 49, 23, 23, 20, 24, 20, + 25, 20, 20, 20, 20, 20, 20, 20, + 26, 20, 20, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 20, 1, 1, 2, + 3, 3, 3, 42, 5, 42, 6, 42, + 1, 42, 42, 42, 1, 42, 8, 1, + 42, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 42, 2, 42, 3, 3, + 42, 5, 42, 6, 42, 42, 42, 42, + 42, 42, 42, 8, 42, 42, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 42, + 2, 42, 3, 3, 42, 5, 42, 6, + 42, 42, 42, 42, 42, 42, 42, 16, + 42, 42, 42, 42, 42, 42, 13, 14, + 15, 16, 17, 42, 2, 42, 3, 3, + 42, 5, 42, 6, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 13, 14, 15, 16, 17, 42, + 2, 42, 3, 3, 42, 5, 42, 6, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 13, 14, + 15, 42, 17, 42, 2, 42, 3, 3, + 42, 5, 42, 6, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 13, 42, 15, 42, 17, 42, + 2, 42, 3, 3, 42, 5, 42, 6, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 9, 42, 11, 42, 13, 14, + 15, 16, 17, 42, 2, 42, 3, 3, + 42, 5, 42, 6, 42, 42, 42, 42, + 42, 42, 42, 16, 42, 42, 9, 42, + 42, 42, 13, 14, 15, 16, 17, 42, + 2, 42, 3, 3, 42, 5, 42, 6, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 9, 10, 11, 42, 13, 14, + 15, 16, 17, 42, 2, 3, 3, 3, + 42, 5, 42, 6, 42, 42, 42, 42, + 42, 42, 42, 8, 42, 42, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 42, + 51, 50, 0 }; static const char _myanmar_syllable_machine_trans_targs[] = { 0, 1, 22, 0, 0, 23, 29, 32, 35, 36, 40, 41, 42, 25, 38, 39, - 37, 28, 43, 0, 2, 12, 0, 3, - 9, 13, 14, 18, 19, 20, 5, 16, - 17, 15, 8, 21, 4, 6, 7, 10, - 11, 0, 24, 26, 27, 30, 31, 33, - 34 + 37, 28, 43, 44, 0, 2, 12, 0, + 3, 9, 13, 14, 18, 19, 20, 5, + 16, 17, 15, 8, 21, 4, 6, 7, + 10, 11, 0, 24, 26, 27, 30, 31, + 33, 34, 0, 0 }; static const char _myanmar_syllable_machine_trans_actions[] = { 3, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 0, 7, 0, + 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8, 0, 0, 0, 0, 0, 0, - 0 + 0, 0, 8, 0, 0, 0, 0, 0, + 0, 0, 9, 10 }; static const char _myanmar_syllable_machine_to_state_actions[] = { @@ -232,7 +233,7 @@ static const char _myanmar_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 + 0, 0, 0, 0, 0 }; static const char _myanmar_syllable_machine_from_state_actions[] = { @@ -241,16 +242,16 @@ static const char _myanmar_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 + 0, 0, 0, 0, 0 }; static const short _myanmar_syllable_machine_eof_trans[] = { - 0, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, - 20, 20, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42 + 0, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 21, 21, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 51 }; static const int myanmar_syllable_machine_start = 0; @@ -264,7 +265,7 @@ static const int myanmar_syllable_machine_en_main = 0; -#line 90 "hb-ot-shape-complex-myanmar-machine.rl" +#line 93 "hb-ot-shape-complex-myanmar-machine.rl" #define found_syllable(syllable_type) \ @@ -284,7 +285,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 288 "hb-ot-shape-complex-myanmar-machine.hh" +#line 289 "hb-ot-shape-complex-myanmar-machine.hh" { cs = myanmar_syllable_machine_start; ts = 0; @@ -292,7 +293,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 111 "hb-ot-shape-complex-myanmar-machine.rl" +#line 114 "hb-ot-shape-complex-myanmar-machine.rl" p = 0; @@ -301,7 +302,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int last = 0; unsigned int syllable_serial = 1; -#line 305 "hb-ot-shape-complex-myanmar-machine.hh" +#line 306 "hb-ot-shape-complex-myanmar-machine.hh" { int _slen; int _trans; @@ -315,7 +316,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 319 "hb-ot-shape-complex-myanmar-machine.hh" +#line 320 "hb-ot-shape-complex-myanmar-machine.hh" } _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); @@ -334,30 +335,38 @@ _eof_trans: switch ( _myanmar_syllable_machine_trans_actions[_trans] ) { case 7: -#line 83 "hb-ot-shape-complex-myanmar-machine.rl" +#line 85 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (consonant_syllable); }} break; case 5: -#line 84 "hb-ot-shape-complex-myanmar-machine.rl" +#line 86 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (non_myanmar_cluster); }} break; + case 10: +#line 87 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p+1;{ found_syllable (punctuation_cluster); }} + break; case 4: -#line 85 "hb-ot-shape-complex-myanmar-machine.rl" +#line 88 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 3: -#line 86 "hb-ot-shape-complex-myanmar-machine.rl" +#line 89 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (non_myanmar_cluster); }} break; case 6: -#line 83 "hb-ot-shape-complex-myanmar-machine.rl" +#line 85 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; case 8: -#line 85 "hb-ot-shape-complex-myanmar-machine.rl" +#line 88 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; -#line 361 "hb-ot-shape-complex-myanmar-machine.hh" + case 9: +#line 89 "hb-ot-shape-complex-myanmar-machine.rl" + {te = p;p--;{ found_syllable (non_myanmar_cluster); }} + break; +#line 370 "hb-ot-shape-complex-myanmar-machine.hh" } _again: @@ -366,7 +375,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 370 "hb-ot-shape-complex-myanmar-machine.hh" +#line 379 "hb-ot-shape-complex-myanmar-machine.hh" } if ( ++p != pe ) @@ -382,7 +391,7 @@ _again: } -#line 120 "hb-ot-shape-complex-myanmar-machine.rl" +#line 123 "hb-ot-shape-complex-myanmar-machine.rl" } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc index 25ba7264ca..50209ffb0e 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc @@ -541,13 +541,6 @@ final_reordering (const hb_ot_shape_plan_t *plan, } -static hb_ot_shape_normalization_mode_t -normalization_preference_myanmar (const hb_segment_properties_t *props HB_UNUSED) -{ - return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT; -} - - const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar = { "myanmar", @@ -556,7 +549,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar = NULL, /* data_create */ NULL, /* data_destroy */ NULL, /* preprocess_text */ - normalization_preference_myanmar, + HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, NULL, /* decompose */ NULL, /* compose */ setup_masks_myanmar, diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh index ac0072ba56..104726e8af 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-private.hh @@ -44,7 +44,9 @@ enum hb_ot_shape_zero_width_marks_type_t { // HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY, HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE, HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY, - HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE + HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, + + HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT = HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE }; @@ -52,10 +54,13 @@ enum hb_ot_shape_zero_width_marks_type_t { #define HB_COMPLEX_SHAPERS_IMPLEMENT_SHAPERS \ HB_COMPLEX_SHAPER_IMPLEMENT (default) /* should be first */ \ HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \ + HB_COMPLEX_SHAPER_IMPLEMENT (hangul) \ + HB_COMPLEX_SHAPER_IMPLEMENT (hebrew) \ HB_COMPLEX_SHAPER_IMPLEMENT (indic) \ HB_COMPLEX_SHAPER_IMPLEMENT (myanmar) \ HB_COMPLEX_SHAPER_IMPLEMENT (sea) \ HB_COMPLEX_SHAPER_IMPLEMENT (thai) \ + HB_COMPLEX_SHAPER_IMPLEMENT (tibetan) \ /* ^--- Add new shapers here */ @@ -105,12 +110,7 @@ struct hb_ot_complex_shaper_t hb_font_t *font); - /* normalization_preference() - * Called during shape(). - * May be NULL. - */ - hb_ot_shape_normalization_mode_t - (*normalization_preference) (const hb_segment_properties_t *props); + hb_ot_shape_normalization_mode_t normalization_preference; /* decompose() * Called during shape()'s normalization. @@ -189,19 +189,22 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner) return &_hb_ot_complex_shaper_thai; -#if 0 - /* Note: - * Currently we don't have a separate Hangul shaper. The default shaper handles - * Hangul by enabling jamo features. We may want to implement a separate shaper - * in the future. See this thread for details of what such a shaper would do: - * - * http://lists.freedesktop.org/archives/harfbuzz/2013-April/003070.html - */ /* Unicode-1.1 additions */ case HB_SCRIPT_HANGUL: return &_hb_ot_complex_shaper_hangul; -#endif + + + /* Unicode-2.0 additions */ + case HB_SCRIPT_TIBETAN: + + return &_hb_ot_complex_shaper_tibetan; + + + /* Unicode-1.1 additions */ + case HB_SCRIPT_HEBREW: + + return &_hb_ot_complex_shaper_hebrew; /* ^--- Add new shapers here */ @@ -241,9 +244,6 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner) case HB_SCRIPT_LAO: case HB_SCRIPT_THAI: - /* Unicode-2.0 additions */ - case HB_SCRIPT_TIBETAN: - /* Unicode-3.2 additions */ case HB_SCRIPT_TAGALOG: case HB_SCRIPT_TAGBANWA: diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-sea.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-sea.cc index da687ed646..6288a90c9a 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-sea.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-sea.cc @@ -360,13 +360,6 @@ final_reordering (const hb_ot_shape_plan_t *plan, } -static hb_ot_shape_normalization_mode_t -normalization_preference_sea (const hb_segment_properties_t *props HB_UNUSED) -{ - return HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT; -} - - const hb_ot_complex_shaper_t _hb_ot_complex_shaper_sea = { "sea", @@ -375,7 +368,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_sea = NULL, /* data_create */ NULL, /* data_destroy */ NULL, /* preprocess_text */ - normalization_preference_sea, + HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, NULL, /* decompose */ NULL, /* compose */ setup_masks_sea, diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc index 45945339d6..8664eca45c 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc @@ -369,10 +369,10 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai = NULL, /* data_create */ NULL, /* data_destroy */ preprocess_text_thai, - NULL, /* normalization_preference */ + HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, NULL, /* decompose */ NULL, /* compose */ NULL, /* setup_masks */ - HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE, + HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT, false,/* fallback_position */ }; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc new file mode 100644 index 0000000000..01465a426f --- /dev/null +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc @@ -0,0 +1,61 @@ +/* + * Copyright © 2010,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#include "hb-ot-shape-complex-private.hh" + + +static const hb_tag_t tibetan_features[] = +{ + HB_TAG('a','b','v','s'), + HB_TAG('b','l','w','s'), + HB_TAG('a','b','v','m'), + HB_TAG('b','l','w','m'), + HB_TAG_NONE +}; + +static void +collect_features_tibetan (hb_ot_shape_planner_t *plan) +{ + for (const hb_tag_t *script_features = tibetan_features; script_features && *script_features; script_features++) + plan->map.add_global_bool_feature (*script_features); +} + + +const hb_ot_complex_shaper_t _hb_ot_complex_shaper_tibetan = +{ + "default", + collect_features_tibetan, + NULL, /* override_features */ + NULL, /* data_create */ + NULL, /* data_destroy */ + NULL, /* preprocess_text */ + HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, + NULL, /* decompose */ + NULL, /* compose */ + NULL, /* setup_masks */ + HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT, + true, /* fallback_position */ +}; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc index 449b64e5ca..5d526c3a8e 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-fallback.cc @@ -430,14 +430,12 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { - hb_mask_t kern_mask = plan->map.get_1_mask (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction) ? - HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n')); - if (!kern_mask) return; + if (!plan->has_kern) return; unsigned int count = buffer->len; OT::hb_apply_context_t c (1, font, buffer); - c.set_lookup_mask (kern_mask); + c.set_lookup_mask (plan->kern_mask); c.set_lookup_props (OT::LookupFlag::IgnoreMarks); hb_glyph_info_t *info = buffer->info; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize-private.hh index fb8048caa2..c744e26451 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize-private.hh @@ -36,6 +36,7 @@ struct hb_ot_shape_plan_t; enum hb_ot_shape_normalization_mode_t { + HB_OT_SHAPE_NORMALIZATION_MODE_NONE, HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED, HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS, /* never composes base-to-base */ HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, /* always fully decomposes and then recompose back */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc index 6531e1b215..2a6a439003 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-normalize.cc @@ -213,8 +213,9 @@ decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shor } static inline void -handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end) +handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool short_circuit) { + /* TODO Currently if there's a variation-selector we give-up, it's just too hard. */ hb_buffer_t * const buffer = c->buffer; hb_font_t * const font = c->font; for (; buffer->idx < end - 1;) { @@ -250,27 +251,26 @@ handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c, uns } static inline void -decompose_multi_char_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end) +decompose_multi_char_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool short_circuit) { hb_buffer_t * const buffer = c->buffer; - /* TODO Currently if there's a variation-selector we give-up, it's just too hard. */ for (unsigned int i = buffer->idx; i < end; i++) if (unlikely (buffer->unicode->is_variation_selector (buffer->info[i].codepoint))) { - handle_variation_selector_cluster (c, end); + handle_variation_selector_cluster (c, end, short_circuit); return; } while (buffer->idx < end) - decompose_current_character (c, false); + decompose_current_character (c, short_circuit); } static inline void -decompose_cluster (const hb_ot_shape_normalize_context_t *c, bool short_circuit, unsigned int end) +decompose_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool might_short_circuit, bool always_short_circuit) { if (likely (c->buffer->idx + 1 == end)) - decompose_current_character (c, short_circuit); + decompose_current_character (c, might_short_circuit); else - decompose_multi_char_cluster (c, end); + decompose_multi_char_cluster (c, end, always_short_circuit); } @@ -289,9 +289,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, hb_font_t *font) { - hb_ot_shape_normalization_mode_t mode = plan->shaper->normalization_preference ? - plan->shaper->normalization_preference (&buffer->props) : - HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT; + hb_ot_shape_normalization_mode_t mode = plan->shaper->normalization_preference; const hb_ot_shape_normalize_context_t c = { plan, buffer, @@ -301,8 +299,10 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, plan->shaper->compose ? plan->shaper->compose : compose_unicode }; - bool short_circuit = mode != HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED && - mode != HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT; + bool always_short_circuit = mode == HB_OT_SHAPE_NORMALIZATION_MODE_NONE; + bool might_short_circuit = always_short_circuit || + (mode != HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED && + mode != HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT); unsigned int count; /* We do a fairly straightforward yet custom normalization process in three @@ -323,7 +323,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, if (buffer->cur().cluster != buffer->info[end].cluster) break; - decompose_cluster (&c, short_circuit, end); + decompose_cluster (&c, end, might_short_circuit, always_short_circuit); } buffer->swap_buffers (); @@ -355,7 +355,8 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, } - if (mode == HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED) + if (mode == HB_OT_SHAPE_NORMALIZATION_MODE_NONE || + mode == HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED) return; /* Third round, recompose */ @@ -393,8 +394,9 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, return; buffer->merge_out_clusters (starter, buffer->out_len); buffer->out_len--; /* Remove the second composable. */ - buffer->out_info[starter].codepoint = composed; /* Modify starter and carry on. */ - set_glyph (buffer->out_info[starter], font); + /* Modify starter and carry on. */ + buffer->out_info[starter].codepoint = composed; + buffer->out_info[starter].glyph_index() = glyph; _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer->unicode); continue; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-private.hh index cbfab5b40c..df81fa25d9 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape-private.hh @@ -40,6 +40,10 @@ struct hb_ot_shape_plan_t const struct hb_ot_complex_shaper_t *shaper; hb_ot_map_t map; const void *data; + hb_mask_t rtlm_mask, frac_mask, numr_mask, dnom_mask; + hb_mask_t kern_mask; + unsigned int has_frac : 1; + unsigned int has_kern : 1; inline void collect_lookups (hb_tag_t table_tag, hb_set_t *lookups) const { @@ -77,6 +81,17 @@ struct hb_ot_shape_planner_t plan.props = props; plan.shaper = shaper; map.compile (plan.map); + + plan.rtlm_mask = plan.map.get_1_mask (HB_TAG ('r','t','l','m')); + plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c')); + plan.numr_mask = plan.map.get_1_mask (HB_TAG ('n','u','m','r')); + plan.dnom_mask = plan.map.get_1_mask (HB_TAG ('d','n','o','m')); + + plan.kern_mask = plan.map.get_mask (HB_DIRECTION_IS_HORIZONTAL (plan.props.direction) ? + HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n')); + + plan.has_frac = plan.frac_mask || (plan.numr_mask && plan.dnom_mask); + plan.has_kern = !!plan.kern_mask; } private: diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc index 63c36f936f..3080a1d03d 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc @@ -88,6 +88,10 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, break; } + map->add_feature (HB_TAG ('f','r','a','c'), 1, F_NONE); + map->add_feature (HB_TAG ('n','u','m','r'), 1, F_NONE); + map->add_feature (HB_TAG ('d','n','o','m'), 1, F_NONE); + if (planner->shaper->collect_features) planner->shaper->collect_features (planner); @@ -234,8 +238,7 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font) HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) return; - hb_codepoint_t dottedcircle_glyph; - if (!font->get_glyph (0x25CC, 0, &dottedcircle_glyph)) + if (!font->has_glyph (0x25CC)) return; hb_glyph_info_t dottedcircle; @@ -292,7 +295,7 @@ hb_ot_mirror_chars (hb_ot_shape_context_t *c) hb_buffer_t *buffer = c->buffer; hb_unicode_funcs_t *unicode = buffer->unicode; - hb_mask_t rtlm_mask = c->plan->map.get_1_mask (HB_TAG ('r','t','l','m')); + hb_mask_t rtlm_mask = c->plan->rtlm_mask; unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; @@ -306,13 +309,58 @@ hb_ot_mirror_chars (hb_ot_shape_context_t *c) } static inline void -hb_ot_shape_setup_masks (hb_ot_shape_context_t *c) +hb_ot_shape_setup_masks_fraction (hb_ot_shape_context_t *c) +{ + if (!c->plan->has_frac) + return; + + hb_buffer_t *buffer = c->buffer; + + /* TODO look in pre/post context text also. */ + unsigned int count = buffer->len; + hb_glyph_info_t *info = buffer->info; + for (unsigned int i = 0; i < count; i++) + { + if (info[i].codepoint == 0x2044) /* FRACTION SLASH */ + { + unsigned int start = i, end = i + 1; + while (start && + _hb_glyph_info_get_general_category (&info[start - 1]) == + HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) + start--; + while (end < count && + _hb_glyph_info_get_general_category (&info[end]) == + HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) + end++; + + for (unsigned int j = start; j < i; j++) + info[j].mask |= c->plan->numr_mask | c->plan->frac_mask; + info[i].mask |= c->plan->frac_mask; + for (unsigned int j = i + 1; j < end; j++) + info[j].mask |= c->plan->frac_mask | c->plan->dnom_mask; + + i = end - 1; + } + } +} + +static inline void +hb_ot_shape_initialize_masks (hb_ot_shape_context_t *c) { hb_ot_map_t *map = &c->plan->map; hb_buffer_t *buffer = c->buffer; hb_mask_t global_mask = map->get_global_mask (); buffer->reset_masks (global_mask); +} + +static inline void +hb_ot_shape_setup_masks (hb_ot_shape_context_t *c) +{ + hb_ot_map_t *map = &c->plan->map; + hb_buffer_t *buffer = c->buffer; + + hb_ot_shape_setup_masks_fraction (c); if (c->plan->shaper->setup_masks) c->plan->shaper->setup_masks (c->plan, buffer, c->font); @@ -358,6 +406,8 @@ hb_ot_substitute_default (hb_ot_shape_context_t *c) if (c->plan->shaper->preprocess_text) c->plan->shaper->preprocess_text (c->plan, buffer, c->font); + hb_ot_shape_initialize_masks (c); + hb_ot_mirror_chars (c); HB_BUFFER_ALLOCATE_VAR (buffer, glyph_index); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.h b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.h new file mode 100644 index 0000000000..afe6fe9618 --- /dev/null +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-shape.h @@ -0,0 +1,54 @@ +/* + * Copyright © 2013 Red Hat, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + */ + +#ifndef HB_OT_SHAPE_H +#define HB_OT_SHAPE_H +#define HB_OT_SHAPE_H_IN + +#include "hb.h" + +#include "hb-ot-layout.h" +#include "hb-ot-tag.h" + +HB_BEGIN_DECLS + +/* TODO port to shape-plan / set. */ +void +hb_ot_shape_glyphs_closure (hb_font_t *font, + hb_buffer_t *buffer, + const hb_feature_t *features, + unsigned int num_features, + hb_set_t *glyphs); + +void +hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan, + hb_tag_t table_tag, + hb_set_t *lookup_indexes /* OUT */); + +HB_END_DECLS + +#undef HB_OT_SHAPE_H_IN +#endif /* HB_OT_SHAPE_H */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot.h b/src/3rdparty/harfbuzz-ng/src/hb-ot.h index 8073906399..e9a280b7dd 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot.h +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot.h @@ -32,17 +32,10 @@ #include "hb-ot-layout.h" #include "hb-ot-tag.h" +#include "hb-ot-shape.h" HB_BEGIN_DECLS -/* TODO remove */ -void -hb_ot_shape_glyphs_closure (hb_font_t *font, - hb_buffer_t *buffer, - const hb_feature_t *features, - unsigned int num_features, - hb_set_t *glyphs); - HB_END_DECLS #undef HB_OT_H_IN diff --git a/src/3rdparty/harfbuzz-ng/src/hb-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-private.hh index 4b72260ed5..680b21e2cc 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-private.hh @@ -807,6 +807,12 @@ hb_in_range (T u, T lo, T hi) return lo <= u && u <= hi; } +template static inline bool +hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2) +{ + return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2); +} + template static inline bool hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3) { diff --git a/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh b/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh index b9c029e58f..da6d8e0be9 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-shaper-list.hh @@ -52,4 +52,6 @@ HB_SHAPER_IMPLEMENT (uniscribe) HB_SHAPER_IMPLEMENT (coretext) #endif +#ifdef HAVE_FALLBACK HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */ +#endif diff --git a/src/3rdparty/harfbuzz-ng/src/hb-unicode-private.hh b/src/3rdparty/harfbuzz-ng/src/hb-unicode-private.hh index 779d8ae229..ba193e8fa5 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-unicode-private.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-unicode-private.hh @@ -106,7 +106,11 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE modified_combining_class (hb_codepoint_t unicode) { /* XXX This hack belongs to the Myanmar shaper. */ - if (unicode == 0x1037) unicode = 0x103A; + if (unlikely (unicode == 0x1037)) unicode = 0x103A; + + /* XXX This hack belongs to the SEA shaper (for Tai Tham): + * Reorder SAKOT to ensure it comes after any tone marks. */ + if (unlikely (unicode == 0x1A60)) return 254; return _hb_modified_combining_class[combining_class (unicode)]; } @@ -130,10 +134,10 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE * 6.3 is also added manually. The new Unicode 6.3 bidi formatting * characters are encoded in a block that was Default_Ignorable already. * - * Note: While U+115F and U+1160 are Default_Ignorable, we do NOT want to - * hide them, as the way Uniscribe has implemented them is with regular - * spacing glyphs, and that's the way fonts are made to work. As such, - * we make exceptions for those two. + * Note: While U+115F, U+1160, U+3164 and U+FFA0 are Default_Ignorable, + * we do NOT want to hide them, as the way Uniscribe has implemented them + * is with regular spacing glyphs, and that's the way fonts are made to work. + * As such, we make exceptions for those four. * * Gathered from: * http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:DI:]&abb=on&ucd=on&esc=on @@ -155,10 +159,10 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE * 200B..200F ;RIGHT-TO-LEFT MARK * 202A..202E ;RIGHT-TO-LEFT OVERRIDE * 2060..206F ;NOMINAL DIGIT SHAPES - * 3164 ;HANGUL FILLER + * #3164 ;HANGUL FILLER * FE00..FE0F ;VARIATION SELECTOR-16 * FEFF ;ZERO WIDTH NO-BREAK SPACE - * FFA0 ;HALFWIDTH HANGUL FILLER + * #FFA0 ;HALFWIDTH HANGUL FILLER * FFF0..FFF8 ; * 1D173..1D17A ;MUSICAL SYMBOL END PHRASE * E0000..E0FFF ; @@ -180,9 +184,8 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE case 0x20: return hb_in_ranges (ch, 0x200B, 0x200F, 0x202A, 0x202E, 0x2060, 0x206F); - case 0x31: return unlikely (ch == 0x3164); case 0xFE: return hb_in_range (ch, 0xFE00, 0xFE0F) || ch == 0xFEFF; - case 0xFF: return hb_in_range (ch, 0xFFF0, 0xFFF8) || ch == 0xFFA0; + case 0xFF: return hb_in_range (ch, 0xFFF0, 0xFFF8); default: return false; } } diff --git a/src/3rdparty/harfbuzz.pri b/src/3rdparty/harfbuzz.pri index 0d55867c74..bc002340ef 100644 --- a/src/3rdparty/harfbuzz.pri +++ b/src/3rdparty/harfbuzz.pri @@ -9,7 +9,6 @@ contains(QT_CONFIG, harfbuzz) { $$QT_HARFBUZZ_DIR/src/hb-buffer-serialize.cc \ $$QT_HARFBUZZ_DIR/src/hb-common.cc \ $$QT_HARFBUZZ_DIR/src/hb-face.cc \ - $$QT_HARFBUZZ_DIR/src/hb-fallback-shape.cc \ $$QT_HARFBUZZ_DIR/src/hb-font.cc \ $$QT_HARFBUZZ_DIR/src/hb-ot-tag.cc \ $$QT_HARFBUZZ_DIR/src/hb-set.cc \ @@ -65,11 +64,14 @@ contains(QT_CONFIG, harfbuzz) { $$QT_HARFBUZZ_DIR/src/hb-ot-shape.cc \ $$QT_HARFBUZZ_DIR/src/hb-ot-shape-complex-arabic.cc \ $$QT_HARFBUZZ_DIR/src/hb-ot-shape-complex-default.cc \ + $$QT_HARFBUZZ_DIR/src/hb-ot-shape-complex-hangul.cc \ + $$QT_HARFBUZZ_DIR/src/hb-ot-shape-complex-hebrew.cc \ $$QT_HARFBUZZ_DIR/src/hb-ot-shape-complex-indic.cc \ $$QT_HARFBUZZ_DIR/src/hb-ot-shape-complex-indic-table.cc \ $$QT_HARFBUZZ_DIR/src/hb-ot-shape-complex-myanmar.cc \ $$QT_HARFBUZZ_DIR/src/hb-ot-shape-complex-sea.cc \ $$QT_HARFBUZZ_DIR/src/hb-ot-shape-complex-thai.cc \ + $$QT_HARFBUZZ_DIR/src/hb-ot-shape-complex-tibetan.cc \ $$QT_HARFBUZZ_DIR/src/hb-ot-shape-fallback.cc \ $$QT_HARFBUZZ_DIR/src/hb-ot-shape-normalize.cc @@ -96,6 +98,7 @@ contains(QT_CONFIG, harfbuzz) { HEADERS += \ $$QT_HARFBUZZ_DIR/src/hb-ot.h \ $$QT_HARFBUZZ_DIR/src/hb-ot-layout.h \ + $$QT_HARFBUZZ_DIR/src/hb-ot-shape.h \ $$QT_HARFBUZZ_DIR/src/hb-ot-tag.h DEFINES += HAVE_CONFIG_H -- cgit v1.2.3