From b41fb4fe7591a11d9c94ebf4730a9cf4333a59a6 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Thu, 23 Jul 2026 02:18:04 +0200 Subject: [PATCH] fix(ui): harden settings focus and semantics --- lib/data/ducet_order.dart | 530 ++++++- lib/data/hid_key_labels.dart | 2 +- lib/data/iso_639_data.dart | 2 +- lib/focus/focusable_action_bar.dart | 36 +- lib/focus/focusable_button.dart | 4 +- lib/focus/focusable_text_field.dart | 73 +- lib/focus/focusable_wrapper.dart | 20 +- lib/focus/input_mode_tracker.dart | 30 +- lib/focus/key_event_utils.dart | 22 + lib/focus/locked_hub_controller.dart | 22 +- lib/i18n/bg.i18n.json | 33 +- lib/i18n/da.i18n.json | 33 +- lib/i18n/de.i18n.json | 33 +- lib/i18n/en.i18n.json | 17 +- lib/i18n/es.i18n.json | 33 +- lib/i18n/fr.i18n.json | 33 +- lib/i18n/it.i18n.json | 33 +- lib/i18n/ja.i18n.json | 33 +- lib/i18n/ko.i18n.json | 33 +- lib/i18n/nb.i18n.json | 33 +- lib/i18n/nl.i18n.json | 33 +- lib/i18n/pl.i18n.json | 33 +- lib/i18n/pt.i18n.json | 33 +- lib/i18n/ru.i18n.json | 33 +- lib/i18n/strings.g.dart | 2 +- lib/i18n/strings_bg.g.dart | 76 +- lib/i18n/strings_da.g.dart | 76 +- lib/i18n/strings_de.g.dart | 72 +- lib/i18n/strings_en.g.dart | 72 +- lib/i18n/strings_es.g.dart | 76 +- lib/i18n/strings_fr.g.dart | 76 +- lib/i18n/strings_it.g.dart | 76 +- lib/i18n/strings_ja.g.dart | 76 +- lib/i18n/strings_ko.g.dart | 76 +- lib/i18n/strings_nb.g.dart | 76 +- lib/i18n/strings_nl.g.dart | 76 +- lib/i18n/strings_pl.g.dart | 76 +- lib/i18n/strings_pt.g.dart | 76 +- lib/i18n/strings_ru.g.dart | 76 +- lib/i18n/strings_sv.g.dart | 76 +- lib/i18n/strings_zh.g.dart | 76 +- lib/i18n/sv.i18n.json | 33 +- lib/i18n/zh.i18n.json | 33 +- lib/mixins/grid_focus_node_mixin.dart | 10 +- lib/models/shader_preset.dart | 60 +- lib/providers/shader_provider.dart | 28 +- lib/screens/catalog_item_detail_screen.dart | 9 +- lib/screens/discover_screen.dart | 5 + lib/screens/explore_screen.dart | 4 + .../focusable_detail_screen_mixin.dart | 29 +- lib/screens/libraries/alpha_jump_bar.dart | 135 +- .../libraries/alpha_scroll_handle.dart | 170 ++- .../tabs/library_recommended_tab.dart | 12 + lib/screens/livetv/tabs/whats_on_tab.dart | 3 + lib/screens/media_detail_screen.dart | 30 +- .../profile/borrow_connection_screen.dart | 108 +- lib/screens/profile/pin_entry_dialog.dart | 7 +- .../settings/hotkey_recorder_widget.dart | 208 +-- .../settings/keyboard_shortcuts_screen.dart | 47 +- lib/screens/settings/mpv_config_screen.dart | 182 ++- .../settings/services_settings_screen.dart | 4 +- lib/screens/settings/settings_screen.dart | 173 ++- lib/screens/settings/settings_utils.dart | 40 +- lib/services/keyboard_shortcuts_service.dart | 42 +- lib/services/plex_client.dart | 61 +- lib/services/settings_export_service.dart | 105 +- lib/services/settings_service.dart | 31 +- lib/services/shader_asset_loader.dart | 156 +- lib/utils/initials_palette.dart | 3 +- lib/utils/search_relevance.dart | 142 +- lib/widgets/app_bar_back_button.dart | 72 +- lib/widgets/cycling_media_backdrop.dart | 78 +- lib/widgets/desktop_app_bar.dart | 6 +- lib/widgets/focus_builders.dart | 27 +- lib/widgets/focusable_filter_chip.dart | 1 + lib/widgets/focusable_media_card.dart | 5 + lib/widgets/focusable_tab_chip.dart | 2 + lib/widgets/hotkey_recorder.dart | 1 + lib/widgets/hub_section.dart | 12 +- lib/widgets/media_card.dart | 426 +++--- lib/widgets/optimized_media_image.dart | 131 +- lib/widgets/server_activities_button.dart | 99 +- lib/widgets/setting_tile.dart | 24 +- lib/widgets/settings_section.dart | 16 +- lib/widgets/tv_browse_rail.dart | 8 +- lib/widgets/tv_virtual_keyboard.dart | 41 +- .../models/track_controls_state.dart | 4 +- .../video_controls/parts/track_controls.dart | 25 +- .../video_controls/parts/visibility.dart | 14 + .../video_controls/sheets/track_sheet.dart | 63 +- .../video_controls/video_control_button.dart | 28 +- .../video_controls/video_controls.dart | 27 +- .../widgets/circular_control_button.dart | 2 + .../video_controls/widgets/content_strip.dart | 12 + .../widgets/sync_offset_control.dart | 30 +- .../widgets/track_chapter_controls.dart | 118 +- .../widgets/video_controls_header.dart | 6 +- .../widgets/volume_control.dart | 2 + pubspec.lock | 8 + pubspec.yaml | 1 + scripts/check_codegen.py | 9 +- scripts/codegen.sh | 3 + ...ecf9ccf1541a49306993e8210fa2209aa0b.txt.gz | Bin 0 -> 590413 bytes scripts/data/allkeys-13.0.0.txt.gz | Bin 0 -> 313505 bytes scripts/data/hid_key_labels.json | 1331 +++++++++++++++++ scripts/data/iso_639_codes.json | 1110 ++++++++++++++ scripts/generate_ducet_ranks.dart | 597 +++++--- scripts/generate_hid_key_labels.dart | 208 +++ scripts/generate_iso_639_data.dart | 239 +++ scripts/test_check_codegen.py | 27 + slang.yaml | 10 +- test/data/ducet_order_test.dart | 42 + test/data/hid_key_labels_test.dart | 31 + test/data/iso_639_data_test.dart | 54 + .../focus/focusable_chip_long_press_test.dart | 20 + test/focus/grid_focus_node_mixin_test.dart | 64 + test/focus/input_mode_tracker_test.dart | 62 + test/focus/key_event_utils_test.dart | 121 ++ test/focus/locked_hub_controller_test.dart | 27 + test/i18n/empty_string_fallback_test.dart | 73 + test/i18n/locale_fallback_source_test.dart | 47 + test/models/shader_preset_test.dart | 91 +- test/providers/shader_provider_test.dart | 119 ++ .../catalog_item_detail_screen_test.dart | 59 +- .../collection_detail_screen_test.dart | 37 + .../libraries/alpha_jump_bar_test.dart | 40 + .../libraries/alpha_scroll_handle_test.dart | 78 + .../add_local_profile_screen_test.dart | 4 + .../borrow_connection_screen_test.dart | 103 ++ .../keyboard_shortcuts_screen_test.dart | 167 +++ .../settings/mpv_config_screen_test.dart | 330 ++++ .../settings/settings_screen_test.dart | 164 +- .../screens/settings/settings_utils_test.dart | 106 ++ test/scripts/generate_ducet_ranks_test.dart | 329 ++++ .../scripts/generate_hid_key_labels_test.dart | 91 ++ test/scripts/generate_iso_639_data_test.dart | 98 ++ .../data_aggregation_bridge_test.dart | 10 +- .../keyboard_shortcuts_service_test.dart | 134 ++ .../plex_client_http_contract_test.dart | 24 + .../settings_export_service_test.dart | 222 ++- test/services/shader_asset_loader_test.dart | 193 +++ test/services/shader_service_test.dart | 62 + test/utils/initials_palette_test.dart | 19 + test/utils/search_relevance_test.dart | 132 ++ test/widgets/app_bar_back_button_test.dart | 58 + test/widgets/cycling_media_backdrop_test.dart | 165 +- test/widgets/dialog_action_button_test.dart | 10 +- test/widgets/focusable_text_field_test.dart | 122 ++ test/widgets/hotkey_recorder_test.dart | 132 +- test/widgets/hub_section_test.dart | 67 + test/widgets/media_card_full_card_test.dart | 148 ++ test/widgets/optimized_media_image_test.dart | 97 ++ test/widgets/pin_entry_dialog_test.dart | 46 + test/widgets/player_queue_spoilers_test.dart | 143 +- .../server_activities_button_test.dart | 236 +++ test/widgets/track_sheet_test.dart | 87 +- test/widgets/tv_browse_rail_test.dart | 165 +- test/widgets/tv_virtual_keyboard_test.dart | 97 ++ test/widgets/video_controls_test.dart | 288 +++- 159 files changed, 12054 insertions(+), 2050 deletions(-) create mode 100644 scripts/data/FractionalUCA-651afecf9ccf1541a49306993e8210fa2209aa0b.txt.gz create mode 100644 scripts/data/allkeys-13.0.0.txt.gz create mode 100644 scripts/data/hid_key_labels.json create mode 100644 scripts/data/iso_639_codes.json create mode 100644 scripts/generate_hid_key_labels.dart create mode 100644 scripts/generate_iso_639_data.dart create mode 100644 test/data/ducet_order_test.dart create mode 100644 test/data/hid_key_labels_test.dart create mode 100644 test/data/iso_639_data_test.dart create mode 100644 test/focus/grid_focus_node_mixin_test.dart create mode 100644 test/focus/locked_hub_controller_test.dart create mode 100644 test/i18n/empty_string_fallback_test.dart create mode 100644 test/i18n/locale_fallback_source_test.dart create mode 100644 test/screens/libraries/alpha_scroll_handle_test.dart create mode 100644 test/screens/profile/borrow_connection_screen_test.dart create mode 100644 test/screens/settings/keyboard_shortcuts_screen_test.dart create mode 100644 test/screens/settings/mpv_config_screen_test.dart create mode 100644 test/scripts/generate_ducet_ranks_test.dart create mode 100644 test/scripts/generate_hid_key_labels_test.dart create mode 100644 test/scripts/generate_iso_639_data_test.dart create mode 100644 test/services/shader_asset_loader_test.dart create mode 100644 test/services/shader_service_test.dart create mode 100644 test/utils/initials_palette_test.dart create mode 100644 test/utils/search_relevance_test.dart create mode 100644 test/widgets/app_bar_back_button_test.dart diff --git a/lib/data/ducet_order.dart b/lib/data/ducet_order.dart index 755720f6..e4e8ca7c 100644 --- a/lib/data/ducet_order.dart +++ b/lib/data/ducet_order.dart @@ -1,10 +1,522 @@ -/// Sorted BMP codepoints per DUCET (Unicode 13.0) + CLDR 39 CJK radical-stroke. +/// Dense BMP ranks per DUCET (Unicode 13.0) + pinned CLDR CJK radical-stroke. +/// Each code unit stores rank + 1; zero means absent. /// Katakana sorts before hiragana (CLDR root tailoring). /// Generated by scripts/generate_ducet_ranks.dart โ€” do not edit. library; -const String _ducetOrder = - '\u0332\u0313\u0343\u0486\u2cf1\u0314\u0485\u2cf0\u0301\u0341\u0954\u0300\u0340\u0953\u0306\u0302\u030c\u030a\u0342\u0308\u030b\u0303\u0307\u0338\u0327\u0328\u0304\u030d\u030e\u0312\u0315\u031a\u033d\u033e\u033f\u0346\u034a\u034b\u034c\u0350\u0351\u0352\u0357\u035b\u035d\u035e\u0484\u0487\u0741\u0745\u0b55\u17cb\u17cc\u17cd\u17ce\u17cf\u17d0\u17d1\u17dd\u1ab0\u1ab1\u1ab2\u1ab3\u1ab4\u1abb\u1abc\u1dc0\u1dc1\u1dc3\u1dc4\u1dc5\u1dc6\u1dc7\u1dc8\u1dc9\u1dcb\u1dcc\u1dcd\u1dce\u1dd1\u1df5\u1df6\u1df7\u1df8\u1dfb\u1dfe\u20f0\u2cef\ua67c\ua67d\u0316\u0317\u0318\u0319\u031c\u031d\u031e\u031f\u0320\u0329\u032a\u032b\u032c\u032f\u0333\u033a\u033b\u033c\u0347\u0348\u0349\u034d\u034e\u0353\u0354\u0355\u0356\u0359\u035a\u035c\u035f\u0362\u0742\u0746\u07fd\u0859\u085a\u085b\u1ab5\u1ab6\u1ab7\u1ab8\u1ab9\u1aba\u1abd\u1dc2\u1dcf\u1dd0\u1df9\u1dfc\u1dfd\u1dff\u20ec\u20ed\u20ee\u20ef\ufe27\u0336\u0337\u20d8\u20d9\u20da\u20e5\u20ea\u20eb\u1abe\u20dd\u20de\u20df\u20e0\u20e2\u20e3\u20e4\u3099\uff9e\u309a\uff9f\u0335\u0305\u0309\u030f\u0310\u0311\u031b\u0321\u0322\u0323\u0324\u0325\u0326\u032d\u032e\u0330\u0331\u0334\u0339\u0345\u0358\u0360\ufe22\ufe29\u0361\ufe20\u0483\ufe2e\ua66f\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05c7\u05b9\u05ba\u05bb\u05c2\u05c1\u05bc\u05bf\ufb1e\u081c\u081d\u081e\u081f\u0820\u0821\u0822\u0823\u0824\u0825\u0826\u0827\u0828\u0829\u082a\u082b\u082c\u0818\u0819\u082d\u064b\ufe71\ufe70\u08f0\u08e7\u064c\ufe72\u08f1\u08e8\u064d\ufe74\u08f2\u08e9\u064e\ufe77\ufe76\u08e4\u08f4\u08f5\u064f\ufe79\ufe78\u08e5\u08fe\u0650\ufe7b\ufe7a\u08e6\u08f6\u0651\u0afb\ufe7d\ufe7c\u0652\u0afa\ufe7f\ufe7e\u0653\u0afc\u0654\u0655\u065f\u0656\u0657\u0658\u08ff\u0659\u065a\u065b\u065c\u065d\u065e\u08e3\u08f7\u08f8\u08fd\u08fb\u08fc\u08f9\u08fa\u0670\u0711\u0730\u0731\u0732\u0733\u0734\u0735\u0736\u0737\u0738\u0739\u073a\u073b\u073c\u073d\u073e\u073f\u07eb\u07ec\u07ed\u07ee\u07ef\u07f0\u07f1\u07f2\u07f3\u135f\u135e\u135d\ua6f0\ua6f1\u093c\u09bc\u0a3c\u0abc\u0afd\u0afe\u0aff\u0b3c\u0cbc\u1b34\u1be6\u1c37\ua9b3\u0900\u0901\u0981\u0a01\u0a81\u0b01\u0c00\u0c01\u0c81\u0d01\u0d81\u1b00\u1b01\ua8c5\ua980\u0902\u0982\u0a02\u0a82\u0b02\u0b82\u0c02\u0c04\u0c82\u0d00\u0d02\u0d82\u0f7e\u1036\u17c6\u1a74\u1b02\u1b80\u1ced\ua80b\ua880\ua981\u0903\u0983\u0a03\u0a83\u0b03\u0c03\u0c83\u0d03\u0d83\u0f7f\u1038\u17c7\u1b04\u1b82\u1cf2\u1cf3\ua881\ua983\u09fe\u0a70\u0a71\u1b03\ua982\u1b81\uabec\u0e4e\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\uaabf\uaac1\u0f39\ua92b\ua92c\ua92d\u1037\u17c8\u17c9\u17ca\u1a75\u1a76\u1a77\u1a78\u1a79\u1a7a\u1a7b\u1a7c\u1939\u193a\u193b\u302a\u302b\u302c\u302d\u302e\u302f\u20d0\u20d1\u20d2\u20d3\u20d4\u20d5\u20d6\u20d7\u20db\u20dc\u20e1\u20e6\u20e7\u20e8\u20e9\u0344\ufc5e\ufc5f\ufcf2\ufc60\ufcf3\ufc61\ufcf4\ufc62\ufc63\u0009\u000a\u000b\u000c\u000d\u0085\u2028\u2029\u0020\u3000\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2008\u2009\u200a\u205f\u00a0\u2007\u202f\u203e\ufe49\ufe4a\ufe4b\ufe4c\u005f\uff3f\ufe4d\ufe4e\ufe4f\ufe33\ufe34\u2017\u002d\uff0d\ufe63\u058a\u1400\u1b60\u1806\u1807\u2010\u2011\u2012\u2013\ufe32\u2014\ufe58\ufe31\u2015\u2e3a\u2e3b\u2053\u2e43\u2e17\u2e40\u301c\u3030\u30a0\u30fb\uff65\u002c\uff0c\ufe50\ufe10\u2e34\u2e32\u2e41\u2e4c\u2e4e\u2e4f\u055d\u060c\u060d\u066b\u066c\u07f8\u1802\u1808\ua4fe\ua60d\ua6f5\u3001\ufe51\uff64\ufe11\ufe45\ufe46\u003b\u037e\uff1b\ufe54\ufe14\u061b\u204f\u2e35\ua6f6\u2e49\u003a\uff1a\ufe55\ufe13\u2a74\u0589\u061e\u0703\u0704\u0705\u0706\u0707\u0708\u0830\u0831\u0832\u0833\u0834\u0835\u0836\u0837\u0838\u0839\u083a\u083b\u083c\u083d\u083e\u1361\u1363\u1364\u1365\u1366\u1804\u1805\u0f14\u17d6\u1b5d\ua9c7\u16eb\u16ec\u16ed\ua6f4\u0021\uff01\ufe57\ufe15\u203c\u2049\u00a1\u055c\u07f9\u1944\u003f\uff1f\ufe56\ufe16\u2048\u2047\u00bf\u2e2e\u055e\u061f\u0709\u1367\u1945\u2cfa\u2cfb\ua60f\ua6f7\uaaf1\u203d\u2e18\u002e\uff0e\u2024\ufe52\u2025\ufe30\u2026\ufe19\u1801\u06d4\u0701\u0702\u1362\u1803\u1809\u166e\u1b5c\u2cf9\u2cfe\u2e30\u2e3c\ua4ff\ua60e\ua6f3\u3002\uff61\ufe12\u00b7\u0387\u2e31\u2e33\u0964\u0965\ua8ce\ua8cf\u1c3b\u1c3c\ua876\ua877\u1735\u1736\ua92f\u104a\u104b\u17d4\u17d5\u1aa8\u1aa9\u1aaa\u1aab\u1b5e\u1b5f\ua9c8\ua9c9\uaa5d\uaa5e\uaa5f\uaaf0\uabeb\u1c7e\u1c7f\u0700\u07f7\u10fb\u1360\u1368\u1a1e\u1a1f\u1b5a\u1b5b\ua9c1\ua9c2\ua9c3\ua9c4\ua9c5\ua9c6\ua9ca\ua9cb\ua9cc\ua9cd\ua6f2\ua95f\u2055\u2056\u2058\u2059\u205a\u205b\u205c\u205d\u205e\u2e2a\u2e2b\u2e2c\u2e2d\u2e3d\u2cfc\u2cff\u2e19\'\uff07\u2018\u2019\u201a\u201b\u2039\u203a\u0022\uff02\u201c\u201d\u201e\u201f\u2e42\u301d\u301e\u301f\u00ab\u00bb\u0028\uff08\ufe59\u207d\u208d\ufe35\u2474\u247d\u247e\u247f\u2480\u2481\u2482\u2483\u2484\u2485\u2486\u2475\u2487\u2476\u2477\u2478\u2479\u247a\u247b\u247c\u249c\u249d\u249e\u249f\u24a0\u24a1\u24a2\u24a3\u24a4\u24a5\u24a6\u24a7\u24a8\u24a9\u24aa\u24ab\u24ac\u24ad\u24ae\u24af\u24b0\u24b1\u24b2\u24b3\u24b4\u24b5\u3200\u320e\u3201\u320f\u3202\u3210\u3203\u3211\u3204\u3212\u3205\u3213\u3206\u3214\u3207\u3215\u321d\u321e\u3208\u3216\u321c\u3209\u3217\u320a\u3218\u320b\u3219\u320c\u321a\u320d\u321b\u3220\u3226\u3222\u3228\u3221\u3224\u3239\u323d\u3241\u3227\u3225\u3238\u3229\u323f\u3234\u323a\u3223\u322f\u323b\u3230\u322a\u3232\u322d\u3231\u322c\u322b\u3235\u323c\u3233\u3237\u3240\u3242\u3243\u3236\u323e\u322e\u0029\uff09\ufe5a\u207e\u208e\ufe36\u005b\uff3b\ufe47\u005d\uff3d\ufe48\u007b\uff5b\ufe5b\ufe37\u007d\uff5d\ufe5c\ufe38\u0f3a\u0f3b\u0f3c\u0f3d\u169b\u169c\u2045\u2046\u2308\u2309\u230a\u230b\u29fc\u29fd\u2983\u2984\u2985\uff5f\u2986\uff60\u2987\u2988\u2989\u298a\u298b\u298c\u298d\u298e\u298f\u2990\u2991\u2992\u2993\u2994\u2995\u2996\u2997\u2998\u27c5\u27c6\u27e6\u27e7\u27e8\u27e9\u27ea\u27eb\u27ec\u27ed\u27ee\u27ef\u2768\u2769\u276a\u276b\u276c\u276d\u276e\u276f\u2770\u2771\u2772\u2773\u2774\u2775\u2e02\u2e03\u2e04\u2e05\u2e09\u2e0a\u2e0c\u2e0d\u2e1c\u2e1d\u2e20\u2e21\u2e22\u2e23\u2e24\u2e25\u2e26\u2e27\u2e28\u2e29\u2329\u3008\ufe3f\u232a\u3009\ufe40\u300a\ufe3d\u300b\ufe3e\u300c\uff62\ufe41\u300d\uff63\ufe42\u300e\ufe43\u300f\ufe44\u3010\ufe3b\u3011\ufe3c\u3014\ufe5d\ufe39\u3015\ufe5e\ufe3a\u3016\ufe17\u3017\ufe18\u3018\u3019\u301a\u301b\ufd3e\ufd3f\u2016\u2e3e\u29d8\u29d9\u29da\u29db\u00a7\u2e39\u00b6\u204b\u2e4d\u2e3f\u0040\uff20\ufe6b\u002a\uff0a\ufe61\u204e\u2051\u066d\ua673\u002f\uff0f\\\uff3c\ufe68\u2e4a\u0026\uff06\ufe60\u204a\u2e52\u0023\uff03\ufe5f\u0025\uff05\ufe6a\u066a\u2030\u0609\u2031\u060a\u2020\u2021\u2e36\u2e37\u2e38\u2e4b\u2022\u2023\u2027\u2043\u204c\u204d\u2032\u2033\u2034\u2057\u2035\u2036\u2037\u3003\u303d\u2038\u203b\u203f\u2054\u2040\u2050\u2041\u2042\u2e00\u2e01\u2e06\u2e07\u2e08\u2e0b\u2e0e\u2e0f\u2e10\u2e11\u2e12\u2e13\u2e14\u2e15\u2e16\u2e1a\u2e1b\u2e1e\u2e1f\u2e44\u2e45\u2e46\u2e47\u2e48\ua67e\u055a\u055b\u055f\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u070a\u070b\u070c\u070d\u085e\u1800\u0970\ua8f8\ua8f9\ua8fa\ua8fc\u09fd\u0a76\u0af0\u0c77\u0c84\u0df4\u0e4f\u0e5a\u0e5b\uaade\uaadf\u0f04\u0f05\u0f06\u0f07\u0f08\u0f09\u0f0a\u0fd0\u0fd1\u0f0b\u0f0c\u0f0d\u0f0e\u0f0f\u0f10\u0f11\u0f12\u0f85\u0fd2\u0fd3\u0fd4\u0fd9\u0fda\u1c3d\u1c3e\u1c3f\u104c\u104d\u104e\u104f\u17d8\u17d9\u17da\u1aa0\u1aa1\u1aa2\u1aa3\u1aa4\u1aa5\u1aa6\u1aac\u1aad\u1cc0\u1cc1\u1cc2\u1cc3\u1cc4\u1cc5\u1cc6\u1cc7\u2d70\ua874\ua875\u1bfc\u1bfd\u1bfe\u1bff\ua92e\ua9de\ua9df\uaa5c\u0060\u1fef\uff40\u00b4\u0384\u1ffd\u02dc\u005e\uff3e\u00af\uffe3\u02d8\u02d9\u00a8\u0385\u1fee\u1fed\u1fc1\u02da\u02dd\u00b8\u02db\u1fbd\u1fbf\u1fce\u1fcd\u1fcf\u1ffe\u1fde\u1fdd\u1fdf\u1fc0\u309b\u309c\u02b9\u0374\u0375\u02ba\u02c2\u02c3\u02c4\u02c5\u02c6\u02c7\u02c8\u02c9\u02ca\u02cb\u02cc\u02cd\u02ce\u02cf\u02d2\u02d3\u02d4\u02d5\uab6a\uab6b\u02d6\u02d7\u02de\u02df\u02e5\u02e6\u02e7\u02e8\u02e9\u02ea\u02eb\u02ec\u02ed\u02ef\u02f0\u02f1\u02f2\u02f3\u02f4\u02f5\u02f6\u02f7\u02f8\u02f9\u02fa\u02fb\u02fc\u02fd\u02fe\u02ff\u1390\u1391\u1392\u1393\u1394\u1395\u1396\u1397\u1398\u1399\ua700\ua701\ua702\ua703\ua704\ua705\ua706\ua707\ua708\ua709\ua70a\ua70b\ua70c\ua70d\ua70e\ua70f\ua710\ua711\ua712\ua713\ua714\ua715\ua716\ua717\ua718\ua719\ua71a\ua71b\ua71c\ua71d\ua71e\ua71f\ua720\ua721\ua788\ua789\ua78a\uab5b\u00b0\u2103\u2109\u0482\u058d\u058e\u0608\u060e\u060f\u06de\u06e9\ufdfd\ufbb2\ufbb3\ufbb4\ufbb5\ufbb6\ufbb7\ufbb8\ufbb9\ufbba\ufbbb\ufbbc\ufbbd\ufbbe\ufbbf\ufbc0\ufbc1\u07f6\u09fa\u0b70\u0bf3\u0bf4\u0bf5\u0bf6\u0bf7\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\ua828\ua829\ua82a\ua82b\ua836\ua837\ua839\u0f01\u0f02\u0f03\u0f13\u0f15\u0f16\u0f17\u0f1a\u0f1b\u0f1c\u0f1d\u0f1e\u0f1f\u0f34\u0f36\u0f38\u0fbe\u0fbf\u0fc0\u0fc1\u0fc2\u0fc3\u0fc4\u0fc5\u0fc7\u0fc8\u0fc9\u0fca\u0fcb\u0fcc\u0fce\u0fcf\u0fd5\u0fd6\u0fd7\u0fd8\u166d\u1940\u109e\u109f\uaa77\uaa78\uaa79\u19e0\u19e1\u19e2\u19e3\u19e4\u19e5\u19e6\u19e7\u19e8\u19e9\u19ea\u19eb\u19ec\u19ed\u19ee\u19ef\u19f0\u19f1\u19f2\u19f3\u19f4\u19f5\u19f6\u19f7\u19f8\u19f9\u19fa\u19fb\u19fc\u19fd\u19fe\u19ff\u1b61\u1b62\u1b63\u1b64\u1b65\u1b66\u1b67\u1b68\u1b69\u1b6a\u1b74\u1b75\u1b76\u1b77\u1b78\u1b79\u1b7a\u1b7b\u1b7c\u00a9\u00ae\u2104\u2108\u2114\u2117\u2118\u211e\u211f\u2123\u2125\u2127\u2129\u212e\u213a\u2141\u2142\u2143\u2144\u214a\u214c\u214f\u218a\u218b\u2190\uffe9\u219a\u2192\uffeb\u219b\u2191\uffea\u2193\uffec\u2194\u21ae\u2195\u2196\u2197\u2198\u2199\u219c\u219d\u219e\u219f\u21a0\u21a1\u21a2\u21a3\u21a4\u21a5\u21a6\u21a7\u21a8\u21a9\u21aa\u21ab\u21ac\u21ad\u21af\u21b0\u21b1\u21b2\u21b3\u21b4\u21b5\u21b6\u21b7\u21b8\u21b9\u21ba\u21bb\u21bc\u21bd\u21be\u21bf\u21c0\u21c1\u21c2\u21c3\u21c4\u21c5\u21c6\u21c7\u21c8\u21c9\u21ca\u21cb\u21cc\u21d0\u21cd\u21d1\u21d2\u21cf\u21d3\u21d4\u21ce\u21d5\u21d6\u21d7\u21d8\u21d9\u21da\u21db\u21dc\u21dd\u21de\u21df\u21e0\u21e1\u21e2\u21e3\u21e4\u21e5\u21e6\u21e7\u21e8\u21e9\u21ea\u21eb\u21ec\u21ed\u21ee\u21ef\u21f0\u21f1\u21f2\u21f3\u21f4\u21f5\u21f6\u21f7\u21f8\u21f9\u21fa\u21fb\u21fc\u21fd\u21fe\u21ff\u2200\u2201\u2202\u2203\u2204\u2205\u2206\u2207\u2208\u2209\u220a\u220b\u220c\u220d\u03f6\u220e\u220f\u2210\u2211\u2140\u002b\uff0b\ufb29\ufe62\u207a\u208a\u00b1\u00f7\u00d7\u003c\uff1c\ufe64\u226e\u003d\uff1d\ufe66\u207c\u208c\u2260\u2a75\u2a76\u003e\uff1e\ufe65\u226f\u00ac\uffe2\u007c\uff5c\u00a6\uffe4\u007e\uff5e\u2212\u207b\u208b\u2052\u2213\u2214\u2215\u2044\u2216\u2217\u2218\u2219\u221a\u221b\u0606\u221c\u0607\u221d\u221e\u221f\u2220\u2221\u2222\u2223\u2224\u2225\u2226\u2227\u2228\u2229\u222a\u222b\u222c\u222d\u2a0c\u222e\u222f\u2230\u2231\u2232\u2233\u2234\u2235\u2236\u2237\u2238\u2239\u223a\u223b\u223c\u2241\u223d\u223e\u223f\u2240\u2242\u2243\u2244\u2245\u2247\u2246\u2248\u2249\u224a\u224b\u224c\u224d\u226d\u224e\u224f\u2250\u2251\u2252\u2253\u2254\u2255\u2256\u2257\u2258\u2259\u225a\u225b\u225c\u225d\u225e\u225f\u2261\u2262\u2263\u2264\u2270\u2265\u2271\u2266\u2267\u2268\u2269\u226a\u226b\u226c\u2272\u2274\u2273\u2275\u2276\u2278\u2277\u2279\u227a\u2280\u227b\u2281\u227c\u22e0\u227d\u22e1\u227e\u227f\u2282\u2284\u2283\u2285\u2286\u2288\u2287\u2289\u228a\u228b\u228c\u228d\u228e\u228f\u2290\u2291\u22e2\u2292\u22e3\u2293\u2294\u2295\u2296\u2297\u2298\u2299\u229a\u229b\u229c\u229d\u229e\u229f\u22a0\u22a1\u22a2\u22ac\u22a3\u22a4\u22a5\u22a6\u22a7\u22a8\u22ad\u22a9\u22ae\u22aa\u22ab\u22af\u22b0\u22b1\u22b2\u22ea\u22b3\u22eb\u22b4\u22ec\u22b5\u22ed\u22b6\u22b7\u22b8\u22b9\u22ba\u22bb\u22bc\u214b\u22bd\u22be\u22bf\u22c0\u22c1\u22c2\u22c3\u22c4\u22c5\u22c6\u22c7\u22c8\u22c9\u22ca\u22cb\u22cc\u22cd\u22ce\u22cf\u22d0\u22d1\u22d2\u22d3\u22d4\u22d5\u22d6\u22d7\u22d8\u22d9\u22da\u22db\u22dc\u22dd\u22de\u22df\u22e4\u22e5\u22e6\u22e7\u22e8\u22e9\u22ee\u22ef\u22f0\u22f1\u22f2\u22f3\u22f4\u22f5\u22f6\u22f7\u22f8\u22f9\u22fa\u22fb\u22fc\u22fd\u22fe\u22ff\u2300\u2301\u2302\u2303\u2304\u2305\u2306\u2307\u230c\u230d\u230e\u230f\u2310\u2311\u2312\u2313\u2314\u2315\u2316\u2317\u2318\u2319\u231a\u231b\u231c\u231d\u231e\u231f\u2320\u2321\u2322\u2323\u2324\u2325\u2326\u2327\u2328\u232b\u232c\u232d\u232e\u232f\u2330\u2331\u2332\u2333\u2334\u2335\u2336\u2337\u2338\u2339\u233a\u233b\u233c\u233d\u233e\u233f\u2340\u2341\u2342\u2343\u2344\u2345\u2346\u2347\u2348\u2349\u234a\u234b\u234c\u234d\u234e\u234f\u2350\u2351\u2352\u2353\u2354\u2355\u2356\u2357\u2358\u2359\u235a\u235b\u235c\u235d\u235e\u235f\u2360\u2361\u2362\u2363\u2364\u2365\u2366\u2367\u2368\u2369\u236a\u236b\u236c\u236d\u236e\u236f\u2370\u2371\u2372\u2373\u2374\u2375\u2376\u2377\u2378\u2379\u237a\u237b\u237c\u237d\u237e\u237f\u2380\u2381\u2382\u2383\u2384\u2385\u2386\u2387\u2388\u2389\u238a\u238b\u238c\u238d\u238e\u238f\u2390\u2391\u2392\u2393\u2394\u2395\u2396\u2397\u2398\u2399\u239a\u239b\u239c\u239d\u239e\u239f\u23a0\u23a1\u23a2\u23a3\u23a4\u23a5\u23a6\u23a7\u23a8\u23a9\u23aa\u23ab\u23ac\u23ad\u23ae\u23af\u23b0\u23b1\u23b2\u23b3\u23b4\u23b5\u23b6\u23b7\u23b8\u23b9\u23ba\u23bb\u23bc\u23bd\u23be\u23bf\u23c0\u23c1\u23c2\u23c3\u23c4\u23c5\u23c6\u23c7\u23c8\u23c9\u23ca\u23cb\u23cc\u23cd\u23ce\u23cf\u23d0\u23d1\u23d2\u23d3\u23d4\u23d5\u23d6\u23d7\u23d8\u23d9\u23da\u23db\u23dc\u23dd\u23de\u23df\u23e0\u23e1\u23e2\u23e3\u23e4\u23e5\u23e6\u23e7\u23e8\u23e9\u23ea\u23eb\u23ec\u23ed\u23ee\u23ef\u23f0\u23f1\u23f2\u23f3\u23f4\u23f5\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u23fe\u23ff\u2400\u2401\u2402\u2403\u2404\u2405\u2406\u2407\u2408\u2409\u240a\u240b\u240c\u240d\u240e\u240f\u2410\u2411\u2412\u2413\u2414\u2415\u2416\u2417\u2418\u2419\u241a\u241b\u241c\u241d\u241e\u241f\u2420\u2421\u2422\u2423\u2424\u2425\u2426\u2440\u2441\u2442\u2443\u2444\u2445\u2446\u2447\u2448\u2449\u244a\u2500\u2501\u2502\uffe8\u2503\u2504\u2505\u2506\u2507\u2508\u2509\u250a\u250b\u250c\u250d\u250e\u250f\u2510\u2511\u2512\u2513\u2514\u2515\u2516\u2517\u2518\u2519\u251a\u251b\u251c\u251d\u251e\u251f\u2520\u2521\u2522\u2523\u2524\u2525\u2526\u2527\u2528\u2529\u252a\u252b\u252c\u252d\u252e\u252f\u2530\u2531\u2532\u2533\u2534\u2535\u2536\u2537\u2538\u2539\u253a\u253b\u253c\u253d\u253e\u253f\u2540\u2541\u2542\u2543\u2544\u2545\u2546\u2547\u2548\u2549\u254a\u254b\u254c\u254d\u254e\u254f\u2550\u2551\u2552\u2553\u2554\u2555\u2556\u2557\u2558\u2559\u255a\u255b\u255c\u255d\u255e\u255f\u2560\u2561\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569\u256a\u256b\u256c\u256d\u256e\u256f\u2570\u2571\u2572\u2573\u2574\u2575\u2576\u2577\u2578\u2579\u257a\u257b\u257c\u257d\u257e\u257f\u2580\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\u2589\u258a\u258b\u258c\u258d\u258e\u258f\u2590\u2591\u2592\u2593\u2594\u2595\u2596\u2597\u2598\u2599\u259a\u259b\u259c\u259d\u259e\u259f\u25a0\uffed\u25a1\u25a2\u25a3\u25a4\u25a5\u25a6\u25a7\u25a8\u25a9\u25aa\u25ab\u25ac\u25ad\u25ae\u25af\u25b0\u25b1\u25b2\u25b3\u25b4\u25b5\u25b6\u25b7\u25b8\u25b9\u25ba\u25bb\u25bc\u25bd\u25be\u25bf\u25c0\u25c1\u25c2\u25c3\u25c4\u25c5\u25c6\u25c7\u25c8\u25c9\u25ca\u25cb\uffee\u25cc\u25cd\u25ce\u25cf\u25d0\u25d1\u25d2\u25d3\u25d4\u25d5\u25d6\u25d7\u25d8\u25d9\u25da\u25db\u25dc\u25dd\u25de\u25df\u25e0\u25e1\u25e2\u25e3\u25e4\u25e5\u25e6\u25e7\u25e8\u25e9\u25ea\u25eb\u25ec\u25ed\u25ee\u25ef\u25f0\u25f1\u25f2\u25f3\u25f4\u25f5\u25f6\u25f7\u25f8\u25f9\u25fa\u25fb\u25fc\u25fd\u25fe\u25ff\u2600\u2601\u2602\u2603\u2604\u2605\u2606\u2607\u2608\u2609\u260a\u260b\u260c\u260d\u260e\u260f\u2610\u2611\u2612\u2613\u2614\u2615\u2616\u2617\u2618\u2619\u261a\u261b\u261c\u261d\u261e\u261f\u2620\u2621\u2622\u2623\u2624\u2625\u2626\u2627\u2628\u2629\u262a\u262b\u262c\u262d\u262e\u262f\u2638\u2639\u263a\u263b\u263c\u263d\u263e\u263f\u2640\u2641\u2642\u2643\u2644\u2645\u2646\u2647\u2648\u2649\u264a\u264b\u264c\u264d\u264e\u264f\u2650\u2651\u2652\u2653\u2654\u2655\u2656\u2657\u2658\u2659\u265a\u265b\u265c\u265d\u265e\u265f\u2660\u2661\u2662\u2663\u2664\u2665\u2666\u2667\u2668\u2669\u266a\u266b\u266c\u2670\u2671\u2672\u2673\u2674\u2675\u2676\u2677\u2678\u2679\u267a\u267b\u267c\u267d\u267e\u267f\u2680\u2681\u2682\u2683\u2684\u2685\u2686\u2687\u2688\u2689\u2690\u2691\u2692\u2693\u2694\u2695\u2696\u2697\u2698\u2699\u269a\u269b\u269c\u269d\u269e\u269f\u26a0\u26a1\u26a2\u26a3\u26a4\u26a5\u26a6\u26a7\u26a8\u26a9\u26aa\u26ab\u26ac\u26ad\u26ae\u26af\u26b0\u26b1\u26b2\u26b3\u26b4\u26b5\u26b6\u26b7\u26b8\u26b9\u26ba\u26bb\u26bc\u26bd\u26be\u26bf\u26c0\u26c1\u26c2\u26c3\u26c4\u26c5\u26c6\u26c7\u26c8\u26c9\u26ca\u26cb\u26cc\u26cd\u26ce\u26cf\u26d0\u26d1\u26d2\u26d3\u26d4\u26d5\u26d6\u26d7\u26d8\u26d9\u26da\u26db\u26dc\u26dd\u26de\u26df\u26e0\u26e1\u26e2\u26e3\u26e4\u26e5\u26e6\u26e7\u26e8\u26e9\u26ea\u26eb\u26ec\u26ed\u26ee\u26ef\u26f0\u26f1\u26f2\u26f3\u26f4\u26f5\u26f6\u26f7\u26f8\u26f9\u26fa\u26fb\u26fc\u26fd\u26fe\u26ff\u2700\u2701\u2702\u2703\u2704\u2705\u2706\u2707\u2708\u2709\u270a\u270b\u270c\u270d\u270e\u270f\u2710\u2711\u2712\u2713\u2714\u2715\u2716\u2717\u2718\u2719\u271a\u271b\u271c\u271d\u271e\u271f\u2720\u2e50\u2e51\u2721\u2722\u2723\u2724\u2725\u2726\u2727\u2728\u2729\u272a\u272b\u272c\u272d\u272e\u272f\u2730\u2731\u2732\u2733\u2734\u2735\u2736\u2737\u2738\u2739\u273a\u273b\u273c\u273d\u273e\u273f\u2740\u2741\u2742\u2743\u2744\u2745\u2746\u2747\u2748\u2749\u274a\u274b\u274c\u274d\u274e\u274f\u2750\u2751\u2752\u2753\u2754\u2755\u2756\u2757\u2758\u2759\u275a\u275b\u275c\u275d\u275e\u275f\u2760\u2761\u2762\u2763\u2764\u2765\u2766\u2767\u2794\u2795\u2796\u2797\u2798\u2799\u279a\u279b\u279c\u279d\u279e\u279f\u27a0\u27a1\u27a2\u27a3\u27a4\u27a5\u27a6\u27a7\u27a8\u27a9\u27aa\u27ab\u27ac\u27ad\u27ae\u27af\u27b0\u27b1\u27b2\u27b3\u27b4\u27b5\u27b6\u27b7\u27b8\u27b9\u27ba\u27bb\u27bc\u27bd\u27be\u27bf\u27c0\u27c1\u27c2\u27c3\u27c4\u27c7\u27c8\u27c9\u27ca\u27cb\u27cc\u27cd\u27ce\u27cf\u27d0\u27d1\u27d2\u27d3\u27d4\u27d5\u27d6\u27d7\u27d8\u27d9\u27da\u27db\u27dc\u27dd\u27de\u27df\u27e0\u27e1\u27e2\u27e3\u27e4\u27e5\u27f0\u27f1\u27f2\u27f3\u27f4\u27f5\u27f6\u27f7\u27f8\u27f9\u27fa\u27fb\u27fc\u27fd\u27fe\u27ff\u2900\u2901\u2902\u2903\u2904\u2905\u2906\u2907\u2908\u2909\u290a\u290b\u290c\u290d\u290e\u290f\u2910\u2911\u2912\u2913\u2914\u2915\u2916\u2917\u2918\u2919\u291a\u291b\u291c\u291d\u291e\u291f\u2920\u2921\u2922\u2923\u2924\u2925\u2926\u2927\u2928\u2929\u292a\u292b\u292c\u292d\u292e\u292f\u2930\u2931\u2932\u2933\u2934\u2935\u2936\u2937\u2938\u2939\u293a\u293b\u293c\u293d\u293e\u293f\u2940\u2941\u2942\u2943\u2944\u2945\u2946\u2947\u2948\u2949\u294a\u294b\u294c\u294d\u294e\u294f\u2950\u2951\u2952\u2953\u2954\u2955\u2956\u2957\u2958\u2959\u295a\u295b\u295c\u295d\u295e\u295f\u2960\u2961\u2962\u2963\u2964\u2965\u2966\u2967\u2968\u2969\u296a\u296b\u296c\u296d\u296e\u296f\u2970\u2971\u2972\u2973\u2974\u2975\u2976\u2977\u2978\u2979\u297a\u297b\u297c\u297d\u297e\u297f\u2980\u2981\u2982\u2999\u299a\u299b\u299c\u299d\u299e\u299f\u29a0\u29a1\u29a2\u29a3\u29a4\u29a5\u29a6\u29a7\u29a8\u29a9\u29aa\u29ab\u29ac\u29ad\u29ae\u29af\u29b0\u29b1\u29b2\u29b3\u29b4\u29b5\u29b6\u29b7\u29b8\u29b9\u29ba\u29bb\u29bc\u29bd\u29be\u29bf\u29c0\u29c1\u29c2\u29c3\u29c4\u29c5\u29c6\u29c7\u29c8\u29c9\u29ca\u29cb\u29cc\u29cd\u29ce\u29cf\u29d0\u29d1\u29d2\u29d3\u29d4\u29d5\u29d6\u29d7\u29dc\u29dd\u29de\u29df\u29e0\u29e1\u29e2\u29e3\u29e4\u29e5\u29e6\u29e7\u29e8\u29e9\u29ea\u29eb\u29ec\u29ed\u29ee\u29ef\u29f0\u29f1\u29f2\u29f3\u29f4\u29f5\u29f6\u29f7\u29f8\u29f9\u29fa\u29fb\u29fe\u29ff\u2a00\u2a01\u2a02\u2a03\u2a04\u2a05\u2a06\u2a07\u2a08\u2a09\u2a0a\u2a0b\u2a0d\u2a0e\u2a0f\u2a10\u2a11\u2a12\u2a13\u2a14\u2a15\u2a16\u2a17\u2a18\u2a19\u2a1a\u2a1b\u2a1c\u2a1d\u2a1e\u2a1f\u2a20\u2a21\u2a22\u2a23\u2a24\u2a25\u2a26\u2a27\u2a28\u2a29\u2a2a\u2a2b\u2a2c\u2a2d\u2a2e\u2a2f\u2a30\u2a31\u2a32\u2a33\u2a34\u2a35\u2a36\u2a37\u2a38\u2a39\u2a3a\u2a3b\u2a3c\u2a3d\u2a3e\u2a3f\u2a40\u2a41\u2a42\u2a43\u2a44\u2a45\u2a46\u2a47\u2a48\u2a49\u2a4a\u2a4b\u2a4c\u2a4d\u2a4e\u2a4f\u2a50\u2a51\u2a52\u2a53\u2a54\u2a55\u2a56\u2a57\u2a58\u2a59\u2a5a\u2a5b\u2a5c\u2a5d\u2a5e\u2a5f\u2a60\u2a61\u2a62\u2a63\u2a64\u2a65\u2a66\u2a67\u2a68\u2a69\u2a6a\u2a6b\u2a6c\u2a6d\u2a6e\u2a6f\u2a70\u2a71\u2a72\u2a73\u2a77\u2a78\u2a79\u2a7a\u2a7b\u2a7c\u2a7d\u2a7e\u2a7f\u2a80\u2a81\u2a82\u2a83\u2a84\u2a85\u2a86\u2a87\u2a88\u2a89\u2a8a\u2a8b\u2a8c\u2a8d\u2a8e\u2a8f\u2a90\u2a91\u2a92\u2a93\u2a94\u2a95\u2a96\u2a97\u2a98\u2a99\u2a9a\u2a9b\u2a9c\u2a9d\u2a9e\u2a9f\u2aa0\u2aa1\u2aa2\u2aa3\u2aa4\u2aa5\u2aa6\u2aa7\u2aa8\u2aa9\u2aaa\u2aab\u2aac\u2aad\u2aae\u2aaf\u2ab0\u2ab1\u2ab2\u2ab3\u2ab4\u2ab5\u2ab6\u2ab7\u2ab8\u2ab9\u2aba\u2abb\u2abc\u2abd\u2abe\u2abf\u2ac0\u2ac1\u2ac2\u2ac3\u2ac4\u2ac5\u2ac6\u2ac7\u2ac8\u2ac9\u2aca\u2acb\u2acc\u2acd\u2ace\u2acf\u2ad0\u2ad1\u2ad2\u2ad3\u2ad4\u2ad5\u2ad6\u2ad7\u2ad8\u2ad9\u2ada\u2adb\u2add\u2adc\u2ade\u2adf\u2ae0\u2ae1\u2ae2\u2ae3\u2ae4\u2ae5\u2ae6\u2ae7\u2ae8\u2ae9\u2aea\u2aeb\u2aec\u2aed\u2aee\u2aef\u2af0\u2af1\u2af2\u2af3\u2af4\u2af5\u2af6\u2af7\u2af8\u2af9\u2afa\u2afb\u2afc\u2afd\u2afe\u2aff\u2b00\u2b01\u2b02\u2b03\u2b04\u2b05\u2b06\u2b07\u2b08\u2b09\u2b0a\u2b0b\u2b0c\u2b0d\u2b0e\u2b0f\u2b10\u2b11\u2b12\u2b13\u2b14\u2b15\u2b16\u2b17\u2b18\u2b19\u2b1a\u2b1b\u2b1c\u2b1d\u2b1e\u2b1f\u2b20\u2b21\u2b22\u2b23\u2b24\u2b25\u2b26\u2b27\u2b28\u2b29\u2b2a\u2b2b\u2b2c\u2b2d\u2b2e\u2b2f\u2b30\u2b31\u2b32\u2b33\u2b34\u2b35\u2b36\u2b37\u2b38\u2b39\u2b3a\u2b3b\u2b3c\u2b3d\u2b3e\u2b3f\u2b40\u2b41\u2b42\u2b43\u2b44\u2b45\u2b46\u2b47\u2b48\u2b49\u2b4a\u2b4b\u2b4c\u2b4d\u2b4e\u2b4f\u2b50\u2b51\u2b52\u2b53\u2b54\u2b55\u2b56\u2b57\u2b58\u2b59\u2b5a\u2b5b\u2b5c\u2b5d\u2b5e\u2b5f\u2b60\u2b61\u2b62\u2b63\u2b64\u2b65\u2b66\u2b67\u2b68\u2b69\u2b6a\u2b6b\u2b6c\u2b6d\u2b6e\u2b6f\u2b70\u2b71\u2b72\u2b73\u2b76\u2b77\u2b78\u2b79\u2b7a\u2b7b\u2b7c\u2b7d\u2b7e\u2b7f\u2b80\u2b81\u2b82\u2b83\u2b84\u2b85\u2b86\u2b87\u2b88\u2b89\u2b8a\u2b8b\u2b8c\u2b8d\u2b8e\u2b8f\u2b90\u2b91\u2b92\u2b93\u2b94\u2b95\u2b97\u2b98\u2b99\u2b9a\u2b9b\u2b9c\u2b9d\u2b9e\u2b9f\u2ba0\u2ba1\u2ba2\u2ba3\u2ba4\u2ba5\u2ba6\u2ba7\u2ba8\u2ba9\u2baa\u2bab\u2bac\u2bad\u2bae\u2baf\u2bb0\u2bb1\u2bb2\u2bb3\u2bb4\u2bb5\u2bb6\u2bb7\u2bb8\u2bb9\u2bba\u2bbb\u2bbc\u2bbd\u2bbe\u2bbf\u2bc0\u2bc1\u2bc2\u2bc3\u2bc4\u2bc5\u2bc6\u2bc7\u2bc8\u2bc9\u2bca\u2bcb\u2bcc\u2bcd\u2bce\u2bcf\u2bd0\u2bd1\u2bd2\u2bd3\u2bd4\u2bd5\u2bd6\u2bd7\u2bd8\u2bd9\u2bda\u2bdb\u2bdc\u2bdd\u2bde\u2bdf\u2be0\u2be1\u2be2\u2be3\u2be4\u2be5\u2be6\u2be7\u2be8\u2be9\u2bea\u2beb\u2bec\u2bed\u2bee\u2bef\u2bf0\u2bf1\u2bf2\u2bf3\u2bf4\u2bf5\u2bf6\u2bf7\u2bf8\u2bf9\u2bfa\u2bfb\u2bfc\u2bfd\u2bfe\u2bff\u2ce5\u2ce6\u2ce7\u2ce8\u2ce9\u2cea\u2800\u2801\u2802\u2803\u2804\u2805\u2806\u2807\u2808\u2809\u280a\u280b\u280c\u280d\u280e\u280f\u2810\u2811\u2812\u2813\u2814\u2815\u2816\u2817\u2818\u2819\u281a\u281b\u281c\u281d\u281e\u281f\u2820\u2821\u2822\u2823\u2824\u2825\u2826\u2827\u2828\u2829\u282a\u282b\u282c\u282d\u282e\u282f\u2830\u2831\u2832\u2833\u2834\u2835\u2836\u2837\u2838\u2839\u283a\u283b\u283c\u283d\u283e\u283f\u2840\u2841\u2842\u2843\u2844\u2845\u2846\u2847\u2848\u2849\u284a\u284b\u284c\u284d\u284e\u284f\u2850\u2851\u2852\u2853\u2854\u2855\u2856\u2857\u2858\u2859\u285a\u285b\u285c\u285d\u285e\u285f\u2860\u2861\u2862\u2863\u2864\u2865\u2866\u2867\u2868\u2869\u286a\u286b\u286c\u286d\u286e\u286f\u2870\u2871\u2872\u2873\u2874\u2875\u2876\u2877\u2878\u2879\u287a\u287b\u287c\u287d\u287e\u287f\u2880\u2881\u2882\u2883\u2884\u2885\u2886\u2887\u2888\u2889\u288a\u288b\u288c\u288d\u288e\u288f\u2890\u2891\u2892\u2893\u2894\u2895\u2896\u2897\u2898\u2899\u289a\u289b\u289c\u289d\u289e\u289f\u28a0\u28a1\u28a2\u28a3\u28a4\u28a5\u28a6\u28a7\u28a8\u28a9\u28aa\u28ab\u28ac\u28ad\u28ae\u28af\u28b0\u28b1\u28b2\u28b3\u28b4\u28b5\u28b6\u28b7\u28b8\u28b9\u28ba\u28bb\u28bc\u28bd\u28be\u28bf\u28c0\u28c1\u28c2\u28c3\u28c4\u28c5\u28c6\u28c7\u28c8\u28c9\u28ca\u28cb\u28cc\u28cd\u28ce\u28cf\u28d0\u28d1\u28d2\u28d3\u28d4\u28d5\u28d6\u28d7\u28d8\u28d9\u28da\u28db\u28dc\u28dd\u28de\u28df\u28e0\u28e1\u28e2\u28e3\u28e4\u28e5\u28e6\u28e7\u28e8\u28e9\u28ea\u28eb\u28ec\u28ed\u28ee\u28ef\u28f0\u28f1\u28f2\u28f3\u28f4\u28f5\u28f6\u28f7\u28f8\u28f9\u28fa\u28fb\u28fc\u28fd\u28fe\u28ff\u268a\u268b\u268c\u268d\u268e\u268f\u2630\u2631\u2632\u2633\u2634\u2635\u2636\u2637\u4dc0\u4dc1\u4dc2\u4dc3\u4dc4\u4dc5\u4dc6\u4dc7\u4dc8\u4dc9\u4dca\u4dcb\u4dcc\u4dcd\u4dce\u4dcf\u4dd0\u4dd1\u4dd2\u4dd3\u4dd4\u4dd5\u4dd6\u4dd7\u4dd8\u4dd9\u4dda\u4ddb\u4ddc\u4ddd\u4dde\u4ddf\u4de0\u4de1\u4de2\u4de3\u4de4\u4de5\u4de6\u4de7\u4de8\u4de9\u4dea\u4deb\u4dec\u4ded\u4dee\u4def\u4df0\u4df1\u4df2\u4df3\u4df4\u4df5\u4df6\u4df7\u4df8\u4df9\u4dfa\u4dfb\u4dfc\u4dfd\u4dfe\u4dff\ua490\ua491\ua492\ua493\ua494\ua495\ua496\ua497\ua498\ua499\ua49a\ua49b\ua49c\ua49d\ua49e\ua49f\ua4a0\ua4a1\ua4a2\ua4a3\ua4a4\ua4a5\ua4a6\ua4a7\ua4a8\ua4a9\ua4aa\ua4ab\ua4ac\ua4ad\ua4ae\ua4af\ua4b0\ua4b1\ua4b2\ua4b3\ua4b4\ua4b5\ua4b6\ua4b7\ua4b8\ua4b9\ua4ba\ua4bb\ua4bc\ua4bd\ua4be\ua4bf\ua4c0\ua4c1\ua4c2\ua4c3\ua4c4\ua4c5\ua4c6\u266d\u266e\u266f\u2ff0\u2ff1\u2ff2\u2ff3\u2ff4\u2ff5\u2ff6\u2ff7\u2ff8\u2ff9\u2ffa\u2ffb\u31c0\u31c1\u31c2\u31c3\u31c4\u31c5\u31c6\u31c7\u31c8\u31c9\u31ca\u31cb\u31cc\u31cd\u31ce\u31cf\u31d0\u31d1\u31d2\u31d3\u31d4\u31d5\u31d6\u31d7\u31d8\u31d9\u31da\u31db\u31dc\u31dd\u31de\u31df\u31e0\u31e1\u31e2\u31e3\u3004\u3012\u3036\u3013\u3020\u3037\u303e\u303f\u3190\u3191\u327f\ufffc\u09f4\u09f5\u09f6\u09f7\u09f8\u09f9\u0b72\u0b73\u0b74\u0b75\u0b76\u0b77\ua830\ua831\ua832\ua833\ua834\ua835\u0bf0\u0bf1\u0bf2\u0d58\u0d59\u0d5a\u0d5b\u0d5c\u0d5d\u0d5e\u0d70\u0d71\u0d72\u0d73\u0d74\u0d75\u0d76\u0d77\u0d78\u1372\u1373\u1374\u1375\u1376\u1377\u1378\u1379\u137a\u137b\u137c\u2180\u2181\u2182\u2186\u2187\u2188\u2cfd\u02d0\u02d1\u0971\u0e46\u0ec6\u17d7\u1aa7\ua9cf\ua9e6\uaa70\uaadd\uaaf3\uaaf4\u3005\u303b\u3031\u3032\u3033\u3034\u3035\u309d\u309e\u30fc\uff70\u30fd\u30fe\u00a4\u00a2\uffe0\$\uff04\ufe69\u00a3\uffe1\u00a5\uffe5\u058f\u060b\u07fe\u07ff\u09f2\u09f3\u09fb\u0af1\ua838\u0bf9\u0e3f\u17db\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5\u20a6\u20a7\u20a9\uffe6\u20aa\u20ab\u20ac\u20ad\u20ae\u20af\u20b0\u20b1\u20b2\u20b3\u20b4\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb\u20bc\u20bd\u20be\u20bf\u0030\u0660\u06f0\u07c0\u0966\u09e6\u0a66\u0ae6\u0b66\u0be6\u0c66\u0c78\u0ce6\u0d66\u0de6\u0e50\u0ed0\u0f20\u1040\u1090\u17e0\u17f0\u1810\u1946\u19d0\u1a80\u1a90\u1b50\u1bb0\u1c40\u1c50\u3007\ua620\ua8d0\ua900\ua9d0\ua9f0\uaa50\uabf0\uff10\u0f33\u24ea\u24ff\u2070\u2080\u2189\u3358\u0031\u0661\u06f1\u07c1\u0967\u09e7\u0a67\u0ae7\u0b67\u0be7\u0c67\u0c79\u0c7c\u0ce7\u0d67\u0de7\u0e51\u0ed1\u0f21\u1041\u1091\u1369\u17e1\u17f1\u1811\u1947\u19d1\u19da\u1a81\u1a91\u1b51\u1bb1\u1c41\u1c51\u3021\ua621\ua8d1\ua901\ua9d1\ua9f1\uaa51\uabf1\uff11\u0f2a\u2460\u24f5\u2776\u2780\u278a\u00b9\u2081\u2488\u215f\u2152\u00bd\u2153\u00bc\u2155\u2159\u2150\u215b\u2151\u2469\u24fe\u277f\u2789\u2793\u3248\u2491\u33e9\u32c9\u3362\u246a\u24eb\u2492\u33ea\u32ca\u3363\u246b\u24ec\u2493\u33eb\u32cb\u3364\u246c\u24ed\u2494\u33ec\u3365\u246d\u24ee\u2495\u33ed\u3366\u246e\u24ef\u2496\u33ee\u3367\u246f\u24f0\u2497\u33ef\u3368\u2470\u24f1\u2498\u33f0\u3369\u2471\u24f2\u2499\u33f1\u336a\u2472\u24f3\u249a\u33f2\u336b\u33e0\u32c0\u3359\u0032\u0662\u06f2\u07c2\u0968\u09e8\u0a68\u0ae8\u0b68\u0be8\u0c68\u0c7a\u0c7d\u0ce8\u0d68\u0de8\u0e52\u0ed2\u0f22\u1042\u1092\u136a\u17e2\u17f2\u1812\u1948\u19d2\u1a82\u1a92\u1b52\u1bb2\u1c42\u1c52\u3022\ua622\ua8d2\ua902\ua9d2\ua9f2\uaa52\uabf2\uff12\u0f2b\u2461\u24f6\u2777\u2781\u278b\u00b2\u2082\u2489\u2154\u2156\u2473\u24f4\u3249\u249b\u33f3\u336c\u3251\u33f4\u336d\u3252\u33f5\u336e\u3253\u33f6\u336f\u3254\u33f7\u3370\u3255\u33f8\u3256\u33f9\u3257\u33fa\u3258\u33fb\u3259\u33fc\u33e1\u32c1\u335a\u0033\u0663\u06f3\u07c3\u0969\u09e9\u0a69\u0ae9\u0b69\u0be9\u0c69\u0c7b\u0c7e\u0ce9\u0d69\u0de9\u0e53\u0ed3\u0f23\u1043\u1093\u136b\u17e3\u17f3\u1813\u1949\u19d3\u1a83\u1a93\u1b53\u1bb3\u1c43\u1c53\u3023\ua623\ua8d3\ua903\ua9d3\ua9f3\uaa53\uabf3\uff13\u0f2c\u2462\u24f7\u2778\u2782\u278c\u00b3\u2083\u248a\u00be\u2157\u215c\u324a\u325a\u33fd\u325b\u33fe\u325c\u325d\u325e\u325f\u32b1\u32b2\u32b3\u32b4\u33e2\u32c2\u335b\u0034\u0664\u06f4\u07c4\u096a\u09ea\u0a6a\u0aea\u0b6a\u0bea\u0c6a\u0cea\u0d6a\u0dea\u0e54\u0ed4\u0f24\u1044\u1094\u136c\u17e4\u17f4\u1814\u194a\u19d4\u1a84\u1a94\u1b54\u1bb4\u1c44\u1c54\u3024\ua624\ua8d4\ua904\ua9d4\ua9f4\uaa54\uabf4\uff14\u0f2d\u2463\u24f8\u2779\u2783\u278d\u2074\u2084\u248b\u2158\u324b\u32b5\u32b6\u32b7\u32b8\u32b9\u32ba\u32bb\u32bc\u32bd\u32be\u33e3\u32c3\u335c\u0035\u0665\u06f5\u07c5\u096b\u09eb\u0a6b\u0aeb\u0b6b\u0beb\u0c6b\u0ceb\u0d6b\u0deb\u0e55\u0ed5\u0f25\u1045\u1095\u136d\u17e5\u17f5\u1815\u194b\u19d5\u1a85\u1a95\u1b55\u1bb5\u1c45\u1c55\u3025\ua625\ua8d5\ua905\ua9d5\ua9f5\uaa55\uabf5\uff15\u0f2e\u2464\u24f9\u277a\u2784\u278e\u2075\u2085\u248c\u215a\u215d\u324c\u32bf\u33e4\u32c4\u335d\u0036\u0666\u06f6\u07c6\u096c\u09ec\u0a6c\u0aec\u0b6c\u0bec\u0c6c\u0cec\u0d6c\u0dec\u0e56\u0ed6\u0f26\u1046\u1096\u136e\u17e6\u17f6\u1816\u194c\u19d6\u1a86\u1a96\u1b56\u1bb6\u1c46\u1c56\u2185\u3026\ua626\ua8d6\ua906\ua9d6\ua9f6\uaa56\uabf6\uff16\u0f2f\u2465\u24fa\u277b\u2785\u278f\u2076\u2086\u248d\u324d\u33e5\u32c5\u335e\u0037\u0667\u06f7\u07c7\u096d\u09ed\u0a6d\u0aed\u0b6d\u0bed\u0c6d\u0ced\u0d6d\u0ded\u0e57\u0ed7\u0f27\u1047\u1097\u136f\u17e7\u17f7\u1817\u194d\u19d7\u1a87\u1a97\u1b57\u1bb7\u1c47\u1c57\u3027\ua627\ua8d7\ua907\ua9d7\ua9f7\uaa57\uabf7\uff17\u0f30\u2466\u24fb\u277c\u2786\u2790\u2077\u2087\u248e\u215e\u324e\u33e6\u32c6\u335f\u0038\u0668\u06f8\u07c8\u096e\u09ee\u0a6e\u0aee\u0b6e\u0bee\u0c6e\u0cee\u0d6e\u0dee\u0e58\u0ed8\u0f28\u1048\u1098\u1370\u17e8\u17f8\u1818\u194e\u19d8\u1a88\u1a98\u1b58\u1bb8\u1c48\u1c58\u3028\ua628\ua8d8\ua908\ua9d8\ua9f8\uaa58\uabf8\uff18\u0f31\u2467\u24fc\u277d\u2787\u2791\u2078\u2088\u248f\u324f\u33e7\u32c7\u3360\u0039\u0669\u06f9\u07c9\u096f\u09ef\u0a6f\u0aef\u0b6f\u0bef\u0c6f\u0cef\u0d6f\u0def\u0e59\u0ed9\u0f29\u1049\u1099\u1371\u17e9\u17f9\u1819\u194f\u19d9\u1a89\u1a99\u1b59\u1bb9\u1c49\u1c59\u3029\ua629\ua8d9\ua909\ua9d9\ua9f9\uaa59\uabf9\uff19\u0f32\u2468\u24fd\u277e\u2788\u2792\u2079\u2089\u2490\u33e8\u32c8\u3361\u0061\uff41\u0363\u24d0\u0041\uff21\u24b6\u00aa\u1d43\u2090\u1d2c\u00e1\u00c1\u00e0\u00c0\u0103\u0102\u00e2\u00c2\u01ce\u01cd\u00e5\u00c5\u212b\u00e4\u1df2\ua79b\u00c4\ua79a\u00e3\u00c3\u0227\u0226\u0105\u0104\u0101\u0100\u1ea3\u1ea2\u0201\u0200\u0203\u0202\u1ea1\u1ea0\u1e01\u1e00\u1dd3\u1eaf\u1eae\u1eb1\u1eb0\u1eb5\u1eb4\u1eb3\u1eb2\u1ea5\u1ea4\u1ea7\u1ea6\u1eab\u1eaa\u1ea9\u1ea8\u01fb\u01fa\u01df\u01de\u01e1\u01e0\u1eb7\u1eb6\u1ead\u1eac\u00e6\u1dd4\u00c6\u1d2d\u01fd\u01fc\u01e3\u01e2\ua73b\ua73a\u33c2\u2100\u2101\u214d\u33df\ua733\ua732\u1dd5\ua735\ua734\ua737\ua736\u3373\u1dd6\ua739\ua738\ua73d\ua73c\u1e9a\u1d00\u2c65\u023a\u1d8f\ua7bb\ua7ba\u1d01\u1d02\u1d46\uab31\u0250\u2c6f\u1d44\u0251\u1de7\u2c6d\u1d45\uab30\u1d90\u0252\u2c70\u1d9b\uab64\u0062\uff42\u1de8\u24d1\u0042\uff22\u212c\u24b7\u1d47\u1d2e\u1e03\u1e02\u1e05\u1e04\u1e07\u1e06\u3374\u33c3\u0299\u0180\u0243\u1d2f\u1d03\u1d6c\ua797\ua796\u1d80\u0253\u0181\u0183\u0182\ua7b5\u1de9\ua7b4\u0063\uff43\u0368\u217d\u24d2\u0043\uff23\u216d\u2102\u212d\u24b8\u1d9c\u0107\u0106\u0109\u0108\u010d\u010c\u010b\u010a\u00e7\u1dd7\u00c7\u1e09\u1e08\u2105\u2106\u33c6\u3388\u33c4\u33c5\u339d\u33a0\u33a4\u33c7\u1d04\u023c\u023b\ua793\ua792\ua794\ua7c4\u0188\u0187\u0255\u1d9d\u2184\u2183\ua73f\ua73e\u0064\uff44\u0369\u217e\u2146\u24d3\u0044\uff24\u216e\u2145\u24b9\u1d48\u1d30\u010f\u010e\u1e0b\u1e0a\u1e11\u1e10\u0111\u0110\u1e0d\u1e0c\u1e13\u1e12\u1e0f\u1e0e\u00f0\u1dd9\u00d0\u1d9e\u1dd8\ua77a\ua779\u3372\u0238\u33c8\u3397\u3377\u3378\u3379\u01f3\u02a3\u01f2\u01f1\u01c6\u01c5\u01c4\uab66\u02a5\u02a4\u1d05\u1d06\ua7c8\ua7c7\u1d6d\u1d81\u0256\u0189\u0257\u018a\u1d91\u018c\u018b\u0221\ua771\u1e9f\u0065\uff45\u0364\u212f\u2147\u24d4\u0045\uff25\u2130\u24ba\u1d49\u2091\u1d31\u00e9\u00c9\u00e8\u00c8\u0115\u0114\u00ea\u00ca\u011b\u011a\u00eb\u00cb\u1ebd\u1ebc\u0117\u0116\u0229\u0228\u0119\u0118\u0113\u0112\u1ebb\u1eba\u0205\u0204\u0207\u0206\u1eb9\u1eb8\u1e19\u1e18\u1e1b\u1e1a\u1ebf\u1ebe\u1ec1\u1ec0\u1ec5\u1ec4\u1ec3\u1ec2\u1e1d\u1e1c\u1e17\u1e16\u1e15\u1e14\u1ec7\u1ec6\u32cd\u32ce\u1d07\uab32\uab33\u0247\u0246\u1d92\uab34\u2c78\u01dd\u018e\u1d32\u2c7b\u0259\u1dea\u018f\u1d4a\u2094\u1d95\u025b\u0190\u2107\u1d4b\u1d93\u0258\u025a\u025c\ua7ab\u1d9f\u1d94\u1d08\u1d4c\u025d\u025e\u029a\u0264\u0066\uff46\u1deb\u24d5\u0046\uff26\u2131\u24bb\u1da0\u1e1f\u1e1e\ua77c\ua77b\u213b\ufb00\ufb03\ufb04\ufb01\ufb02\u3399\u02a9\ua730\uab35\ua799\ua798\u1d6e\u1d82\u0192\u0191\u214e\u2132\ua7fb\u0067\uff47\u1dda\u210a\u24d6\u0047\uff27\u24bc\u1d4d\u1d33\u01f5\u01f4\u011f\u011e\u011d\u011c\u01e7\u01e6\u0121\u0120\u0123\u0122\u1e21\u1e20\ua7a1\ua7a0\u1d79\ua77d\u33ff\u3387\u3393\u33ac\u33c9\u0261\ua7ac\u1da2\uab36\u0262\u1ddb\u01e5\u01e4\u1d83\u0260\u0193\u029b\u1d77\ua77f\ua77e\u0263\u0194\u02e0\u01a3\u01a2\u0068\uff48\u036a\u210e\u24d7\u0048\uff28\u210b\u210c\u210d\u24bd\u02b0\u2095\u1d34\u0125\u0124\u021f\u021e\u1e27\u1e26\u1e23\u1e22\u1e29\u1e28\u0127\u210f\u0126\ua7f8\u1e25\u1e24\u1e2b\u1e2a\u1e96\u33ca\u32cc\u33cb\u3371\u3390\u029c\u0195\u01f6\ua795\u0266\ua7aa\u02b1\u2c68\u2c67\u2c76\u2c75\ua7f6\ua7f5\ua727\ua726\uab5c\u0267\u02bb\u02bd\u0069\uff49\u0365\u2170\u2139\u2148\u24d8\u0049\uff29\u2160\u2110\u2111\u24be\u2071\u1d62\u1d35\u00ed\u00cd\u00ec\u00cc\u012d\u012c\u00ee\u00ce\u01d0\u01cf\u00ef\u00cf\u0129\u0128\u0130\u012f\u012e\u012b\u012a\u1ec9\u1ec8\u0209\u0208\u020b\u020a\u1ecb\u1eca\u1e2d\u1e2c\u1e2f\u1e2e\u2171\u2161\u2172\u2162\u0133\u0132\u33cc\u337a\u2173\u2163\u2178\u2168\u0131\u026a\ua7ae\u1da6\ua7fe\ua7f7\u1d09\u1d4e\u0268\u0197\u1da4\u1d7b\u1da7\u1d96\ua7bd\ua7bc\u0269\u0196\u1da5\u1d7c\u006a\uff4a\u2149\u24d9\u004a\uff2a\u24bf\u02b2\u2c7c\u1d36\u0135\u0134\u01f0\u0237\u1d0a\u0249\u0248\u029d\ua7b2\u1da8\u025f\u1da1\u0284\u006b\uff4b\u1ddc\u24da\u004b\u212a\uff2b\u24c0\u1d4f\u2096\u1d37\u1e31\u1e30\u01e9\u01e8\u0137\u0136\ua7a3\ua7a2\u1e33\u1e32\u1e35\u1e34\u3384\u3385\u3389\u338f\u3391\u33cd\u3398\u339e\u33ce\u33a2\u33a6\u33aa\u33cf\u33b8\u33be\u33c0\u1d0b\u1d84\u0199\u0198\u2c6a\u2c69\ua741\ua740\ua743\ua742\ua745\ua744\u029e\ua7b0\u006c\uff4c\u1ddd\u217c\u2113\u24db\u004c\uff2c\u216c\u2112\u24c1\u02e1\u2097\u1d38\u013a\u0139\u013e\u013d\u013c\u013b\u0142\u0141\u1e37\u1e36\u1e3d\u1e3c\u1e3b\u1e3a\u0140\u013f\u1e39\u1e38\u01c9\u01c8\u01c7\u1efb\u1efa\u33d0\u33d1\u33d2\u02aa\u32cf\u33d3\u02ab\u029f\u1dde\u1dab\ua747\ua746\u1d0c\ua749\ua748\u019a\u023d\u2c61\u2c60\u026b\u2c62\uab5e\uab38\u1dec\uab39\u026c\ua7ad\uab37\uab5d\u1d85\u1daa\u026d\u1da9\ua78e\u0234\ua772\u026e\ua781\ua780\u019b\u028e\u006d\uff4d\u036b\u217f\u24dc\u004d\uff2d\u216f\u2133\u24c2\u1d50\u2098\u1d39\u1e3f\u1e3e\u1e41\u1e40\u1e43\u1e42\u33a7\u33a8\u33a1\u33a5\u3383\u33d4\u3386\u338e\u3392\u33d5\u3396\u339c\u339f\u33a3\u33d6\u33ab\u33b3\u33b7\u33b9\u33bd\u33bf\u33c1\u1d0d\u1ddf\u1d6f\u1d86\u0271\u2c6e\u1dac\uab3a\ua7fd\ua7ff\ua773\u006e\uff4e\u1de0\u24dd\u004e\uff2e\u2115\u24c3\u207f\u2099\u1d3a\u0144\u0143\u01f9\u01f8\u0148\u0147\u00f1\u00d1\u1e45\u1e44\u0146\u0145\ua7a5\ua7a4\u1e47\u1e46\u1e4b\u1e4a\u1e49\u1e48\u3381\u338b\u01cc\u01cb\u01ca\u339a\u2116\u33b1\u33b5\u33bb\u0274\u1de1\u1db0\u1d3b\u1d0e\u1d70\u0272\u019d\u1dae\u019e\u0220\ua791\ua790\u1d87\u0273\u1daf\u0235\uab3b\ua774\u014b\u014a\u1d51\uab3c\u006f\uff4f\u0366\u2134\u24de\u004f\uff2f\u24c4\u00ba\u1d52\u2092\u1d3c\u00f3\u00d3\u00f2\u00d2\u014f\u014e\u00f4\u00d4\u01d2\u01d1\u00f6\u1df3\ua79d\u00d6\ua79c\u0151\u0150\u00f5\u00d5\u022f\u022e\u00f8\u00d8\u01eb\u01ea\u014d\u014c\u1ded\u1ecf\u1ece\u020d\u020c\u020f\u020e\u01a1\u01a0\u1ecd\u1ecc\u1ed1\u1ed0\u1ed3\u1ed2\u1ed7\u1ed6\u1ed5\u1ed4\u022b\u022a\u1e4d\u1e4c\u1e4f\u1e4e\u022d\u022c\u0231\u0230\u01ff\u01fe\u01ed\u01ec\u1e53\u1e52\u1e51\u1e50\u1edb\u1eda\u1edd\u1edc\u1ee1\u1ee0\u1edf\u1ede\u1ee3\u1ee2\u1ed9\u1ed8\u0153\u0152\ua7f9\ua74f\ua74e\u3375\u1d0f\u1d11\uab3d\u0276\u1d14\uab41\uab42\uab40\uab43\uab44\u1d13\uab3e\u0254\u0186\u1d53\u1d10\u1d12\uab3f\u1d97\uab62\ua74d\ua74c\u1d16\u1d54\u1d17\u1d55\u2c7a\u0275\u019f\u1db1\ua74b\ua74a\u0277\ua7b7\ua7b6\u0223\u0222\u1d3d\u1d15\u0070\uff50\u1dee\u24df\u0050\uff30\u2119\u24c5\u1d56\u209a\u1d3e\u1e55\u1e54\u1e57\u1e56\u33d8\u3380\u33a9\u3376\u338a\u33d7\u33d9\u33da\u33b0\u3250\u33b4\u33ba\u1d18\u1d7d\u2c63\ua751\ua750\u1d71\u1d88\u01a5\u01a4\ua753\ua752\ua755\ua754\ua7fc\u0278\u1db2\u2c77\u0071\uff51\u24e0\u0051\uff31\u211a\u24c6\u0239\ua7af\ua757\ua756\ua759\ua758\u02a0\u024b\u024a\u0138\u0072\uff52\u036c\u1dca\u24e1\u0052\uff32\u211b\u211c\u211d\u24c7\u02b3\u1d63\u1d3f\u0155\u0154\u0159\u0158\u1e59\u1e58\u0157\u0156\ua7a7\ua7a6\u0211\u0210\u0213\u0212\u1e5b\u1e5a\u1e5f\u1e5e\ua783\ua782\u1e5d\u1e5c\u33ad\u33ae\u33af\u20a8\uab45\u0280\u1de2\u01a6\uab46\ua75b\u1de3\ua75a\u1d19\u024d\u024c\u1d72\u0279\u02b4\u1d1a\u027a\u1d89\u027b\u02b5\u2c79\u027c\u027d\u2c64\uab49\u027e\u1d73\u027f\uab47\uab48\uab4a\uab4b\uab4c\u0281\u02b6\uab68\ua775\ua776\ua75d\ua75c\u0073\uff53\u1de4\u24e2\u0053\uff33\u24c8\u02e2\u209b\u015b\u015a\u015d\u015c\u0161\u0160\u1e61\u1e60\u015f\u015e\ua7a9\ua7a8\u1e63\u1e62\u0219\u0218\u017f\u1de5\ua785\ua784\u1e65\u1e64\u1e67\u1e66\u1e69\u1e68\u1e9b\u00df\u1e9e\ufb05\u2120\u33db\ufb06\u33dc\ua731\ua7ca\ua7c9\u1d74\u1d8a\u0282\ua7c5\u1db3\u023f\u2c7e\u1e9c\u1e9d\u0283\u1def\u01a9\u1db4\uab4d\u1d8b\u01aa\u0285\u1d98\u0286\u0074\uff54\u036d\u24e3\u0054\uff34\u24c9\u1d57\u209c\u1d40\u0165\u0164\u1e97\u1e6b\u1e6a\u0163\u0162\u1e6d\u1e6c\u021b\u021a\u1e71\u1e70\u1e6f\u1e6e\ua787\ua786\u1d7a\u02a8\u2121\u3394\u2122\u01be\u02a6\uab67\u02a7\ua729\ua728\u1d1b\u0167\u0166\u2c66\u023e\u1d75\u01ab\u1db5\u01ad\u01ac\u0288\u01ae\u0236\ua777\u0287\ua7b1\u0075\uff55\u0367\u24e4\u0055\uff35\u24ca\u1d58\u1d64\u1d41\u00fa\u00da\u00f9\u00d9\u016d\u016c\u00fb\u00db\u01d4\u01d3\u016f\u016e\u00fc\u1df4\ua79f\u00dc\ua79e\u0171\u0170\u0169\u0168\u0173\u0172\u016b\u016a\u1df0\u1ee7\u1ee6\u0215\u0214\u0217\u0216\u01b0\u01af\u1ee5\u1ee4\u1e73\u1e72\u1e77\u1e76\u1e75\u1e74\u01d8\u01d7\u01dc\u01db\u01da\u01d9\u01d6\u01d5\u1e79\u1e78\u1e7b\u1e7a\u1ee9\u1ee8\u1eeb\u1eea\u1eef\u1eee\u1eed\u1eec\u1ef1\u1ef0\u1d1c\u1db8\uab4e\u1d1d\u1d59\u1d1e\u1d6b\uab50\uab51\u0289\u0244\u1db6\uab4f\ua7b9\ua7b8\u1d7e\u1d99\uab52\uab5f\ua7bf\ua7be\u0265\ua78d\u1da3\u02ae\u02af\u026f\u019c\u1d5a\ua7fa\u1d1f\u0270\u1dad\u028a\u01b1\u1db7\u1d7f\u0076\uff56\u036e\u2174\u24e5\u0056\uff36\u2164\u24cb\u1d5b\u1d65\u2c7d\u1e7d\u1e7c\u1e7f\u1e7e\u33de\u2175\u2165\u2176\u2166\u2177\u2167\ua761\ua760\u1d20\ua75f\ua75e\u1d8c\u028b\u01b2\u1db9\u2c71\u2c74\u1efd\u1efc\u028c\u0245\u1dba\u0077\uff57\u1abf\u1df1\u24e6\u0057\uff37\u24cc\u02b7\u1d42\u1e83\u1e82\u1e81\u1e80\u0175\u0174\u1e98\u1e85\u1e84\u1e87\u1e86\u1e89\u1e88\u33dd\u1d21\ua7c3\ua7c2\u2c73\u2c72\u028d\u1ac0\uab69\u0078\uff58\u036f\u2179\u24e7\u0058\uff38\u2169\u24cd\u02e3\u2093\u1e8d\u1e8c\u1e8b\u1e8a\u217a\u216a\u217b\u216b\u1d8d\uab56\uab57\uab58\uab59\uab53\ua7b3\uab54\uab55\u0079\uff59\u24e8\u0059\uff39\u24ce\u02b8\u00fd\u00dd\u1ef3\u1ef2\u0177\u0176\u1e99\u00ff\u0178\u1ef9\u1ef8\u1e8f\u1e8e\u0233\u0232\u1ef7\u1ef6\u1ef5\u1ef4\u028f\u024f\u024e\u01b4\u01b3\u1eff\u1efe\uab5a\u021d\u021c\u007a\uff5a\u1de6\u24e9\u005a\uff3a\u2124\u2128\u24cf\u1dbb\u017a\u0179\u1e91\u1e90\u017e\u017d\u017c\u017b\u1e93\u1e92\u1e95\u1e94\u018d\u1d22\u01b6\u01b5\u1d76\u1d8e\ua7c6\u0225\u0224\u0290\u1dbc\u0291\u1dbd\u0240\u2c7f\u2c6c\u2c6b\ua763\ua762\u0292\u01b7\u1dbe\u01ef\u01ee\u1d23\u01b9\u01b8\u1d9a\u01ba\u0293\u00fe\u00de\ua765\ua764\ua767\ua766\u01bf\u01f7\ua769\ua768\uab60\uab61\uab63\ua76b\ua76a\ua76d\ua76c\ua76f\u1dd2\ua76e\ua770\ua778\u01bb\ua72b\ua72a\ua72d\ua72c\ua72f\ua72e\u01a8\u01a7\u01bd\u01bc\u0185\u0184\u0294\u0242\u0241\u02c0\u02bc\u0149\u02ee\u02be\ua723\ua722\ua78c\ua78b\ua78f\u0295\u02e4\u02bf\u02c1\u1d24\u1d25\u1d5c\ua725\ua724\u02a1\u02a2\u0296\u01c0\u01c1\u01c2\u01c3\u0297\u0298\u02ac\u02ad\u03b1\u0391\u1f00\u1f08\u1f01\u1f09\u03ac\u1f71\u0386\u1fbb\u1f70\u1fba\u1fb0\u1fb8\u1fb6\u1fb1\u1fb9\u1fb3\u1fbc\u1f04\u1f0c\u1f02\u1f0a\u1f06\u1f0e\u1f80\u1f88\u1f05\u1f0d\u1f03\u1f0b\u1f07\u1f0f\u1f81\u1f89\u1fb4\u1fb2\u1fb7\u1f84\u1f8c\u1f82\u1f8a\u1f86\u1f8e\u1f85\u1f8d\u1f83\u1f8b\u1f87\u1f8f\u03b2\u03d0\u0392\u1d5d\u1d66\u03b3\u213d\u0393\u213e\u1d5e\u1d67\u1d26\u03b4\u0394\u1d5f\u03b5\u03f5\u0395\u1f10\u1f18\u1f11\u1f19\u03ad\u1f73\u0388\u1fc9\u1f72\u1fc8\u1f14\u1f1c\u1f12\u1f1a\u1f15\u1f1d\u1f13\u1f1b\u03dd\u03dc\u0377\u0376\u03db\u03da\u03b6\u0396\u0371\u0370\u03b7\u0397\u1f20\u1f28\u1f21\u1f29\u03ae\u1f75\u0389\u1fcb\u1f74\u1fca\u1fc6\u1fc3\u1fcc\u1f24\u1f2c\u1f22\u1f2a\u1f26\u1f2e\u1f90\u1f98\u1f25\u1f2d\u1f23\u1f2b\u1f27\u1f2f\u1f91\u1f99\u1fc4\u1fc2\u1fc7\u1f94\u1f9c\u1f92\u1f9a\u1f96\u1f9e\u1f95\u1f9d\u1f93\u1f9b\u1f97\u1f9f\u03b8\u03d1\u0398\u03f4\u1dbf\u03b9\u1fbe\u037a\u0399\u1f30\u1f38\u1f31\u1f39\u03af\u1f77\u038a\u1fdb\u1f76\u1fda\u1fd0\u1fd8\u1fd6\u03ca\u03aa\u1fd1\u1fd9\u1f34\u1f3c\u1f32\u1f3a\u1f36\u1f3e\u1f35\u1f3d\u1f33\u1f3b\u1f37\u1f3f\u0390\u1fd3\u1fd2\u1fd7\u03f3\u037f\u03ba\u03f0\u039a\u03d7\u03cf\u03bb\u039b\u1d27\u03bc\u00b5\u039c\u3382\u338c\u338d\u3395\u339b\u33b2\u33b6\u33bc\u03bd\u039d\u03be\u039e\u03bf\u039f\u1f40\u1f48\u1f41\u1f49\u03cc\u1f79\u038c\u1ff9\u1f78\u1ff8\u1f44\u1f4c\u1f42\u1f4a\u1f45\u1f4d\u1f43\u1f4b\u03c0\u03d6\u213c\u03a0\u213f\u1d28\u03fb\u03fa\u03df\u03de\u03d9\u03d8\u03c1\u03f1\u03a1\u1d68\u1fe4\u1fe5\u1fec\u1d29\u03fc\u03c3\u03f2\u03a3\u03f9\u03c2\u037c\u03fe\u037b\u03fd\u037d\u03ff\u03c4\u03a4\u03c5\u03a5\u03d2\u1f50\u1f51\u1f59\u03cd\u1f7b\u038e\u1feb\u03d3\u1f7a\u1fea\u1fe0\u1fe8\u1fe6\u03cb\u03ab\u03d4\u1fe1\u1fe9\u1f54\u1f52\u1f56\u1f55\u1f5d\u1f53\u1f5b\u1f57\u1f5f\u03b0\u1fe3\u1fe2\u1fe7\u03c6\u03d5\u03a6\u1d60\u1d69\u03c7\u03a7\u1d61\u1d6a\u03c8\u03a8\u1d2a\u03c9\u03a9\u2126\u1f60\u1f68\u1f61\u1f69\u03ce\u1f7d\u038f\u1ffb\u1f7c\u1ffa\u1ff6\u1ff3\u1ffc\u1f64\u1f6c\u1f62\u1f6a\u1f66\u1f6e\u1fa0\u1fa8\u1f65\u1f6d\u1f63\u1f6b\u1f67\u1f6f\u1fa1\u1fa9\u1ff4\u1ff2\u1ff7\u1fa4\u1fac\u1fa2\u1faa\u1fa6\u1fae\u1fa5\u1fad\u1fa3\u1fab\u1fa7\u1faf\uab65\u03e1\u03e0\u0373\u0372\u03f8\u03f7\u2c81\u2c80\u2c83\u2c82\u2c85\u2c84\u2c87\u2c86\u2c89\u2c88\u2cb7\u2cb6\u2c8b\u2c8a\u2c8d\u2c8c\u2c8f\u2c8e\u2c91\u2c90\u2c93\u2c92\u2c95\u2c94\u2ce4\u2cb9\u2cb8\u2c97\u2c96\u2c99\u2c98\u2c9b\u2c9a\u2cbb\u2cba\u2cbd\u2cbc\u2c9d\u2c9c\u2c9f\u2c9e\u2ca1\u2ca0\u2ca3\u2ca2\u2ca5\u2ca4\u2ca7\u2ca6\u2ca9\u2ca8\u2cab\u2caa\u2cad\u2cac\u2caf\u2cae\u2cb1\u2cb0\u2cbf\u2cbe\u2cc1\u2cc0\u03e3\u03e2\u2cec\u2ceb\u2cc3\u2cc2\u2cc5\u2cc4\u2cc7\u2cc6\u03e5\u03e4\u03e7\u03e6\u2cf3\u2cf2\u2cc9\u2cc8\u03e9\u03e8\u2ccb\u2cca\u2ccd\u2ccc\u2ccf\u2cce\u2cd1\u2cd0\u2cd3\u2cd2\u2cd5\u2cd4\u03eb\u03ea\u2cee\u2ced\u2cd7\u2cd6\u03ed\u03ec\u2cd9\u2cd8\u2cdb\u2cda\u2cdd\u2cdc\u03ef\u03ee\u2cb3\u2cb2\u2cb5\u2cb4\u2cdf\u2cde\u2ce1\u2ce0\u2ce3\u2ce2\u0430\u2df6\u0410\u04d1\u04d0\u04d3\u04d2\u04d9\u04d8\u04db\u04da\u04d5\u04d4\u0431\u2de0\u0411\u0432\u1c80\u2de1\u0412\u0433\u2de2\u0413\u0453\u0403\u0491\u0490\u0493\u0492\u04fb\u04fa\u0495\u0494\u04f7\u04f6\u0434\u1c81\u2de3\u0414\u0501\u0500\ua681\ua680\u0452\u0402\ua663\ua662\u0503\u0502\u0499\u0498\u0435\u2df7\u0415\u0450\u0400\u04d7\u04d6\u0451\u0401\u0454\ua674\u0404\u0436\u2de4\u0416\u04c2\u04c1\u04dd\u04dc\u052b\u052a\ua685\ua684\u0497\u0496\u0437\u2de5\u0417\u04df\u04de\ua641\ua640\u0505\u0504\u0511\u0510\ua643\ua642\u0455\u0405\ua645\ua644\u04e1\u04e0\ua689\ua688\u0507\u0506\ua683\ua682\u0438\ua675\u0418\u045d\u040d\u04e5\u04e4\u04e3\u04e2\u048b\u048a\u0456\u0406\u0457\ua676\u0407\ua647\ua646\u0439\u0419\u0458\u0408\ua649\u2df8\ua648\u043a\u2de6\u041a\u045c\u040c\u049b\u049a\u04c4\u04c3\u04a1\u04a0\u049f\u049e\u049d\u049c\u051f\u051e\u051b\u051a\u043b\u2de7\u041b\u1d2b\u04c6\u04c5\u052f\u052e\u0513\u0512\u0521\u0520\u0459\u0409\ua665\ua664\u0509\u0508\u0515\u0514\u043c\u2de8\u041c\u04ce\u04cd\ua667\ua666\u043d\u2de9\u041d\u1d78\u0529\u0528\u04ca\u04c9\u04a3\u04a2\u04c8\u04c7\u0523\u0522\u04a5\u04a4\u045a\u040a\u050b\u050a\u043e\u1c82\u2dea\ua669\ua66b\ua66d\ua66e\ua699\ua69b\u041e\ua668\ua66a\ua66c\ua698\ua69a\u04e7\u04e6\u04e9\u04e8\u04eb\u04ea\u043f\u2deb\u041f\u0525\u0524\u04a7\u04a6\u0481\u0480\u0440\u2dec\u0420\u048f\u048e\u0517\u0516\u0441\u1c83\u2ded\u0421\u2df5\u050d\u050c\u04ab\u04aa\u0442\u1c84\u1c85\u2dee\u0422\ua68d\ua68c\u050f\u050e\u04ad\u04ac\ua68b\ua68a\u045b\u040b\u0443\ua677\u0423\u045e\u040e\u04f1\u04f0\u04f3\u04f2\u04ef\u04ee\u04af\u04ae\u04b1\u04b0\ua64b\u1c88\u2df9\ua64a\u0479\u0478\u0444\ua69e\u0424\u0445\u2def\u0425\u04fd\u04fc\u04ff\u04fe\u04b3\u04b2\u04bb\u04ba\u0527\u0526\ua695\ua694\u0461\ua67b\u0460\u047f\u047e\ua64d\ua64c\u047d\u047c\u047b\u047a\u0446\u2df0\u0426\ua661\ua660\ua68f\ua68e\u04b5\u04b4\ua691\ua690\u0447\u2df1\u0427\u04f5\u04f4\u052d\u052c\ua693\ua692\u04b7\u04b6\u04cc\u04cb\u04b9\u04b8\ua687\ua686\u04bd\u04bc\u04bf\u04be\u045f\u040f\u0448\u2df2\u0428\ua697\ua696\u0449\u2df3\u0429\ua64f\ua64e\u2e2f\ua67f\u044a\u1c86\ua678\u042a\ua69c\ua651\ua650\u044b\ua679\u042b\u04f9\u04f8\u044c\ua67a\u042c\ua69d\u048d\u048c\u0463\u1c87\u2dfa\u0462\ua653\ua652\u044d\u042d\u04ed\u04ec\u044e\u2dfb\u042e\ua655\ua654\ua657\u2dfc\ua656\u044f\u042f\u0519\u0518\u0465\ua69f\u0464\u0467\u2dfd\u0466\ua659\ua658\u046b\u2dfe\u046a\ua65b\ua65a\u0469\u0468\ua65d\ua65c\u046d\u2dff\u046c\u046f\u046e\u0471\u0470\u0473\u2df4\u0472\u0475\u0474\u0477\u0476\ua65f\ua65e\u04a9\u04a8\u051d\u051c\u04cf\u04c0\u2c30\u2c00\u2c31\u2c01\u2c32\u2c02\u2c33\u2c03\u2c34\u2c04\u2c35\u2c05\u2c36\u2c06\u2c37\u2c07\u2c38\u2c08\u2c39\u2c09\u2c3a\u2c0a\u2c3b\u2c0b\u2c3c\u2c0c\u2c3d\u2c0d\u2c3e\u2c0e\u2c3f\u2c0f\u2c40\u2c10\u2c41\u2c11\u2c42\u2c12\u2c43\u2c13\u2c44\u2c14\u2c45\u2c15\u2c46\u2c16\u2c47\u2c17\u2c48\u2c18\u2c49\u2c19\u2c4a\u2c1a\u2c4b\u2c1b\u2c4c\u2c1c\u2c4d\u2c1d\u2c4e\u2c1e\u2c4f\u2c1f\u2c50\u2c20\u2c51\u2c21\u2c52\u2c22\u2c53\u2c23\u2c54\u2c24\u2c55\u2c25\u2c56\u2c26\u2c57\u2c27\u2c58\u2c28\u2c59\u2c29\u2c5a\u2c2a\u2c5b\u2c2b\u2c5c\u2c2c\u2c5d\u2c2d\u2c5e\u2c2e\u10d0\u1c90\u2d00\u10a0\u10d1\u1c91\u2d01\u10a1\u10d2\u1c92\u2d02\u10a2\u10d3\u1c93\u2d03\u10a3\u10d4\u1c94\u2d04\u10a4\u10d5\u1c95\u2d05\u10a5\u10d6\u1c96\u2d06\u10a6\u10f1\u1cb1\u2d21\u10c1\u10d7\u1c97\u2d07\u10a7\u10d8\u1c98\u2d08\u10a8\u10d9\u1c99\u2d09\u10a9\u10da\u1c9a\u2d0a\u10aa\u10db\u1c9b\u2d0b\u10ab\u10dc\u1c9c\u10fc\u2d0c\u10ac\u10f2\u1cb2\u2d22\u10c2\u10dd\u1c9d\u2d0d\u10ad\u10de\u1c9e\u2d0e\u10ae\u10df\u1c9f\u2d0f\u10af\u10e0\u1ca0\u2d10\u10b0\u10e1\u1ca1\u2d11\u10b1\u10e2\u1ca2\u2d12\u10b2\u10f3\u1cb3\u2d23\u10c3\u10e3\u1ca3\u2d13\u10b3\u10e4\u1ca4\u2d14\u10b4\u10e5\u1ca5\u2d15\u10b5\u10e6\u1ca6\u2d16\u10b6\u10e7\u1ca7\u2d17\u10b7\u10e8\u1ca8\u2d18\u10b8\u10e9\u1ca9\u2d19\u10b9\u10ea\u1caa\u2d1a\u10ba\u10eb\u1cab\u2d1b\u10bb\u10ec\u1cac\u2d1c\u10bc\u10ed\u1cad\u2d1d\u10bd\u10ee\u1cae\u2d1e\u10be\u10f4\u1cb4\u2d24\u10c4\u10ef\u1caf\u2d1f\u10bf\u10f0\u1cb0\u2d20\u10c0\u10f5\u1cb5\u2d25\u10c5\u10f6\u1cb6\u10f7\u1cb7\u2d27\u10c7\u10f8\u1cb8\u10f9\u1cb9\u10fa\u1cba\u10fd\u1cbd\u2d2d\u10cd\u10fe\u1cbe\u10ff\u1cbf\u0561\u0531\u0560\u0562\u0532\u0563\u0533\u0564\u0534\u0565\u0535\u0587\u0566\u0536\u0567\u0537\u0568\u0538\u0569\u0539\u056a\u053a\u056b\u053b\u056c\u053c\u056d\u053d\u056e\u053e\u056f\u053f\u0570\u0540\u0571\u0541\u0572\u0542\u0573\u0543\u0574\u0544\ufb14\ufb15\ufb17\ufb13\u0575\u0545\u0588\u0576\u0546\u0577\u0547\u0578\u0548\u0579\u0549\u057a\u054a\u057b\u054b\u057c\u054c\u057d\u054d\u057e\u054e\ufb16\u057f\u054f\u0580\u0550\u0581\u0551\u0582\u0552\u0583\u0553\u0584\u0554\u0585\u0555\u0586\u0556\u0559\u05d0\u2135\ufb21\ufb2e\ufb2f\ufb30\ufb4f\u05d1\u2136\ufb31\ufb4c\u05d2\u2137\ufb32\u05d3\u2138\ufb22\ufb33\u05d4\ufb23\ufb34\u05d5\ufb4b\ufb35\u05f0\u05f1\u05d6\ufb36\u05d7\u05d8\ufb38\u05d9\ufb1d\ufb39\u05ef\u05f2\ufb1f\u05db\ufb24\u05da\ufb3b\ufb3a\ufb4d\u05dc\ufb25\ufb3c\u05de\ufb26\u05dd\ufb3e\u05e0\u05df\ufb40\u05e1\ufb41\u05e2\ufb20\u05e4\u05e3\ufb44\ufb43\ufb4e\u05e6\u05e5\ufb46\u05e7\ufb47\u05e8\ufb27\ufb48\u05e9\ufb2b\ufb2a\ufb49\ufb2d\ufb2c\u05ea\ufb28\ufb4a\u0800\u0801\u0802\u0803\u0804\u0805\u0806\u0807\u0808\u0809\u080a\u080b\u080c\u080d\u080e\u080f\u0810\u0811\u0812\u0813\u0814\u0815\u0816\u0817\u081a\u081b\u0621\u0674\ufe80\u06fd\u0622\ufe82\ufe81\u0623\ufe84\ufe83\u0672\u0671\ufb51\ufb50\u0624\ufe86\ufe85\u0625\ufe88\ufe87\u0673\u0773\u0774\u0626\ufe8b\ufe8c\ufe8a\ufe89\ufbeb\ufbea\ufc97\ufc00\ufc98\ufc01\ufc99\ufc64\ufc65\ufc9a\ufcdf\ufc66\ufc02\ufc67\ufc9b\ufce0\ufbed\ufbec\ufbef\ufbee\ufbf3\ufbf2\ufbf1\ufbf0\ufbf5\ufbf4\ufbfb\ufbfa\ufc68\ufbf9\ufc03\ufc69\ufc04\ufbf8\ufbf7\ufbf6\u08a8\u08a9\u08ac\u0627\u08ad\ufe8e\ufe8d\ufd3c\ufd3d\u0675\ufdf3\ufdf2\u066e\u0628\ufe91\ufe92\ufe90\ufe8f\ufc9c\ufc05\ufc9d\ufc06\ufdc2\ufc9e\ufc07\ufd9e\ufc6a\ufc6b\ufc9f\ufce1\ufc6c\ufc08\ufc6d\ufca0\ufce2\ufc6e\ufc09\ufc6f\ufc0a\u067b\ufb54\ufb55\ufb53\ufb52\u067e\ufb58\ufb59\ufb57\ufb56\u0680\ufb5c\ufb5d\ufb5b\ufb5a\u0750\u0751\u0752\u0753\u0754\u0755\u08a0\u0756\u08be\u08a1\u08b6\u08b7\u0629\ufe94\ufe93\u062a\ufe97\ufe98\ufe96\ufe95\ufca1\ufc0b\ufd50\ufda0\ufd9f\ufca2\ufc0c\ufd52\ufd51\ufd53\ufca3\ufc0d\ufd54\ufda2\ufda1\ufc70\ufc71\ufca4\ufce3\ufc72\ufc0e\ufd55\ufd56\ufd57\ufda4\ufda3\ufc73\ufca5\ufce4\ufc74\ufc0f\ufc75\ufc10\u062b\ufe9b\ufe9c\ufe9a\ufe99\ufc11\ufc76\ufc77\ufca6\ufce5\ufc78\ufc12\ufc79\ufce6\ufc7a\ufc13\ufc7b\ufc14\u0679\ufb68\ufb69\ufb67\ufb66\u067a\ufb60\ufb61\ufb5f\ufb5e\u067c\u067d\u067f\ufb64\ufb65\ufb63\ufb62\u08b8\u08bf\u08c0\u062c\ufe9f\ufea0\ufe9e\ufe9d\ufca7\ufc15\ufda6\ufdbe\ufdfb\ufca8\ufc16\ufd59\ufd58\ufda7\ufda5\ufd1d\ufd01\ufd1e\ufd02\u0683\ufb78\ufb79\ufb77\ufb76\u0684\ufb74\ufb75\ufb73\ufb72\u0686\ufb7c\ufb7d\ufb7b\ufb7a\u06bf\u0687\ufb80\ufb81\ufb7f\ufb7e\u08a2\u08c1\u08c5\u08c6\u062d\ufea3\ufea4\ufea2\ufea1\ufca9\ufc17\ufdbf\ufcaa\ufc18\ufd5b\ufd5a\ufd1b\ufcff\ufd1c\ufd00\u062e\ufea7\ufea8\ufea6\ufea5\ufcab\ufc19\ufc1a\ufcac\ufc1b\ufd1f\ufd03\ufd20\ufd04\u0681\u0682\u0685\u0757\u0758\u076e\u076f\u0772\u077c\u062f\ufeaa\ufea9\u0630\ufeac\ufeab\ufc5b\u0688\ufb89\ufb88\u0689\u068a\u068b\u068c\ufb85\ufb84\u068d\ufb83\ufb82\u08ae\u068e\ufb87\ufb86\u068f\u0690\u06ee\u0759\u075a\u0631\ufeae\ufead\ufc5c\ufdf6\ufdfc\u0632\ufeb0\ufeaf\u0691\ufb8d\ufb8c\u0692\u0693\u0694\u0695\u0696\u0697\u0698\ufb8b\ufb8a\u0699\u06ef\u075b\u076b\u076c\u0771\u08aa\u08b2\u08b9\u0633\ufeb3\ufeb4\ufeb2\ufeb1\ufcad\ufd34\ufc1c\ufd5d\ufd5e\ufcae\ufd35\ufc1d\ufd5c\ufcaf\ufd36\ufc1e\ufda8\ufdc6\ufd2a\ufd0e\ufcb0\ufce7\ufc1f\ufd61\ufd60\ufd5f\ufd63\ufd62\ufd31\ufce8\ufd17\ufcfb\ufd18\ufcfc\u0634\ufeb7\ufeb8\ufeb6\ufeb5\ufd2d\ufd37\ufd25\ufd09\ufd69\ufd2e\ufd38\ufd26\ufd0a\ufd68\ufd67\ufdaa\ufd2f\ufd39\ufd27\ufd0b\ufd29\ufd0d\ufd30\ufce9\ufd28\ufd0c\ufd6b\ufd6a\ufd6d\ufd6c\ufd32\ufcea\ufd19\ufcfd\ufd1a\ufcfe\u069a\u069b\u069c\u06fa\u075c\u076d\u0770\u077d\u077e\u0635\ufebb\ufebc\ufeba\ufeb9\ufcb1\ufc20\ufd65\ufd64\ufda9\ufcb2\ufd2b\ufd0f\ufdf5\ufdf9\ufdfa\ufdf0\ufcb3\ufc21\ufdc5\ufd66\ufd21\ufd05\ufd22\ufd06\u0636\ufebf\ufec0\ufebe\ufebd\ufcb4\ufc22\ufcb5\ufc23\ufd6e\ufdab\ufcb6\ufc24\ufd70\ufd6f\ufd2c\ufd10\ufcb7\ufc25\ufd23\ufd07\ufd24\ufd08\u069d\u08af\u069e\u06fb\u0637\ufec3\ufec4\ufec2\ufec1\ufcb8\ufc26\ufd33\ufd3a\ufc27\ufd72\ufd71\ufd73\ufd74\ufd11\ufcf5\ufd12\ufcf6\u0638\ufec7\ufec8\ufec6\ufec5\ufcb9\ufd3b\ufc28\u069f\u08a3\u0639\ufecb\ufecc\ufeca\ufec9\ufcba\ufc29\ufdc4\ufd75\ufdf7\ufcbb\ufc2a\ufd77\ufd76\ufd78\ufdb6\ufd13\ufcf7\ufd14\ufcf8\u063a\ufecf\ufed0\ufece\ufecd\ufcbc\ufc2b\ufcbd\ufc2c\ufd79\ufd7b\ufd7a\ufd15\ufcf9\ufd16\ufcfa\u06a0\u08c3\u06fc\u075d\u075e\u075f\u08b3\u0641\ufed3\ufed4\ufed2\ufed1\ufcbe\ufc2d\ufcbf\ufc2e\ufcc0\ufc2f\ufd7d\ufd7c\ufcc1\ufc30\ufdc1\ufc7c\ufc31\ufc7d\ufc32\u06a1\u06a2\u08bb\u06a3\u06a4\ufb6c\ufb6d\ufb6b\ufb6a\u08a4\u06a5\u06a6\ufb70\ufb71\ufb6f\ufb6e\u0760\u0761\u066f\u0642\ufed7\ufed8\ufed6\ufed5\ufcc2\ufc33\ufdf1\ufcc3\ufc34\ufdb4\ufd7e\ufd7f\ufdb2\ufc7e\ufc35\ufc7f\ufc36\u06a7\u08bc\u06a8\u08c4\u08a5\u0643\ufedb\ufedc\ufeda\ufed9\ufc80\ufc37\ufcc4\ufc38\ufcc5\ufc39\ufcc6\ufc3a\ufcc7\ufceb\ufc81\ufc3b\ufcc8\ufcec\ufc82\ufc3c\ufdc3\ufdbb\ufdb7\ufc83\ufc3d\ufc84\ufc3e\u06a9\ufb90\ufb91\ufb8f\ufb8e\u06aa\u06ab\u06ac\u077f\u06ad\ufbd5\ufbd6\ufbd4\ufbd3\u06ae\u08b4\u06af\ufb94\ufb95\ufb93\ufb92\u08b0\u06b0\u06b1\ufb9c\ufb9d\ufb9b\ufb9a\u06b2\u06b3\ufb98\ufb99\ufb97\ufb96\u06b4\u0762\u063b\u063c\u0763\u0764\u08c2\u0644\ufedf\ufee0\ufede\ufedd\ufef6\ufef5\ufef8\ufef7\ufefa\ufef9\ufefc\ufefb\ufcc9\ufc3f\ufd83\ufd84\ufdba\ufdbc\ufdac\ufcca\ufc40\ufdb5\ufd80\ufd82\ufd81\ufccb\ufc41\ufd86\ufd85\ufccc\ufced\ufc85\ufc42\ufd88\ufd87\ufdad\ufccd\ufc86\ufc43\ufc87\ufc44\u06b5\u06b6\u06b7\u06b8\u076a\u08a6\u08c7\u0645\ufee3\ufee4\ufee2\ufee1\u06fe\ufc88\ufcce\ufc45\ufd8c\ufd92\ufd8d\ufdc0\ufccf\ufc46\ufd89\ufd8a\ufdf4\ufd8b\ufcd0\ufc47\ufd8e\ufd8f\ufdb9\ufcd1\ufc89\ufc48\ufdb1\ufc49\ufc4a\u0765\u0766\u08a7\u0646\ufee7\ufee8\ufee6\ufee5\ufcd2\ufc4b\ufdb8\ufdbd\ufd98\ufd97\ufd99\ufdc7\ufcd3\ufc4c\ufd95\ufd96\ufdb3\ufcd4\ufc4d\ufc8a\ufc8b\ufcd5\ufcee\ufc8c\ufc4e\ufd9b\ufd9a\ufc8d\ufcd6\ufcef\ufc8e\ufc4f\ufc8f\ufc50\u06ba\ufb9f\ufb9e\u08bd\u06bb\ufba2\ufba3\ufba1\ufba0\u06bc\u06bd\u06b9\u0767\u0768\u0769\u0647\ufeeb\ufeec\ufeea\ufee9\ufcd9\ufcd7\ufc51\ufcd8\ufc52\ufd93\ufd94\ufc53\ufc54\u06be\ufbac\ufbad\ufbab\ufbaa\u06c1\ufba8\ufba9\ufba7\ufba6\u06c2\u06c3\u06ff\u06d5\u06c0\ufba5\ufba4\u0648\u06e5\ufeee\ufeed\u0676\ufdf8\u06c4\u06c5\ufbe1\ufbe0\u06c6\ufbda\ufbd9\u06c7\ufbd8\ufbd7\u0677\ufbdd\u06c8\ufbdc\ufbdb\u06c9\ufbe3\ufbe2\u06ca\u06cb\ufbdf\ufbde\u08b1\u06cf\u0778\u0779\u08ab\u0649\ufbe8\ufbe9\ufef0\ufeef\ufc90\ufc5d\u064a\u06e6\ufef3\ufef4\ufef2\ufef1\u0678\ufcda\ufc55\ufdaf\ufcdb\ufc56\ufdae\ufcdc\ufc57\ufc91\ufc92\ufcdd\ufcf0\ufc93\ufc58\ufd9d\ufd9c\ufdb0\ufc94\ufcde\ufcf1\ufc95\ufc59\ufc96\ufc5a\u06cc\ufbfe\ufbff\ufbfd\ufbfc\u06cd\u06ce\u06d0\ufbe6\ufbe7\ufbe5\ufbe4\u06d1\u063d\u063e\u063f\u0620\u0775\u0776\u0777\u08ba\u06d2\ufbaf\ufbae\u06d3\ufbb1\ufbb0\u077a\u077b\u0710\u0712\u072d\u0713\u0714\u072e\u0716\u0715\u072f\u0717\u0718\u0719\u074d\u071a\u071b\u071c\u071d\u071e\u071f\u074e\u0720\u0721\u0722\u0723\u0724\u0725\u0726\u0727\u074f\u0728\u0729\u072a\u072b\u072c\u0860\u0861\u0862\u0863\u0864\u0865\u0866\u0867\u0868\u0869\u086a\u0840\u0841\u0842\u0843\u0844\u0845\u0846\u0847\u0848\u0849\u084a\u084b\u084c\u084d\u084e\u084f\u0850\u0851\u0852\u0853\u0854\u0855\u0856\u0857\u0858\u0780\u0799\u079a\u0781\u0782\u0783\u079c\u0784\u0785\u0786\u0787\u07a2\u07a3\u0788\u07a5\u0789\u078a\u078b\u079b\u078c\u0798\u07a0\u07a1\u078d\u078e\u07a4\u078f\u0790\u079d\u079e\u079f\u0791\u0792\u0793\u0794\u0795\u0796\u0797\u07b1\u07a6\u07a7\u07a8\u07a9\u07aa\u07ab\u07ac\u07ad\u07ae\u07af\u07b0\u07ca\u07cb\u07cc\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u07d4\u07d5\u07d6\u07e8\u07d7\u07e9\u07d8\u07d9\u07ea\u07da\u07db\u07dc\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3\u07e4\u07e5\u07e6\u07e7\u07f4\u07f5\u2d30\u2d31\u2d32\u2d33\u2d34\u2d35\u2d36\u2d37\u2d38\u2d39\u2d3a\u2d3b\u2d66\u2d3c\u2d3d\u2d3e\u2d3f\u2d40\u2d41\u2d42\u2d43\u2d44\u2d45\u2d46\u2d47\u2d48\u2d49\u2d4a\u2d4b\u2d4c\u2d4d\u2d4e\u2d4f\u2d50\u2d51\u2d52\u2d53\u2d67\u2d54\u2d55\u2d56\u2d57\u2d58\u2d59\u2d5a\u2d5b\u2d5c\u2d5d\u2d5e\u2d5f\u2d60\u2d61\u2d62\u2d63\u2d64\u2d65\u2d6f\u1200\u1201\u1202\u1203\u1204\u1205\u1206\u1207\u1208\u1209\u120a\u120b\u120c\u120d\u120e\u120f\u2d80\u1210\u1211\u1212\u1213\u1214\u1215\u1216\u1217\u1218\u1219\u121a\u121b\u121c\u121d\u121e\u121f\u1380\u1381\u1382\u1383\u2d81\u1220\u1221\u1222\u1223\u1224\u1225\u1226\u1227\u1228\u1229\u122a\u122b\u122c\u122d\u122e\u122f\u2d82\u1230\u1231\u1232\u1233\u1234\u1235\u1236\u1237\u2d83\uab01\uab02\uab03\uab04\uab05\uab06\u1238\u1239\u123a\u123b\u123c\u123d\u123e\u123f\u2d84\u1240\u1241\u1242\u1243\u1244\u1245\u1246\u1247\u1248\u124a\u124b\u124c\u124d\u1250\u1251\u1252\u1253\u1254\u1255\u1256\u1258\u125a\u125b\u125c\u125d\u1260\u1261\u1262\u1263\u1264\u1265\u1266\u1267\u1384\u1385\u1386\u1387\u2d85\u1268\u1269\u126a\u126b\u126c\u126d\u126e\u126f\u1270\u1271\u1272\u1273\u1274\u1275\u1276\u1277\u2d86\u1278\u1279\u127a\u127b\u127c\u127d\u127e\u127f\u2d87\u1280\u1281\u1282\u1283\u1284\u1285\u1286\u1287\u1288\u128a\u128b\u128c\u128d\u1290\u1291\u1292\u1293\u1294\u1295\u1296\u1297\u2d88\u1298\u1299\u129a\u129b\u129c\u129d\u129e\u129f\u2d89\u12a0\u12a1\u12a2\u12a3\u12a4\u12a5\u12a6\u12a7\u2d8a\u12a8\u12a9\u12aa\u12ab\u12ac\u12ad\u12ae\u12af\u12b0\u12b2\u12b3\u12b4\u12b5\u12b8\u12b9\u12ba\u12bb\u12bc\u12bd\u12be\u12c0\u12c2\u12c3\u12c4\u12c5\u12c8\u12c9\u12ca\u12cb\u12cc\u12cd\u12ce\u12cf\u12d0\u12d1\u12d2\u12d3\u12d4\u12d5\u12d6\u12d8\u12d9\u12da\u12db\u12dc\u12dd\u12de\u12df\u2d8b\uab11\uab12\uab13\uab14\uab15\uab16\u12e0\u12e1\u12e2\u12e3\u12e4\u12e5\u12e6\u12e7\u12e8\u12e9\u12ea\u12eb\u12ec\u12ed\u12ee\u12ef\u12f0\u12f1\u12f2\u12f3\u12f4\u12f5\u12f6\u12f7\u2d8c\uab09\uab0a\uab0b\uab0c\uab0d\uab0e\u12f8\u12f9\u12fa\u12fb\u12fc\u12fd\u12fe\u12ff\u2d8d\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u2d8e\u1308\u1309\u130a\u130b\u130c\u130d\u130e\u130f\u1310\u1312\u1313\u1314\u1315\u1318\u1319\u131a\u131b\u131c\u131d\u131e\u131f\u2d93\u2d94\u2d95\u2d96\u1320\u1321\u1322\u1323\u1324\u1325\u1326\u1327\u2d8f\u1328\u1329\u132a\u132b\u132c\u132d\u132e\u132f\u2d90\uab20\uab21\uab22\uab23\uab24\uab25\uab26\u1330\u1331\u1332\u1333\u1334\u1335\u1336\u1337\u2d91\u1338\u1339\u133a\u133b\u133c\u133d\u133e\u133f\uab28\uab29\uab2a\uab2b\uab2c\uab2d\uab2e\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134a\u134b\u134c\u134d\u134e\u134f\u1388\u1389\u138a\u138b\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u1357\u138c\u138d\u138e\u138f\u2d92\u1358\u1359\u135a\u2da0\u2da1\u2da2\u2da3\u2da4\u2da5\u2da6\u2da8\u2da9\u2daa\u2dab\u2dac\u2dad\u2dae\u2db0\u2db1\u2db2\u2db3\u2db4\u2db5\u2db6\u2db8\u2db9\u2dba\u2dbb\u2dbc\u2dbd\u2dbe\u2dc0\u2dc1\u2dc2\u2dc3\u2dc4\u2dc5\u2dc6\u2dc8\u2dc9\u2dca\u2dcb\u2dcc\u2dcd\u2dce\u2dd0\u2dd1\u2dd2\u2dd3\u2dd4\u2dd5\u2dd6\u2dd8\u2dd9\u2dda\u2ddb\u2ddc\u2ddd\u2dde\u0950\ua8fd\u0972\u0904\u0905\u0906\u0973\u0974\u0975\u0976\u0977\u0907\u0908\u0909\u090a\u090b\u0960\u090c\u0961\u090d\u090e\u090f\u0910\ua8fe\u0911\u0912\u0913\u0914\u0915\u0958\u0916\u0959\u0917\u095a\u097b\u0918\u0919\u091a\u091b\u091c\u095b\u0979\u097c\u091d\u091e\u091f\u0920\u0978\u0921\u095c\u097e\u0922\u095d\u0923\u0924\u0925\u0926\u0927\u0928\u0929\u092a\u092b\u095e\u092c\u097f\u092d\u092e\u092f\u095f\u097a\u0930\u0931\u0932\u0933\u0934\u0935\u0936\u0937\u0938\u0939\u093d\u097d\u1ce9\u1cea\u1ceb\u1cec\u1cee\u1cef\u1cf0\u1cf1\u1cfa\u1cf5\u1cf6\ua8f2\ua8f3\ua8f4\ua8f5\ua8f6\ua8f7\ua8fb\u093e\u093a\u093b\u094f\u0956\u0957\u093f\u0940\u0941\u0942\u0943\u0944\u0962\u0963\u0945\u0955\u0946\u0947\u094e\u0948\ua8ff\u0949\u094a\u094b\u094c\u094d\u0980\u0985\u0986\u0987\u0988\u0989\u098a\u098b\u09e0\u098c\u09e1\u098f\u0990\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099a\u099b\u099c\u099d\u099e\u099f\u09a0\u09a1\u09dc\u09a2\u09dd\u09a3\u09a4\u09ce\u09a5\u09a6\u09a7\u09a8\u09aa\u09ab\u09ac\u09ad\u09ae\u09af\u09df\u09b0\u09f0\u09b2\u09f1\u09b6\u09b7\u09b8\u09b9\u09bd\u09be\u09bf\u09c0\u09c1\u09c2\u09c3\u09c4\u09e2\u09e3\u09c7\u09c8\u09cb\u09cc\u09cd\u09d7\u09fc\u0a74\u0a73\u0a09\u0a0a\u0a13\u0a05\u0a06\u0a10\u0a14\u0a72\u0a07\u0a08\u0a0f\u0a38\u0a36\u0a39\u0a51\u0a15\u0a16\u0a59\u0a17\u0a5a\u0a18\u0a19\u0a1a\u0a1b\u0a1c\u0a5b\u0a1d\u0a1e\u0a1f\u0a20\u0a21\u0a22\u0a23\u0a24\u0a25\u0a26\u0a27\u0a28\u0a2a\u0a2b\u0a5e\u0a2c\u0a2d\u0a2e\u0a2f\u0a75\u0a30\u0a32\u0a33\u0a35\u0a5c\u0a3e\u0a3f\u0a40\u0a41\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a4d\u0ad0\u0a85\u0a86\u0a87\u0a88\u0a89\u0a8a\u0a8b\u0ae0\u0a8c\u0ae1\u0a8d\u0a8f\u0a90\u0a91\u0a93\u0a94\u0a95\u0a96\u0a97\u0a98\u0a99\u0a9a\u0a9b\u0a9c\u0af9\u0a9d\u0a9e\u0a9f\u0aa0\u0aa1\u0aa2\u0aa3\u0aa4\u0aa5\u0aa6\u0aa7\u0aa8\u0aaa\u0aab\u0aac\u0aad\u0aae\u0aaf\u0ab0\u0ab2\u0ab5\u0ab6\u0ab7\u0ab8\u0ab9\u0ab3\u0abd\u0abe\u0abf\u0ac0\u0ac1\u0ac2\u0ac3\u0ac4\u0ae2\u0ae3\u0ac5\u0ac7\u0ac8\u0ac9\u0acb\u0acc\u0acd\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\u0b60\u0b0c\u0b61\u0b0f\u0b10\u0b13\u0b14\u0b15\u0b16\u0b17\u0b18\u0b19\u0b1a\u0b1b\u0b1c\u0b1d\u0b1e\u0b1f\u0b20\u0b21\u0b5c\u0b22\u0b5d\u0b23\u0b24\u0b25\u0b26\u0b27\u0b28\u0b2a\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b5f\u0b30\u0b32\u0b33\u0b35\u0b71\u0b36\u0b37\u0b38\u0b39\u0b3d\u0b3e\u0b3f\u0b40\u0b41\u0b42\u0b43\u0b44\u0b62\u0b63\u0b47\u0b48\u0b4b\u0b4c\u0b4d\u0b56\u0b57\u0bd0\u0b85\u0b86\u0b87\u0b88\u0b89\u0b8a\u0b8e\u0b8f\u0b90\u0b92\u0b93\u0b94\u0b83\u0b95\u0b99\u0b9a\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0baf\u0bb0\u0bb2\u0bb5\u0bb4\u0bb3\u0bb1\u0ba9\u0b9c\u0bb6\u0bb7\u0bb8\u0bb9\u0bbe\u0bbf\u0bc0\u0bc1\u0bc2\u0bc6\u0bc7\u0bc8\u0bca\u0bcb\u0bcc\u0bcd\u0bd7\u0c05\u0c06\u0c07\u0c08\u0c09\u0c0a\u0c0b\u0c60\u0c0c\u0c61\u0c0e\u0c0f\u0c10\u0c12\u0c13\u0c14\u0c15\u0c16\u0c17\u0c18\u0c19\u0c1a\u0c58\u0c1b\u0c1c\u0c59\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27\u0c28\u0c2a\u0c2b\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c35\u0c36\u0c37\u0c38\u0c39\u0c33\u0c34\u0c5a\u0c3d\u0c3e\u0c3f\u0c40\u0c41\u0c42\u0c43\u0c44\u0c62\u0c63\u0c46\u0c47\u0c48\u0c4a\u0c4b\u0c4c\u0c4d\u0c55\u0c56\u0c85\u0c86\u0c87\u0c88\u0c89\u0c8a\u0c8b\u0ce0\u0c8c\u0ce1\u0c8e\u0c8f\u0c90\u0c92\u0c93\u0c94\u0c95\u0c96\u0c97\u0c98\u0c99\u0c9a\u0c9b\u0c9c\u0c9d\u0c9e\u0c9f\u0ca0\u0ca1\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0caa\u0cab\u0cac\u0cad\u0cae\u0caf\u0cb0\u0cb1\u0cb2\u0cb5\u0cb6\u0cb7\u0cb8\u0cb9\u0cb3\u0cde\u0cbd\u0cf1\u0cf2\u0c80\u0cbe\u0cbf\u0cc0\u0cc1\u0cc2\u0cc3\u0cc4\u0ce2\u0ce3\u0cc6\u0cc7\u0cc8\u0cca\u0ccb\u0ccc\u0ccd\u0cd5\u0cd6\u0d05\u0d06\u0d07\u0d08\u0d5f\u0d09\u0d0a\u0d0b\u0d60\u0d0c\u0d61\u0d0e\u0d0f\u0d10\u0d12\u0d13\u0d14\u0d15\u0d7f\u0d16\u0d17\u0d18\u0d19\u0d1a\u0d1b\u0d1c\u0d1d\u0d1e\u0d1f\u0d20\u0d21\u0d22\u0d23\u0d7a\u0d24\u0d25\u0d26\u0d27\u0d28\u0d7b\u0d29\u0d2a\u0d2b\u0d2c\u0d2d\u0d2e\u0d54\u0d2f\u0d55\u0d30\u0d4e\u0d7c\u0d32\u0d7d\u0d35\u0d36\u0d37\u0d38\u0d39\u0d33\u0d7e\u0d34\u0d56\u0d31\u0d3a\u0d3d\u0d04\u0d3e\u0d3f\u0d40\u0d41\u0d42\u0d43\u0d44\u0d62\u0d63\u0d46\u0d47\u0d48\u0d4a\u0d4b\u0d4c\u0d57\u0d4d\u0d3b\u0d3c\u0d85\u0d86\u0d87\u0d88\u0d89\u0d8a\u0d8b\u0d8c\u0d8d\u0d8e\u0d8f\u0d90\u0d91\u0d92\u0d93\u0d94\u0d95\u0d96\u0d9a\u0d9b\u0d9c\u0d9d\u0d9e\u0d9f\u0da0\u0da1\u0da2\u0da3\u0da4\u0da5\u0da6\u0da7\u0da8\u0da9\u0daa\u0dab\u0dac\u0dad\u0dae\u0daf\u0db0\u0db1\u0db3\u0db4\u0db5\u0db6\u0db7\u0db8\u0db9\u0dba\u0dbb\u0dbd\u0dc0\u0dc1\u0dc2\u0dc3\u0dc4\u0dc5\u0dc6\u0dcf\u0dd0\u0dd1\u0dd2\u0dd3\u0dd4\u0dd6\u0dd8\u0df2\u0ddf\u0df3\u0dd9\u0dda\u0ddb\u0ddc\u0ddd\u0dde\u0dca\uaaf2\uabc0\uabc1\uabc2\uabc3\uabc4\uabc5\uabc6\uabc7\uabc8\uabc9\uabca\uabcb\uabcc\uabcd\uabce\uabcf\uabd0\uabd1\uabd2\uabd3\uabd4\uabd5\uabd6\uabd7\uabd8\uabd9\uabda\uaae0\uaae1\uaae2\uaae3\uaae4\uaae5\uaae6\uaae7\uaae8\uaae9\uaaea\uabe3\uabe4\uabe5\uabe6\uabe7\uabe8\uabe9\uabea\uaaeb\uaaec\uaaed\uaaee\uaaef\uaaf5\uabdb\uabdc\uabdd\uabde\uabdf\uabe0\uabe1\uabe2\uabed\uaaf6\ua800\ua801\ua802\ua803\ua804\ua805\ua806\ua82c\ua807\ua808\ua809\ua80a\ua80c\ua80d\ua80e\ua80f\ua810\ua811\ua812\ua813\ua814\ua815\ua816\ua817\ua818\ua819\ua81a\ua81b\ua81c\ua81d\ua81e\ua81f\ua820\ua821\ua822\ua823\ua824\ua825\ua826\ua827\ua882\ua883\ua884\ua885\ua886\ua887\ua888\ua889\ua88a\ua88b\ua88c\ua88d\ua88e\ua88f\ua890\ua891\ua892\ua893\ua894\ua895\ua896\ua897\ua898\ua899\ua89a\ua89b\ua89c\ua89d\ua89e\ua89f\ua8a0\ua8a1\ua8a2\ua8a3\ua8a4\ua8a5\ua8a6\ua8a7\ua8a8\ua8a9\ua8aa\ua8ab\ua8ac\ua8ad\ua8ae\ua8af\ua8b0\ua8b1\ua8b2\ua8b3\ua8b4\ua8b5\ua8b6\ua8b7\ua8b8\ua8b9\ua8ba\ua8bb\ua8bc\ua8bd\ua8be\ua8bf\ua8c0\ua8c1\ua8c2\ua8c3\ua8c4\u1b83\u1bba\u1b84\u1b85\u1b86\u1b87\u1b88\u1b89\u1b8a\u1bbe\u1bae\u1b8b\u1b8c\u1b8d\u1b8e\u1b8f\u1b90\u1b91\u1b92\u1b93\u1b94\u1b95\u1b96\u1b97\u1b98\u1bbd\u1b99\u1bbf\u1bac\u1b9a\u1ba1\u1b9b\u1ba2\u1bbb\u1b9c\u1ba3\u1bbc\u1b9d\u1bad\u1b9e\u1b9f\u1baf\u1ba0\u1ba4\u1ba5\u1ba6\u1ba7\u1ba8\u1ba9\u1baa\u1bab\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0ede\u0e81\u0e82\u0e84\u0e86\u0e87\u0e88\u0e89\u0eaa\u0e8a\u0e8c\u0e8e\u0edf\u0e8d\u0e8f\u0e90\u0e91\u0e92\u0e93\u0e94\u0e95\u0e96\u0e97\u0e98\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea0\u0ea1\u0ea2\u0ea3\u0ea5\u0ea7\u0ea8\u0ea9\u0eab\u0edc\u0edd\u0eac\u0ead\u0eae\u0eaf\u0eb0\u0eb1\u0eb2\u0eb3\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0eba\u0ebb\u0ebc\u0ebd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\uaa80\uaa81\uaa82\uaa83\uaa84\uaa85\uaa86\uaa87\uaa88\uaa89\uaa8a\uaa8b\uaa8c\uaa8d\uaa8e\uaa8f\uaa90\uaa91\uaa92\uaa93\uaa94\uaa95\uaa96\uaa97\uaa98\uaa99\uaa9a\uaa9b\uaa9c\uaa9d\uaa9e\uaa9f\uaaa0\uaaa1\uaaa2\uaaa3\uaaa4\uaaa5\uaaa6\uaaa7\uaaa8\uaaa9\uaaaa\uaaab\uaaac\uaaad\uaaae\uaaaf\uaab0\uaab1\uaab2\uaab3\uaab4\uaab5\uaab6\uaab7\uaab8\uaab9\uaaba\uaabb\uaabc\uaabd\uaabe\uaac0\uaac2\uaadb\uaadc\u0f40\u0f69\u0f90\u0fb9\u0f6b\u0f41\u0f91\u0f42\u0f43\u0f92\u0f93\u0f44\u0f94\u0f45\u0f95\u0f46\u0f96\u0f47\u0f97\u0f49\u0f99\u0f4a\u0f9a\u0f4b\u0f9b\u0f4c\u0f4d\u0f9c\u0f9d\u0f4e\u0f9e\u0f4f\u0f9f\u0f50\u0fa0\u0f51\u0f52\u0fa1\u0fa2\u0f53\u0fa3\u0f54\u0fa4\u0f55\u0fa5\u0f56\u0f57\u0fa6\u0fa7\u0f58\u0fa8\u0f59\u0fa9\u0f5a\u0faa\u0f5b\u0f5c\u0fab\u0fac\u0f5d\u0fad\u0fba\u0f5e\u0fae\u0f5f\u0faf\u0f60\u0fb0\u0f61\u0fb1\u0fbb\u0f62\u0f6a\u0fb2\u0fbc\u0f6c\u0f63\u0fb3\u0f64\u0fb4\u0f65\u0fb5\u0f66\u0fb6\u0f67\u0fb7\u0f68\u0f00\u0fb8\u0f88\u0f8d\u0f89\u0f8e\u0f8c\u0f8f\u0f8a\u0f8b\u0f71\u0f72\u0f73\u0f80\u0f81\u0f74\u0f75\u0f76\u0f77\u0f78\u0f79\u0f7a\u0f7b\u0f7c\u0f7d\u0f84\u1c00\u1c01\u1c02\u1c03\u1c04\u1c05\u1c06\u1c07\u1c08\u1c09\u1c4d\u1c4e\u1c4f\u1c0a\u1c0b\u1c0c\u1c0d\u1c0e\u1c0f\u1c10\u1c11\u1c12\u1c13\u1c14\u1c15\u1c16\u1c17\u1c18\u1c19\u1c1a\u1c24\u1c1b\u1c25\u1c1c\u1c1d\u1c1e\u1c1f\u1c20\u1c21\u1c22\u1c23\u1c36\u1c26\u1c27\u1c28\u1c29\u1c2a\u1c2b\u1c2c\u1c2d\u1c2e\u1c2f\u1c30\u1c31\u1c32\u1c33\u1c34\u1c35\ua840\ua841\ua842\ua843\ua844\ua845\ua846\ua847\ua869\ua86a\ua86b\ua86c\ua848\ua849\ua84a\ua84b\ua84c\ua84d\ua84e\ua84f\ua850\ua851\ua852\ua853\ua867\ua854\ua855\ua856\ua857\ua868\ua86d\ua858\ua871\ua872\ua859\ua85a\ua86e\ua85b\ua85c\ua86f\ua870\ua85d\ua862\ua863\ua864\ua865\ua85e\ua85f\ua860\ua861\ua866\ua873\u1900\u1901\u1902\u1903\u1904\u1905\u1906\u1907\u1908\u191d\u1909\u190a\u190b\u191e\u190c\u190d\u190e\u190f\u1910\u1911\u1912\u1913\u1914\u1915\u1916\u1917\u1918\u1919\u191a\u191b\u191c\u1920\u1921\u1922\u1923\u1924\u1925\u1926\u1927\u1928\u1929\u192a\u192b\u1930\u1931\u1932\u1933\u1934\u1935\u1936\u1937\u1938\u1700\u1701\u1702\u1703\u1704\u1705\u1706\u1707\u1708\u1709\u170a\u170b\u170c\u170e\u170f\u1710\u1711\u1712\u1713\u1714\u1720\u1721\u1722\u1723\u1724\u1725\u1726\u1727\u1728\u1729\u172a\u172b\u172c\u172d\u172e\u172f\u1730\u1731\u1732\u1733\u1734\u1740\u1741\u1742\u1743\u1744\u1745\u1746\u1747\u1748\u1749\u174a\u174b\u174c\u174d\u174e\u174f\u1750\u1751\u1752\u1753\u1760\u1761\u1762\u1763\u1764\u1765\u1766\u1767\u1768\u1769\u176a\u176b\u176c\u176e\u176f\u1770\u1772\u1773\u1a00\u1a01\u1a02\u1a03\u1a04\u1a05\u1a06\u1a07\u1a08\u1a09\u1a0a\u1a0b\u1a0c\u1a0d\u1a0e\u1a0f\u1a10\u1a11\u1a12\u1a13\u1a14\u1a15\u1a16\u1a17\u1a18\u1a19\u1a1a\u1a1b\u1bc0\u1bc1\u1bc2\u1bc3\u1bc4\u1bc5\u1bc6\u1bc7\u1bc8\u1bc9\u1bca\u1bcb\u1bcc\u1bcd\u1bce\u1bcf\u1bd0\u1bd1\u1bd2\u1bd3\u1bd4\u1bd5\u1bd6\u1bd7\u1bd8\u1bd9\u1bda\u1bdb\u1bdc\u1bdd\u1bde\u1bdf\u1be0\u1be1\u1be2\u1be3\u1be4\u1be5\u1be7\u1be8\u1be9\u1bea\u1beb\u1bec\u1bed\u1bee\u1bef\u1bf0\u1bf1\u1bf2\u1bf3\ua930\ua931\ua932\ua933\ua934\ua935\ua936\ua937\ua938\ua939\ua93a\ua93b\ua93c\ua93d\ua93e\ua93f\ua940\ua941\ua942\ua943\ua944\ua945\ua946\ua947\ua948\ua949\ua94a\ua94b\ua94c\ua94d\ua94e\ua94f\ua950\ua951\ua952\ua953\ua90a\ua90b\ua90c\ua90d\ua90e\ua90f\ua910\ua911\ua912\ua913\ua914\ua915\ua916\ua917\ua918\ua919\ua91a\ua91b\ua91c\ua91d\ua91e\ua91f\ua920\ua921\ua922\ua923\ua924\ua925\ua926\ua927\ua928\ua929\ua92a\u1000\u1075\u1001\u1076\u1002\u1077\uaa60\ua9e9\u1003\ua9e0\ua9ea\u1004\u105a\u1005\u1078\uaa61\u1006\ua9e1\uaa62\uaa7e\u1007\uaa63\ua9eb\u1079\uaa72\u1008\u105b\ua9e2\uaa64\ua9ec\u1061\uaa7f\u1009\u107a\uaa65\ua9e7\u100a\u100b\uaa66\u100c\uaa67\u100d\uaa68\ua9ed\u100e\uaa69\ua9ee\u100f\u106e\ua9e3\ua9ef\u1010\u1011\u1012\u107b\ua9fb\u1013\uaa6a\ua9fc\u1014\u107c\uaa6b\u105e\u1015\u1016\u107d\u107e\uaa6f\u108e\ua9e8\u1017\u107f\ua9fd\u1018\ua9e4\ua9fe\u1019\u105f\u101a\u103b\u101b\uaa73\uaa7a\u103c\u101c\u1060\u101d\u103d\u1082\u1080\u1050\u1051\u1065\u101e\u103f\uaa6c\u101f\u1081\uaa6d\u103e\uaa6e\uaa71\u1020\ua9fa\u105c\u105d\u106f\u1070\u1066\u1021\u1022\u1023\u1024\u1025\u1026\u1052\u1053\u1054\u1055\u1027\u1028\u1029\u102a\u102c\u102b\u1083\u1072\u109c\u102d\u1071\u102e\u1033\u102f\u1073\u1074\u1030\u1056\u1057\u1058\u1059\u1031\u1084\u1035\u1085\u1032\u109d\u1034\u1062\u1067\u1068\ua9e5\u1086\u1039\u103a\u1063\u1064\u1069\u106a\u106b\u106c\u106d\u1087\u108b\u1088\u108c\u108d\u1089\u108a\u108f\u109a\u109b\uaa7b\uaa7c\uaa7d\uaa74\uaa75\uaa76\u1780\u1781\u1782\u1783\u1784\u1785\u1786\u1787\u1788\u1789\u178a\u178b\u178c\u178d\u178e\u178f\u1790\u1791\u1792\u1793\u1794\u1795\u1796\u1797\u1798\u1799\u179a\u179b\u179c\u179d\u179e\u179f\u17a0\u17a1\u17a2\u17dc\u17a3\u17a4\u17a5\u17a6\u17a7\u17a8\u17a9\u17aa\u17ab\u17ac\u17ad\u17ae\u17af\u17b0\u17b1\u17b2\u17b3\u17b6\u17b7\u17b8\u17b9\u17ba\u17bb\u17bc\u17bd\u17be\u17bf\u17c0\u17c1\u17c2\u17c3\u17c4\u17c5\u17d2\u1950\u1951\u1952\u1953\u1954\u1955\u1956\u1957\u1958\u1959\u195a\u195b\u195c\u195d\u195e\u195f\u1960\u1961\u1962\u1963\u1964\u1965\u1966\u1967\u1968\u1969\u196a\u196b\u196c\u196d\u1970\u1971\u1972\u1973\u1974\u1980\u1981\u1982\u1983\u1984\u1985\u1986\u1987\u1988\u1989\u198a\u198b\u198c\u198d\u198e\u198f\u1990\u1991\u1992\u1993\u1994\u1995\u1996\u1997\u1998\u1999\u199a\u199b\u199c\u19de\u19df\u199d\u199e\u199f\u19a0\u19a1\u19a2\u19a3\u19a4\u19a5\u19a6\u19a7\u19a8\u19a9\u19aa\u19ab\u19b0\u19b1\u19b2\u19b3\u19b4\u19b5\u19b6\u19b7\u19b8\u19b9\u19ba\u19bb\u19bc\u19bd\u19be\u19bf\u19c0\u19c1\u19c2\u19c3\u19c4\u19c5\u19c6\u19c7\u19c8\u19c9\u1a20\u1a21\u1a22\u1a23\u1a24\u1a25\u1a26\u1a58\u1a59\u1a27\u1a28\u1a29\u1a2a\u1a2b\u1a2c\u1a2d\u1a2e\u1a2f\u1a30\u1a31\u1a32\u1a33\u1a34\u1a35\u1a36\u1a37\u1a38\u1a39\u1a3a\u1a3b\u1a5a\u1a5b\u1a3c\u1a3d\u1a3e\u1a3f\u1a40\u1a41\u1a42\u1a43\u1a44\u1a45\u1a46\u1a54\u1a47\u1a48\u1a49\u1a4a\u1a4b\u1a4c\u1a53\u1a6b\u1a55\u1a56\u1a57\u1a5c\u1a5d\u1a5e\u1a4d\u1a4e\u1a4f\u1a50\u1a51\u1a52\u1a61\u1a6c\u1a62\u1a63\u1a64\u1a65\u1a66\u1a67\u1a68\u1a69\u1a6a\u1a6e\u1a6f\u1a73\u1a70\u1a71\u1a72\u1a6d\u1a60\uaa00\uaa01\uaa02\uaa03\uaa04\uaa05\uaa06\uaa07\uaa08\uaa09\uaa0a\uaa0b\uaa0c\uaa0d\uaa0e\uaa0f\uaa10\uaa11\uaa12\uaa13\uaa14\uaa15\uaa16\uaa17\uaa18\uaa19\uaa1a\uaa1b\uaa1c\uaa1d\uaa1e\uaa1f\uaa20\uaa21\uaa22\uaa23\uaa24\uaa25\uaa26\uaa27\uaa28\uaa33\uaa34\uaa35\uaa36\uaa29\uaa2a\uaa2b\uaa2c\uaa2d\uaa2e\uaa2f\uaa30\uaa31\uaa32\uaa40\uaa41\uaa42\uaa43\uaa44\uaa45\uaa46\uaa47\uaa48\uaa49\uaa4a\uaa4b\uaa4c\uaa4d\u1b05\u1b06\u1b07\u1b08\u1b09\u1b0a\u1b0b\u1b0c\u1b0d\u1b0e\u1b0f\u1b10\u1b11\u1b12\u1b13\u1b45\u1b46\u1b14\u1b15\u1b16\u1b17\u1b18\u1b19\u1b1a\u1b1b\u1b1c\u1b1d\u1b1e\u1b1f\u1b20\u1b21\u1b22\u1b47\u1b23\u1b24\u1b25\u1b26\u1b27\u1b48\u1b28\u1b29\u1b2a\u1b2b\u1b2c\u1b2d\u1b2e\u1b2f\u1b49\u1b30\u1b31\u1b32\u1b4a\u1b4b\u1b33\u1b35\u1b36\u1b37\u1b38\u1b39\u1b3a\u1b3b\u1b3c\u1b3d\u1b3e\u1b3f\u1b40\u1b41\u1b42\u1b43\u1b44\ua984\ua985\ua986\ua987\ua988\ua989\ua98a\ua98b\ua98c\ua98d\ua98e\ua98f\ua990\ua991\ua992\ua993\ua994\ua995\ua996\ua997\ua998\ua999\ua99a\ua99b\ua99c\ua99d\ua99e\ua99f\ua9a0\ua9a1\ua9a2\ua9a3\ua9a4\ua9a5\ua9a6\ua9a7\ua9a8\ua9a9\ua9aa\ua9be\ua9ab\ua9ac\ua9bf\ua9ad\ua9ae\ua9af\ua9b0\ua9b1\ua9b2\ua9b4\ua9b5\ua9bc\ua9b6\ua9b7\ua9b8\ua9b9\ua9bd\ua9ba\ua9bb\ua9c0\u1880\u1881\u1882\u1883\u1884\u1885\u1886\u1843\u1820\u1887\u1821\u1844\u185d\u1822\u1845\u185e\u1873\u1888\u185f\u1823\u1846\u1824\u1847\u1861\u1825\u1848\u1826\u1849\u1860\u1827\u1828\u1829\u184a\u1862\u188a\u189b\u182a\u184b\u182b\u184c\u1866\u182c\u184d\u182d\u184e\u1864\u189a\u1865\u182e\u184f\u182f\u1830\u1831\u1867\u189c\u189d\u18a2\u18a4\u18a5\u1832\u1850\u1868\u1833\u1851\u1869\u1834\u1852\u1871\u1878\u185c\u188b\u1835\u1853\u186a\u1877\u1836\u1855\u1872\u1837\u1875\u1838\u1856\u1839\u186b\u1876\u183a\u1857\u1863\u1874\u1889\u183b\u183c\u1854\u186e\u183d\u186f\u1858\u186c\u183e\u1859\u186d\u183f\u1840\u1841\u1842\u185a\u185b\u1870\u188c\u189e\u188d\u188e\u189f\u188f\u1890\u1898\u18a0\u1891\u18a1\u1892\u1893\u18a8\u1894\u18a3\u1895\u1899\u1896\u1897\u18a6\u18a7\u18aa\u18a9\u1c5a\u1c5b\u1c5c\u1c5d\u1c5e\u1c5f\u1c60\u1c61\u1c62\u1c63\u1c64\u1c65\u1c66\u1c67\u1c68\u1c69\u1c6a\u1c6b\u1c6c\u1c6d\u1c6e\u1c6f\u1c70\u1c71\u1c72\u1c73\u1c74\u1c75\u1c76\u1c77\u1c78\u1c79\u1c7a\u1c7b\u1c7c\u1c7d\uab70\u13a0\uab71\u13a1\uab72\u13a2\uab73\u13a3\uab74\u13a4\uab75\u13a5\uab76\u13a6\uab77\u13a7\uab78\u13a8\uab79\u13a9\uab7a\u13aa\uab7b\u13ab\uab7c\u13ac\uab7d\u13ad\uab7e\u13ae\uab7f\u13af\uab80\u13b0\uab81\u13b1\uab82\u13b2\uab83\u13b3\uab84\u13b4\uab85\u13b5\uab86\u13b6\uab87\u13b7\uab88\u13b8\uab89\u13b9\uab8a\u13ba\uab8b\u13bb\uab8c\u13bc\uab8d\u13bd\uab8e\u13be\uab8f\u13bf\uab90\u13c0\uab91\u13c1\uab92\u13c2\uab93\u13c3\uab94\u13c4\uab95\u13c5\uab96\u13c6\uab97\u13c7\uab98\u13c8\uab99\u13c9\uab9a\u13ca\uab9b\u13cb\uab9c\u13cc\uab9d\u13cd\uab9e\u13ce\uab9f\u13cf\uaba0\u13d0\uaba1\u13d1\uaba2\u13d2\uaba3\u13d3\uaba4\u13d4\uaba5\u13d5\uaba6\u13d6\uaba7\u13d7\uaba8\u13d8\uaba9\u13d9\uabaa\u13da\uabab\u13db\uabac\u13dc\uabad\u13dd\uabae\u13de\uabaf\u13df\uabb0\u13e0\uabb1\u13e1\uabb2\u13e2\uabb3\u13e3\uabb4\u13e4\uabb5\u13e5\uabb6\u13e6\uabb7\u13e7\uabb8\u13e8\uabb9\u13e9\uabba\u13ea\uabbb\u13eb\uabbc\u13ec\uabbd\u13ed\uabbe\u13ee\uabbf\u13ef\u13f8\u13f0\u13f9\u13f1\u13fa\u13f2\u13fb\u13f3\u13fc\u13f4\u13fd\u13f5\u1401\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140a\u140b\u140c\u140d\u140e\u140f\u1410\u1411\u1412\u1413\u1414\u1415\u1416\u1417\u1418\u1419\u141a\u141b\u141c\u141d\u141e\u141f\u1420\u1421\u1422\u1423\u1424\u1425\u1426\u1427\u1428\u1429\u142a\u142b\u142c\u142d\u142e\u142f\u1430\u1431\u1432\u1433\u1434\u1435\u1436\u1437\u1438\u1439\u143a\u143b\u143c\u143d\u143e\u143f\u1440\u1441\u1442\u1443\u1444\u1445\u1446\u1447\u1448\u1449\u144a\u144b\u144c\u144d\u144e\u144f\u1450\u1451\u1452\u1453\u1454\u1455\u1456\u1457\u1458\u1459\u145a\u145b\u145c\u145d\u145e\u145f\u1460\u1461\u1462\u1463\u1464\u1465\u1466\u1467\u1468\u1469\u146a\u146b\u146c\u146d\u146e\u146f\u1470\u1471\u1472\u1473\u1474\u1475\u1476\u1477\u1478\u1479\u147a\u147b\u147c\u147d\u147e\u147f\u1480\u1481\u1482\u1483\u1484\u1485\u1486\u1487\u1488\u1489\u148a\u148b\u148c\u148d\u148e\u148f\u1490\u1491\u1492\u1493\u1494\u1495\u1496\u1497\u1498\u1499\u149a\u149b\u149c\u149d\u149e\u149f\u14a0\u14a1\u14a2\u14a3\u14a4\u14a5\u14a6\u14a7\u14a8\u14a9\u14aa\u14ab\u14ac\u14ad\u14ae\u14af\u14b0\u14b1\u14b2\u14b3\u14b4\u14b5\u14b6\u14b7\u14b8\u14b9\u14ba\u14bb\u14bc\u14bd\u14be\u14bf\u14c0\u14c1\u14c2\u14c3\u14c4\u14c5\u14c6\u14c7\u14c8\u14c9\u14ca\u14cb\u14cc\u14cd\u14ce\u14cf\u14d0\u14d1\u14d2\u14d3\u14d4\u14d5\u14d6\u14d7\u14d8\u14d9\u14da\u14db\u14dc\u14dd\u14de\u14df\u14e0\u14e1\u14e2\u14e3\u14e4\u14e5\u14e6\u14e7\u14e8\u14e9\u14ea\u14eb\u14ec\u14ed\u14ee\u14ef\u14f0\u14f1\u14f2\u14f3\u14f4\u14f5\u14f6\u14f7\u14f8\u14f9\u14fa\u14fb\u14fc\u14fd\u14fe\u14ff\u1500\u1501\u1502\u1503\u1504\u1505\u1506\u1507\u1508\u1509\u150a\u150b\u150c\u150d\u150e\u150f\u1510\u1511\u1512\u1513\u1514\u1515\u1516\u1517\u1518\u1519\u151a\u151b\u151c\u151d\u151e\u151f\u1520\u1521\u1522\u1523\u1524\u1525\u1526\u1527\u1528\u1529\u152a\u152b\u152c\u152d\u152e\u152f\u1530\u1531\u1532\u1533\u1534\u1535\u1536\u1537\u1538\u1539\u153a\u153b\u153c\u153d\u153e\u153f\u1540\u1541\u1542\u1543\u1544\u1545\u1546\u1547\u1548\u1549\u154a\u154b\u154c\u154d\u154e\u154f\u1550\u1551\u1552\u1553\u1554\u1555\u1556\u1557\u1558\u1559\u155a\u155b\u155c\u155d\u155e\u155f\u1560\u1561\u1562\u1563\u1564\u1565\u1566\u1567\u1568\u1569\u156a\u156b\u156c\u156d\u156e\u156f\u1570\u1571\u1572\u1573\u1574\u1575\u1576\u1577\u1578\u1579\u157a\u157b\u157d\u166f\u157e\u157f\u1580\u1581\u1582\u1583\u1584\u1585\u1586\u1587\u1588\u1589\u158a\u158b\u158c\u158d\u1670\u158e\u158f\u1590\u1591\u1592\u1593\u1594\u1595\u1671\u1672\u1673\u1674\u1675\u1676\u1596\u1597\u1598\u1599\u159a\u159b\u159c\u159d\u159e\u159f\u15a0\u15a1\u15a2\u15a3\u15a4\u15a5\u15a6\u157c\u15a7\u15a8\u15a9\u15aa\u15ab\u15ac\u15ad\u15ae\u15af\u15b0\u15b1\u15b2\u15b3\u15b4\u15b5\u15b6\u15b7\u15b8\u15b9\u15ba\u15bb\u15bc\u15bd\u15be\u15bf\u15c0\u15c1\u15c2\u15c3\u15c4\u15c5\u15c6\u15c7\u15c8\u15c9\u15ca\u15cb\u15cc\u15cd\u15ce\u15cf\u15d0\u15d1\u15d2\u15d3\u15d4\u15d5\u15d6\u15d7\u15d8\u15d9\u15da\u15db\u15dc\u15dd\u15de\u15df\u15e0\u15e1\u15e2\u15e3\u15e4\u15e5\u15e6\u15e7\u15e8\u15e9\u15ea\u15eb\u15ec\u15ed\u15ee\u15ef\u15f0\u15f1\u15f2\u15f3\u15f4\u15f5\u15f6\u15f7\u15f8\u15f9\u15fa\u15fb\u15fc\u15fd\u15fe\u15ff\u1600\u1601\u1602\u1603\u1604\u1605\u1606\u1607\u1608\u1609\u160a\u160b\u160c\u160d\u160e\u160f\u1610\u1611\u1612\u1613\u1614\u1615\u1616\u1617\u1618\u1619\u161a\u161b\u161c\u161d\u161e\u161f\u1620\u1621\u1622\u1623\u1624\u1625\u1626\u1627\u1628\u1629\u162a\u162b\u162c\u162d\u162e\u162f\u1630\u1631\u1632\u1633\u1634\u1635\u1636\u1637\u1638\u1639\u163a\u163b\u163c\u163d\u163e\u163f\u1640\u1641\u1642\u1643\u1644\u1645\u1646\u1647\u1648\u1649\u164a\u164b\u164c\u164d\u164e\u164f\u1650\u1651\u1652\u1653\u1654\u1655\u1656\u1657\u1658\u1659\u165a\u165b\u165c\u165d\u165e\u165f\u1660\u1661\u1662\u1663\u1664\u1665\u1666\u1667\u1668\u1669\u166a\u166b\u166c\u1677\u1678\u1679\u167a\u167b\u167c\u167d\u167e\u167f\u18b0\u18b1\u18b2\u18b3\u18b4\u18b5\u18b6\u18b7\u18b8\u18b9\u18ba\u18bb\u18bc\u18bd\u18be\u18bf\u18c0\u18c1\u18c2\u18c3\u18c4\u18c5\u18c6\u18c7\u18c8\u18c9\u18ca\u18cb\u18cc\u18cd\u18ce\u18cf\u18d0\u18d1\u18d2\u18d3\u18d4\u18d5\u18d6\u18d7\u18d8\u18d9\u18da\u18db\u18dc\u18dd\u18de\u18df\u18e0\u18e1\u18e2\u18e3\u18e4\u18e5\u18e6\u18e7\u18e8\u18e9\u18ea\u18eb\u18ec\u18ed\u18ee\u18ef\u18f0\u18f1\u18f2\u18f3\u18f4\u18f5\u1681\u1682\u1683\u1684\u1685\u1686\u1687\u1688\u1689\u168a\u168b\u168c\u168d\u168e\u168f\u1690\u1691\u1692\u1693\u1694\u1695\u1696\u1697\u1698\u1699\u169a\u16a0\u16a1\u16a2\u16a4\u16a5\u16a6\u16a7\u16f0\u16a8\u16a9\u16ac\u16ad\u16ae\u16f4\u16af\u16b0\u16b1\u16b2\u16b3\u16b4\u16b5\u16b6\u16f1\u16b7\u16b9\u16e9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0\u16c1\u16c2\u16f5\u16c3\u16c4\u16c5\u16c6\u16ee\u16c7\u16c8\u16d5\u16c9\u16ca\u16cb\u16ea\u16cc\u16cd\u16ce\u16f2\u16cf\u16d0\u16d1\u16d2\u16d3\u16d4\u16d6\u16f6\u16d7\u16d8\u16d9\u16ef\u16da\u16db\u16dc\u16dd\u16de\u16df\u16f3\u16aa\u16f7\u16ab\u16f8\u16a3\u16e0\u16e3\u16b8\u16e4\u16e1\u16e2\u16e5\u16e6\u16e7\u16e8\ua500\ua501\ua502\ua503\ua504\ua505\ua506\ua507\ua508\ua509\ua50a\ua50b\ua50c\ua613\ua50d\ua50e\ua50f\ua510\ua511\ua512\ua513\ua514\ua515\ua516\ua517\ua518\ua519\ua51a\ua51b\ua51c\ua51d\ua51e\ua614\ua51f\ua520\ua521\ua522\ua523\ua524\ua525\ua526\ua527\ua528\ua529\ua52a\ua52b\ua52c\ua52d\ua52e\ua52f\ua530\ua531\ua532\ua533\ua615\ua534\ua535\ua536\ua537\ua538\ua539\ua53a\ua53b\ua53c\ua53d\ua53e\ua53f\ua540\ua541\ua542\ua543\ua544\ua545\ua546\ua547\ua616\ua548\ua549\ua54a\ua54b\ua54c\ua54d\ua54e\ua54f\ua550\ua551\ua552\ua617\ua553\ua554\ua555\ua556\ua557\ua558\ua610\ua618\ua559\ua55a\ua619\ua55b\ua55c\ua55d\ua55e\ua55f\ua560\ua61a\ua561\ua562\ua563\ua564\ua565\ua566\ua567\ua568\ua569\ua56a\ua611\ua56b\ua56c\ua56d\ua56e\ua62a\ua56f\ua570\ua571\ua572\ua573\ua574\ua575\ua576\ua577\ua578\ua579\ua57a\ua57b\ua57c\ua57d\ua57e\ua57f\ua580\ua581\ua582\ua583\ua584\ua585\ua61b\ua586\ua587\ua612\ua588\ua589\ua58a\ua58b\ua58c\ua58d\ua58e\ua58f\ua590\ua591\ua592\ua593\ua594\ua595\ua596\ua597\ua598\ua599\ua59a\ua59b\ua59c\ua59d\ua59e\ua59f\ua5a0\ua5a1\ua5a2\ua5a3\ua5a4\ua5a5\ua5a6\ua5a7\ua5a8\ua5a9\ua5aa\ua5ab\ua5ac\ua5ad\ua5ae\ua5af\ua5b0\ua5b1\ua5b2\ua5b3\ua5b4\ua61c\ua5b5\ua5b6\ua5b7\ua5b8\ua5b9\ua5ba\ua5bb\ua5bc\ua5bd\ua5be\ua5bf\ua5c0\ua5c1\ua5c2\ua5c3\ua5c4\ua5c5\ua5c6\ua5c7\ua5c8\ua5c9\ua5ca\ua5cb\ua61d\ua5cc\ua5cd\ua5ce\ua5cf\ua5d0\ua5d1\ua62b\ua61e\ua5d2\ua5d3\ua5d4\ua5d5\ua5d6\ua5d7\ua5d8\ua61f\ua5d9\ua5da\ua5db\ua5dc\ua5dd\ua5de\ua5df\ua5e0\ua5e1\ua5e2\ua5e3\ua5e4\ua5e5\ua5e6\ua5e7\ua5e8\ua5e9\ua5ea\ua5eb\ua5ec\ua5ed\ua5ee\ua5ef\ua5f0\ua5f1\ua5f2\ua5f3\ua5f4\ua5f5\ua5f6\ua5f7\ua5f8\ua5f9\ua5fa\ua5fb\ua5fc\ua5fd\ua5fe\ua5ff\ua600\ua601\ua602\ua603\ua604\ua605\ua606\ua607\ua608\ua609\ua60a\ua60b\ua60c\ua6a0\ua6a1\ua6a2\ua6a3\ua6a4\ua6a5\ua6a6\ua6a7\ua6a8\ua6a9\ua6aa\ua6ab\ua6ac\ua6ad\ua6ae\ua6af\ua6b0\ua6b1\ua6b2\ua6b3\ua6b4\ua6b5\ua6b6\ua6b7\ua6b8\ua6b9\ua6ba\ua6bb\ua6bc\ua6bd\ua6be\ua6bf\ua6c0\ua6c1\ua6c2\ua6c3\ua6c4\ua6c5\ua6c6\ua6c7\ua6c8\ua6c9\ua6ca\ua6cb\ua6cc\ua6cd\ua6ce\ua6cf\ua6d0\ua6d1\ua6d2\ua6d3\ua6d4\ua6d5\ua6d6\ua6d7\ua6d8\ua6d9\ua6da\ua6db\ua6dc\ua6dd\ua6de\ua6df\ua6e0\ua6e1\ua6e2\ua6e3\ua6e4\ua6e5\ua6e6\ua6e7\ua6e8\ua6e9\ua6ea\ua6eb\ua6ec\ua6ed\ua6ee\ua6ef\u1100\u3131\u3260\uffa1\u326e\u1101\u3132\uffa2\u1102\u3134\u3261\uffa4\u326f\u1103\u3137\u3262\uffa7\u3270\u1104\u3138\uffa8\u1105\u3139\u3263\uffa9\u3271\u1106\u3141\u3264\uffb1\u3272\u1107\u3142\u3265\uffb2\u3273\u1108\u3143\uffb3\u1109\u3145\u3266\uffb5\u3274\u110a\u3146\uffb6\u110b\u3147\u3267\uffb7\u3275\u327e\u110c\u3148\u3268\uffb8\u3276\u327d\u110d\u3149\uffb9\u110e\u314a\u3269\uffba\u3277\u327c\u110f\u314b\u326a\uffbb\u3278\u1110\u314c\u326b\uffbc\u3279\u1111\u314d\u326c\uffbd\u327a\u1112\u314e\u326d\uffbe\u327b\u1113\u1114\u3165\u1115\u3166\u1116\u1117\u1118\u1119\u111a\u3140\uffb0\u111b\u111c\u316e\u111d\u3171\u111e\u3172\u111f\u1120\u3173\u1121\u3144\uffb4\u1122\u3174\u1123\u3175\u1124\u1125\u1126\u1127\u3176\u1128\u1129\u3177\u112a\u112b\u3178\u112c\u3179\u112d\u317a\u112e\u317b\u112f\u317c\u1130\u1131\u1132\u317d\u1133\u1134\u1135\u1136\u317e\u1137\u1138\u1139\u113a\u113b\u113c\u113d\u113e\u113f\u1140\u317f\u1141\u1142\u1143\u1144\u1145\u1146\u1147\u3180\u1148\u1149\u114a\u114b\u114c\u3181\u114d\u114e\u114f\u1150\u1151\u1152\u1153\u1154\u1155\u1156\u1157\u3184\u1158\u3185\u1159\u3186\u115a\u115b\u115c\u115d\u115e\ua960\ua961\ua962\ua963\ua964\ua965\ua966\ua967\ua968\ua969\ua96a\ua96b\ua96c\ua96d\ua96e\ua96f\ua970\ua971\ua972\ua973\ua974\ua975\ua976\ua977\ua978\ua979\ua97a\ua97b\ua97c\u115f\u1160\u3164\uffa0\u1161\u314f\uffc2\u1162\u3150\uffc3\u1163\u3151\uffc4\u1164\u3152\uffc5\u1165\u3153\uffc6\u1166\u3154\uffc7\u1167\u3155\uffca\u1168\u3156\uffcb\u1169\u3157\uffcc\u116a\u3158\uffcd\u116b\u3159\uffce\u116c\u315a\uffcf\u116d\u315b\uffd2\u116e\u315c\uffd3\u116f\u315d\uffd4\u1170\u315e\uffd5\u1171\u315f\uffd6\u1172\u3160\uffd7\u1173\u3161\uffda\u1174\u3162\uffdb\u1175\u3163\uffdc\u1176\u1177\u1178\u1179\u117a\u117b\u117c\u117d\u117e\u117f\u1180\u1181\u1182\u1183\u1184\u3187\u1185\u3188\u1186\u1187\u1188\u3189\u1189\u118a\u118b\u118c\u118d\u118e\u118f\u1190\u1191\u318a\u1192\u318b\u1193\u1194\u318c\u1195\u1196\u1197\u1198\u1199\u119a\u119b\u119c\u119d\u119e\u318d\u119f\u11a0\u11a1\u318e\u11a2\u11a3\u11a4\u11a5\u11a6\u11a7\ud7b0\ud7b1\ud7b2\ud7b3\ud7b4\ud7b5\ud7b6\ud7b7\ud7b8\ud7b9\ud7ba\ud7bb\ud7bc\ud7bd\ud7be\ud7bf\ud7c0\ud7c1\ud7c2\ud7c3\ud7c4\ud7c5\ud7c6\u11a8\u11a9\u11aa\u3133\uffa3\u11ab\u11ac\u3135\uffa5\u11ad\u3136\uffa6\u11ae\u11af\u11b0\u313a\uffaa\u11b1\u313b\uffab\u11b2\u313c\uffac\u11b3\u313d\uffad\u11b4\u313e\uffae\u11b5\u313f\uffaf\u11b6\u11b7\u11b8\u11b9\u11ba\u11bb\u11bc\u11bd\u11be\u11bf\u11c0\u11c1\u11c2\u11c3\u11c4\u11c5\u11c6\u11c7\u3167\u11c8\u3168\u11c9\u11ca\u11cb\u11cc\u3169\u11cd\u11ce\u316a\u11cf\u11d0\u11d1\u11d2\u11d3\u316b\u11d4\u11d5\u11d6\u11d7\u316c\u11d8\u11d9\u316d\u11da\u11db\u11dc\u11dd\u316f\u11de\u11df\u3170\u11e0\u11e1\u11e2\u11e3\u11e4\u11e5\u11e6\u11e7\u11e8\u11e9\u11ea\u11eb\u11ec\u11ed\u11ee\u11ef\u11f0\u11f1\u3182\u11f2\u3183\u11f3\u11f4\u11f5\u11f6\u11f7\u11f8\u11f9\u11fa\u11fb\u11fc\u11fd\u11fe\u11ff\ud7cb\ud7cc\ud7cd\ud7ce\ud7cf\ud7d0\ud7d1\ud7d2\ud7d3\ud7d4\ud7d5\ud7d6\ud7d7\ud7d8\ud7d9\ud7da\ud7db\ud7dc\ud7dd\ud7de\ud7df\ud7e0\ud7e1\ud7e2\ud7e3\ud7e4\ud7e5\ud7e6\ud7e7\ud7e8\ud7e9\ud7ea\ud7eb\ud7ec\ud7ed\ud7ee\ud7ef\ud7f0\ud7f1\ud7f2\ud7f3\ud7f4\ud7f5\ud7f6\ud7f7\ud7f8\ud7f9\ud7fa\ud7fb\u30a1\uff67\u30a2\uff71\u3041\u3042\u32d0\u3303\u3300\u3301\u3302\u30a3\uff68\u30a4\uff72\u3043\u3044\u32d1\u3304\u3305\u30a5\uff69\u30a6\uff73\u3045\u3046\u32d2\u30f4\u3094\u3306\u30a7\uff6a\u30a8\uff74\u3047\u3048\u32d3\u3308\u3307\u30a9\uff6b\u30aa\uff75\u3049\u304a\u32d4\u330a\u3309\u30f5\u30ab\uff76\u3095\u304b\u32d5\u30ac\u304c\u330e\u330f\u330b\u330c\u330d\u30ad\uff77\u304d\u32d6\u30ae\u304e\u3310\u3311\u3313\u3312\u3314\u3315\u3316\u3317\u31f0\u30af\uff78\u304f\u32d7\u30b0\u3050\u3318\u3319\u331a\u331b\u30f6\u30b1\uff79\u3096\u3051\u32d8\u30b2\u3052\u331c\u30b3\uff7a\u3053\u32d9\u30b4\u3054\u331e\u30ff\u331d\u30b5\uff7b\u3055\u32da\u30b6\u3056\u331f\u3320\u31f1\u30b7\uff7c\u3057\u32db\u30b8\u3058\u3006\u3321\u31f2\u30b9\uff7d\u3059\u32dc\u30ba\u305a\u30bb\uff7e\u305b\u32dd\u30bc\u305c\u3322\u3323\u30bd\uff7f\u305d\u32de\u30be\u305e\u30bf\uff80\u305f\u32df\u30c0\u3060\u3324\u30c1\uff81\u3061\u32e0\u30c2\u3062\u30c3\uff6f\u30c4\uff82\u3063\u3064\u32e1\u30c5\u3065\u30c6\uff83\u3066\u32e2\u30c7\u3067\u3325\u31f3\u30c8\uff84\u3068\u32e3\u30c9\u3069\u3326\u3327\u30ca\uff85\u306a\u32e4\u3328\u30cb\uff86\u306b\u32e5\u31f4\u30cc\uff87\u306c\u32e6\u30cd\uff88\u306d\u32e7\u30ce\uff89\u306e\u32e8\u3329\u31f5\u30cf\uff8a\u306f\u32e9\u30d0\u3070\u30d1\u3071\u332b\u332c\u332d\u332a\u31f6\u30d2\uff8b\u3072\u32ea\u30d3\u3073\u30d4\u3074\u332e\u332f\u3330\u3331\u31f7\u30d5\uff8c\u3075\u32eb\u30d6\u3076\u30d7\u3077\u3334\u3332\u3333\u3335\u31f8\u30d8\uff8d\u3078\u32ec\u30d9\u3079\u30da\u307a\u333b\u333c\u3337\u3338\u333a\u3336\u3339\u31f9\u30db\uff8e\u307b\u32ed\u30dc\u307c\u30dd\u307d\u333d\u333e\u3340\u3341\u3342\u333f\u30de\uff8f\u307e\u32ee\u3343\u3344\u303c\u3345\u3346\u3347\u30df\uff90\u307f\u32ef\u3348\u3349\u334a\u31fa\u30e0\uff91\u3080\u32f0\u30e1\uff92\u3081\u32f1\u334d\u334b\u334c\u30e2\uff93\u3082\u32f2\u30e3\uff6c\u30e4\uff94\u3083\u3084\u32f3\u334e\u334f\u30e5\uff6d\u30e6\uff95\u3085\u3086\u32f4\u3350\u30e7\uff6e\u30e8\uff96\u3087\u3088\u32f5\u309f\u31fb\u30e9\uff97\u3089\u32f6\u31fc\u30ea\uff98\u308a\u32f7\u3351\u3352\u31fd\u30eb\uff99\u308b\u32f8\u3354\u3353\u31fe\u30ec\uff9a\u308c\u32f9\u3355\u3356\u31ff\u30ed\uff9b\u308d\u32fa\u30ee\u30ef\uff9c\u308e\u308f\u32fb\u30f7\u3357\u30f0\u3090\u32fc\u30f8\u30f1\u3091\u32fd\u30f9\u30f2\uff66\u3092\u32fe\u30fa\u30f3\uff9d\u3093\u3105\u31a0\u3106\u31b4\u3107\u31ac\u3108\u312a\u3109\u310a\u31b5\u310b\u312f\u310c\u310d\u31bb\u31a3\u310e\u31b6\u312b\u31ad\u310f\u31b7\u3110\u31a2\u3111\u3112\u312c\u31bc\u31bd\u3113\u3114\u3115\u3116\u3117\u31a1\u3118\u3119\u31b8\u31b9\u31ba\u311a\u31a9\u311b\u31a7\u31a6\u311c\u312e\u311d\u31a4\u31a5\u311e\u31ae\u311f\u3120\u31af\u3121\u3122\u3123\u3124\u31b2\u3125\u31b0\u31b1\u3126\u3127\u31aa\u31b3\u3128\u31ab\u31a8\u3129\u312d\u31be\u31bf\ua000\ua001\ua002\ua003\ua004\ua005\ua006\ua007\ua008\ua009\ua00a\ua00b\ua00c\ua00d\ua00e\ua00f\ua010\ua011\ua012\ua013\ua014\ua015\ua016\ua017\ua018\ua019\ua01a\ua01b\ua01c\ua01d\ua01e\ua01f\ua020\ua021\ua022\ua023\ua024\ua025\ua026\ua027\ua028\ua029\ua02a\ua02b\ua02c\ua02d\ua02e\ua02f\ua030\ua031\ua032\ua033\ua034\ua035\ua036\ua037\ua038\ua039\ua03a\ua03b\ua03c\ua03d\ua03e\ua03f\ua040\ua041\ua042\ua043\ua044\ua045\ua046\ua047\ua048\ua049\ua04a\ua04b\ua04c\ua04d\ua04e\ua04f\ua050\ua051\ua052\ua053\ua054\ua055\ua056\ua057\ua058\ua059\ua05a\ua05b\ua05c\ua05d\ua05e\ua05f\ua060\ua061\ua062\ua063\ua064\ua065\ua066\ua067\ua068\ua069\ua06a\ua06b\ua06c\ua06d\ua06e\ua06f\ua070\ua071\ua072\ua073\ua074\ua075\ua076\ua077\ua078\ua079\ua07a\ua07b\ua07c\ua07d\ua07e\ua07f\ua080\ua081\ua082\ua083\ua084\ua085\ua086\ua087\ua088\ua089\ua08a\ua08b\ua08c\ua08d\ua08e\ua08f\ua090\ua091\ua092\ua093\ua094\ua095\ua096\ua097\ua098\ua099\ua09a\ua09b\ua09c\ua09d\ua09e\ua09f\ua0a0\ua0a1\ua0a2\ua0a3\ua0a4\ua0a5\ua0a6\ua0a7\ua0a8\ua0a9\ua0aa\ua0ab\ua0ac\ua0ad\ua0ae\ua0af\ua0b0\ua0b1\ua0b2\ua0b3\ua0b4\ua0b5\ua0b6\ua0b7\ua0b8\ua0b9\ua0ba\ua0bb\ua0bc\ua0bd\ua0be\ua0bf\ua0c0\ua0c1\ua0c2\ua0c3\ua0c4\ua0c5\ua0c6\ua0c7\ua0c8\ua0c9\ua0ca\ua0cb\ua0cc\ua0cd\ua0ce\ua0cf\ua0d0\ua0d1\ua0d2\ua0d3\ua0d4\ua0d5\ua0d6\ua0d7\ua0d8\ua0d9\ua0da\ua0db\ua0dc\ua0dd\ua0de\ua0df\ua0e0\ua0e1\ua0e2\ua0e3\ua0e4\ua0e5\ua0e6\ua0e7\ua0e8\ua0e9\ua0ea\ua0eb\ua0ec\ua0ed\ua0ee\ua0ef\ua0f0\ua0f1\ua0f2\ua0f3\ua0f4\ua0f5\ua0f6\ua0f7\ua0f8\ua0f9\ua0fa\ua0fb\ua0fc\ua0fd\ua0fe\ua0ff\ua100\ua101\ua102\ua103\ua104\ua105\ua106\ua107\ua108\ua109\ua10a\ua10b\ua10c\ua10d\ua10e\ua10f\ua110\ua111\ua112\ua113\ua114\ua115\ua116\ua117\ua118\ua119\ua11a\ua11b\ua11c\ua11d\ua11e\ua11f\ua120\ua121\ua122\ua123\ua124\ua125\ua126\ua127\ua128\ua129\ua12a\ua12b\ua12c\ua12d\ua12e\ua12f\ua130\ua131\ua132\ua133\ua134\ua135\ua136\ua137\ua138\ua139\ua13a\ua13b\ua13c\ua13d\ua13e\ua13f\ua140\ua141\ua142\ua143\ua144\ua145\ua146\ua147\ua148\ua149\ua14a\ua14b\ua14c\ua14d\ua14e\ua14f\ua150\ua151\ua152\ua153\ua154\ua155\ua156\ua157\ua158\ua159\ua15a\ua15b\ua15c\ua15d\ua15e\ua15f\ua160\ua161\ua162\ua163\ua164\ua165\ua166\ua167\ua168\ua169\ua16a\ua16b\ua16c\ua16d\ua16e\ua16f\ua170\ua171\ua172\ua173\ua174\ua175\ua176\ua177\ua178\ua179\ua17a\ua17b\ua17c\ua17d\ua17e\ua17f\ua180\ua181\ua182\ua183\ua184\ua185\ua186\ua187\ua188\ua189\ua18a\ua18b\ua18c\ua18d\ua18e\ua18f\ua190\ua191\ua192\ua193\ua194\ua195\ua196\ua197\ua198\ua199\ua19a\ua19b\ua19c\ua19d\ua19e\ua19f\ua1a0\ua1a1\ua1a2\ua1a3\ua1a4\ua1a5\ua1a6\ua1a7\ua1a8\ua1a9\ua1aa\ua1ab\ua1ac\ua1ad\ua1ae\ua1af\ua1b0\ua1b1\ua1b2\ua1b3\ua1b4\ua1b5\ua1b6\ua1b7\ua1b8\ua1b9\ua1ba\ua1bb\ua1bc\ua1bd\ua1be\ua1bf\ua1c0\ua1c1\ua1c2\ua1c3\ua1c4\ua1c5\ua1c6\ua1c7\ua1c8\ua1c9\ua1ca\ua1cb\ua1cc\ua1cd\ua1ce\ua1cf\ua1d0\ua1d1\ua1d2\ua1d3\ua1d4\ua1d5\ua1d6\ua1d7\ua1d8\ua1d9\ua1da\ua1db\ua1dc\ua1dd\ua1de\ua1df\ua1e0\ua1e1\ua1e2\ua1e3\ua1e4\ua1e5\ua1e6\ua1e7\ua1e8\ua1e9\ua1ea\ua1eb\ua1ec\ua1ed\ua1ee\ua1ef\ua1f0\ua1f1\ua1f2\ua1f3\ua1f4\ua1f5\ua1f6\ua1f7\ua1f8\ua1f9\ua1fa\ua1fb\ua1fc\ua1fd\ua1fe\ua1ff\ua200\ua201\ua202\ua203\ua204\ua205\ua206\ua207\ua208\ua209\ua20a\ua20b\ua20c\ua20d\ua20e\ua20f\ua210\ua211\ua212\ua213\ua214\ua215\ua216\ua217\ua218\ua219\ua21a\ua21b\ua21c\ua21d\ua21e\ua21f\ua220\ua221\ua222\ua223\ua224\ua225\ua226\ua227\ua228\ua229\ua22a\ua22b\ua22c\ua22d\ua22e\ua22f\ua230\ua231\ua232\ua233\ua234\ua235\ua236\ua237\ua238\ua239\ua23a\ua23b\ua23c\ua23d\ua23e\ua23f\ua240\ua241\ua242\ua243\ua244\ua245\ua246\ua247\ua248\ua249\ua24a\ua24b\ua24c\ua24d\ua24e\ua24f\ua250\ua251\ua252\ua253\ua254\ua255\ua256\ua257\ua258\ua259\ua25a\ua25b\ua25c\ua25d\ua25e\ua25f\ua260\ua261\ua262\ua263\ua264\ua265\ua266\ua267\ua268\ua269\ua26a\ua26b\ua26c\ua26d\ua26e\ua26f\ua270\ua271\ua272\ua273\ua274\ua275\ua276\ua277\ua278\ua279\ua27a\ua27b\ua27c\ua27d\ua27e\ua27f\ua280\ua281\ua282\ua283\ua284\ua285\ua286\ua287\ua288\ua289\ua28a\ua28b\ua28c\ua28d\ua28e\ua28f\ua290\ua291\ua292\ua293\ua294\ua295\ua296\ua297\ua298\ua299\ua29a\ua29b\ua29c\ua29d\ua29e\ua29f\ua2a0\ua2a1\ua2a2\ua2a3\ua2a4\ua2a5\ua2a6\ua2a7\ua2a8\ua2a9\ua2aa\ua2ab\ua2ac\ua2ad\ua2ae\ua2af\ua2b0\ua2b1\ua2b2\ua2b3\ua2b4\ua2b5\ua2b6\ua2b7\ua2b8\ua2b9\ua2ba\ua2bb\ua2bc\ua2bd\ua2be\ua2bf\ua2c0\ua2c1\ua2c2\ua2c3\ua2c4\ua2c5\ua2c6\ua2c7\ua2c8\ua2c9\ua2ca\ua2cb\ua2cc\ua2cd\ua2ce\ua2cf\ua2d0\ua2d1\ua2d2\ua2d3\ua2d4\ua2d5\ua2d6\ua2d7\ua2d8\ua2d9\ua2da\ua2db\ua2dc\ua2dd\ua2de\ua2df\ua2e0\ua2e1\ua2e2\ua2e3\ua2e4\ua2e5\ua2e6\ua2e7\ua2e8\ua2e9\ua2ea\ua2eb\ua2ec\ua2ed\ua2ee\ua2ef\ua2f0\ua2f1\ua2f2\ua2f3\ua2f4\ua2f5\ua2f6\ua2f7\ua2f8\ua2f9\ua2fa\ua2fb\ua2fc\ua2fd\ua2fe\ua2ff\ua300\ua301\ua302\ua303\ua304\ua305\ua306\ua307\ua308\ua309\ua30a\ua30b\ua30c\ua30d\ua30e\ua30f\ua310\ua311\ua312\ua313\ua314\ua315\ua316\ua317\ua318\ua319\ua31a\ua31b\ua31c\ua31d\ua31e\ua31f\ua320\ua321\ua322\ua323\ua324\ua325\ua326\ua327\ua328\ua329\ua32a\ua32b\ua32c\ua32d\ua32e\ua32f\ua330\ua331\ua332\ua333\ua334\ua335\ua336\ua337\ua338\ua339\ua33a\ua33b\ua33c\ua33d\ua33e\ua33f\ua340\ua341\ua342\ua343\ua344\ua345\ua346\ua347\ua348\ua349\ua34a\ua34b\ua34c\ua34d\ua34e\ua34f\ua350\ua351\ua352\ua353\ua354\ua355\ua356\ua357\ua358\ua359\ua35a\ua35b\ua35c\ua35d\ua35e\ua35f\ua360\ua361\ua362\ua363\ua364\ua365\ua366\ua367\ua368\ua369\ua36a\ua36b\ua36c\ua36d\ua36e\ua36f\ua370\ua371\ua372\ua373\ua374\ua375\ua376\ua377\ua378\ua379\ua37a\ua37b\ua37c\ua37d\ua37e\ua37f\ua380\ua381\ua382\ua383\ua384\ua385\ua386\ua387\ua388\ua389\ua38a\ua38b\ua38c\ua38d\ua38e\ua38f\ua390\ua391\ua392\ua393\ua394\ua395\ua396\ua397\ua398\ua399\ua39a\ua39b\ua39c\ua39d\ua39e\ua39f\ua3a0\ua3a1\ua3a2\ua3a3\ua3a4\ua3a5\ua3a6\ua3a7\ua3a8\ua3a9\ua3aa\ua3ab\ua3ac\ua3ad\ua3ae\ua3af\ua3b0\ua3b1\ua3b2\ua3b3\ua3b4\ua3b5\ua3b6\ua3b7\ua3b8\ua3b9\ua3ba\ua3bb\ua3bc\ua3bd\ua3be\ua3bf\ua3c0\ua3c1\ua3c2\ua3c3\ua3c4\ua3c5\ua3c6\ua3c7\ua3c8\ua3c9\ua3ca\ua3cb\ua3cc\ua3cd\ua3ce\ua3cf\ua3d0\ua3d1\ua3d2\ua3d3\ua3d4\ua3d5\ua3d6\ua3d7\ua3d8\ua3d9\ua3da\ua3db\ua3dc\ua3dd\ua3de\ua3df\ua3e0\ua3e1\ua3e2\ua3e3\ua3e4\ua3e5\ua3e6\ua3e7\ua3e8\ua3e9\ua3ea\ua3eb\ua3ec\ua3ed\ua3ee\ua3ef\ua3f0\ua3f1\ua3f2\ua3f3\ua3f4\ua3f5\ua3f6\ua3f7\ua3f8\ua3f9\ua3fa\ua3fb\ua3fc\ua3fd\ua3fe\ua3ff\ua400\ua401\ua402\ua403\ua404\ua405\ua406\ua407\ua408\ua409\ua40a\ua40b\ua40c\ua40d\ua40e\ua40f\ua410\ua411\ua412\ua413\ua414\ua415\ua416\ua417\ua418\ua419\ua41a\ua41b\ua41c\ua41d\ua41e\ua41f\ua420\ua421\ua422\ua423\ua424\ua425\ua426\ua427\ua428\ua429\ua42a\ua42b\ua42c\ua42d\ua42e\ua42f\ua430\ua431\ua432\ua433\ua434\ua435\ua436\ua437\ua438\ua439\ua43a\ua43b\ua43c\ua43d\ua43e\ua43f\ua440\ua441\ua442\ua443\ua444\ua445\ua446\ua447\ua448\ua449\ua44a\ua44b\ua44c\ua44d\ua44e\ua44f\ua450\ua451\ua452\ua453\ua454\ua455\ua456\ua457\ua458\ua459\ua45a\ua45b\ua45c\ua45d\ua45e\ua45f\ua460\ua461\ua462\ua463\ua464\ua465\ua466\ua467\ua468\ua469\ua46a\ua46b\ua46c\ua46d\ua46e\ua46f\ua470\ua471\ua472\ua473\ua474\ua475\ua476\ua477\ua478\ua479\ua47a\ua47b\ua47c\ua47d\ua47e\ua47f\ua480\ua481\ua482\ua483\ua484\ua485\ua486\ua487\ua488\ua489\ua48a\ua48b\ua48c\ua4f8\ua4f9\ua4fa\ua4fb\ua4fd\ua4fc\ua4d0\ua4d1\ua4d2\ua4d3\ua4d4\ua4d5\ua4d6\ua4d7\ua4d8\ua4d9\ua4da\ua4db\ua4dc\ua4dd\ua4de\ua4df\ua4e0\ua4e1\ua4e2\ua4e3\ua4e4\ua4e5\ua4e6\ua4e7\ua4e8\ua4e9\ua4eb\ua4ed\ua4ea\ua4ec\ua4ee\ua4ef\ua4f0\ua4f1\ua4f2\ua4f3\ua4f4\ua4f5\ua4f6\ua4f7\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08\u4e09\u4e0a\u4e0b\u4e0c\u4e90\u5344\u4e0d\u4e0e\u4e0f\u4e10\u4e11\u4e12\u4e13\u4e17\u4e14\u4e15\u4e16\u4e18\u4e19\u4e1a\u4e1b\u4e1c\u4e1d\u3400\u4e1e\u4e1f\u4e20\u4e21\u4e22\u3401\u3402\u4e23\u4e24\u4e25\u4e3d\u9fd6\u4e26\u4e27\u9fd7\u4db6\u4e28\u4e29\u4e2a\u4e2b\u3403\u3404\u4e2d\u4e2e\u4e2f\u4e30\u4e31\u4e32\u4e33\u4e34\u4e35\u4e36\u4e37\u4e38\u4e49\u4e39\u4e3a\u4e3b\u4e3c\u4e3e\u4e3f\u4e40\u4e41\u4e42\u4e43\u4e44\u3405\u4e45\u4e46\u4e47\u4e48\u4e4a\u4e4b\u4e4c\u5c39\u4e4d\u4e4e\u4e4f\u4e50\u4e51\u4e52\u4e53\u4e54\u3406\u4e55\u4e56\u4e57\u4e58\u4e59\u4e5a\u4e5b\u4e5c\u4e5d\u9fb4\u4e5e\u4e5f\u4e60\u3407\u3408\u3409\u4e63\u4e64\u4e65\u4e66\u340a\u340b\u4e67\u340c\u340d\u340e\u340f\u4e68\u4e69\u4e6a\u4e6b\u4e6c\u4e6d\u4e6e\u4e6f\u4e70\u3410\u3411\u3412\u3413\u3414\u3415\u4e71\u4e72\u3416\u3417\u3418\u4e73\u4e74\u4e75\u4e76\u4e77\u4e78\u3419\u341a\u341b\u4e79\u4e7a\u4e7b\u4e7c\u341c\u341d\u341e\u341f\u3420\u4e7d\u4e7e\u4e7f\u4e80\u3421\u3422\u3423\u4e81\u3424\u4e82\u4e83\u4e84\u3425\u3426\u4e85\u4e86\u4e87\u4e88\u3427\u4e89\u4e8a\u4e8b\u3428\u4e8c\u4e8d\u4e8e\u4e8f\u4e91\u4e92\u4e93\u4e94\u4e95\u4e96\u4e97\u4e98\u4e99\u4e9a\u4e9b\u4e9c\u4e9d\u4e9e\u4e9f\u3429\u4ea0\u4ea1\u4ea2\u4ea3\u4ea4\u4ea5\u4ea6\u4ea7\u342a\u342b\u4ea8\u4ea9\u4eaa\u342c\u4eab\u4eac\u342d\u4ead\u4eae\u4eaf\u4eb0\u4eb1\u4eb2\u4eb3\u4eb4\u4eb5\u4eb6\u4eb7\u342e\u4eb8\u342f\u4eb9\u4eba\u4ebb\u4ebc\u4ebd\u4ebe\u4ebf\u4ec0\u4ec1\u4ec2\u4ec3\u4ec4\u4ec5\u4ec6\u4ec7\u4ec8\u4ec9\u4eca\u4ecb\u4ecc\u4ecd\u4ece\u4ecf\u4ed0\u4ed1\u4ed2\u4ed3\u4ed4\u4ed5\u4ed6\u4ed7\u4ed8\u4ed9\u4eda\u4edb\u4edc\u4edd\u4ede\u4edf\u4ee0\u4ee1\u4ee2\u4ee3\u4ee4\u4ee5\u4ee6\u4ee7\u4ee8\u4ee9\u4eea\u4eeb\u4eec\u4eed\u3430\u3431\u3432\u3433\u3434\u3435\u3436\u3437\u4eee\u4eef\u4ef0\u4ef1\u4ef2\u4ef3\u4ef4\u4ef5\u4ef6\u4ef7\u4ef8\u4ef9\u4efa\u4efb\u4efc\u4efd\u4efe\u4eff\u4f00\u4f01\u4f02\u4f03\u4f04\u4f05\u4f06\u4f07\u4f08\u4f09\u4f0a\u4f0b\u4f0c\u4f0d\u4f0e\u4f0f\u4f10\u4f11\u4f12\u4f13\u4f14\u4f15\u4f16\u4f17\u4f18\u4f19\u4f1a\u4f1b\u4f1c\u4f1d\u4f1e\u4f1f\u4f20\u4f21\u4f22\u4f23\u4f24\u4f25\u4f26\u4f27\u4f28\u4f29\u4f2a\u4f2b\u4f2c\u4f64\u3438\u3439\u343a\u343b\u343c\u343d\u343e\u343f\u3440\u4f2d\u4f2e\u4f2f\u4f30\u4f31\u4f32\u4f33\u4f34\u4f35\u4f36\u4f37\u4f38\u4f39\u4f3a\u4f3b\u4f3c\u4f3d\u4f3e\u4f3f\u4f40\u4f41\u4f42\u4f43\u4f44\u4f45\u4f46\u4f47\u4f48\u4f49\u4f4a\u4f4b\u4f4c\u4f4d\u4f4e\u4f4f\u4f50\u4f51\u4f52\u4f53\u4f54\u4f55\u4f56\u4f57\u4f58\u4f59\u4f5a\u4f5b\u4f5c\u4f5d\u4f5e\u4f5f\u4f60\u4f61\u4f62\u4f63\u4f65\u4f66\u4f67\u4f68\u3441\u3442\u3443\u3444\u3445\u3446\u3447\u3448\u4f69\u4f6a\u4f6b\u4f6c\u4f6d\u4f6e\u4f6f\u4f70\u4f71\u4f72\u4f73\u4f74\u4f75\u4f76\u4f77\u4f78\u4f79\u4f7a\u4f7b\u4f7c\u4f7d\u4f7e\u4f7f\u4f80\u4f81\u4f82\u4f83\u4f84\u4f85\u4f86\u4f87\u4f88\u4f89\u4f8a\u4f8b\u4f8c\u4f8d\u4f8e\u4f8f\u4f90\u4f91\u4f92\u4f93\u4f94\u4f95\u4f96\u4f97\u4f98\u4f99\u4f9a\u4f9b\u4f9c\u4f9d\u4f9e\u4f9f\u4fa0\u4fa1\u4fa2\u4fa3\u4fa4\u4fa5\u4fa6\u4fa7\u4fa8\u4fa9\u4faa\u4fab\u4fac\u4fad\u9fc7\u3449\u344a\u344b\u344c\u344d\u344e\u344f\u3450\u3451\u3452\u3453\u3454\u3455\u3456\u4fae\u4faf\u4fb0\u4fb1\u4fb2\u4fb3\u4fb4\u4fb5\u4fb6\u4fb7\u4fb8\u4fb9\u4fba\u4fbb\u4fbc\u4fbd\u4fbe\u4fbf\u4fc0\u4fc1\u4fc2\u4fc3\u4fc4\u4fc5\u4fc6\u4fc7\u4fc8\u4fc9\u4fca\u4fcb\u4fcc\u4fcd\u4fce\u4fcf\u4fd0\u4fd1\u4fd2\u4fd3\u4fd4\u4fd5\u4fd6\u4fd7\u4fd8\u4fd9\u4fda\u4fdb\u4fdc\u4fdd\u4fde\u4fdf\u4fe0\u4fe1\u4fe2\u4fe3\u4fe4\u4fe5\u4fe6\u4fe7\u4fe8\u4fe9\u4fea\u4feb\u4fec\u4fed\u3457\u3458\u3459\u345a\u345b\u345c\u345d\u345e\u345f\u3460\u3461\u3462\u4fee\u4fef\u4ff0\u4ff1\u4ff2\u4ff3\u4ff4\u4ff5\u4ff6\u4ff7\u4ff8\u4ff9\u4ffa\u4ffb\u4ffc\u4ffd\u4ffe\u4fff\u5000\u5001\u5002\u5003\u5004\u5005\u5006\u5007\u5008\u5009\u500a\u500b\u500c\u500d\u500e\u500f\u5010\u5011\u5012\u5013\u5014\u5015\u5016\u5017\u5018\u5019\u501a\u501b\u501c\u501d\u501e\u501f\u5020\u5021\u5022\u5023\u5024\u5025\u5026\u5027\u5028\u5029\u502a\u502b\u502c\u502d\u502e\u502f\u5030\u5031\u5032\u5033\u5034\u5035\u5036\u5037\u5038\u5039\u503a\u503b\u503c\u503d\u503e\u503f\u3463\u3465\u3466\u3467\u3468\u3469\u346a\u346b\u346c\u346d\u5040\u5041\u5042\u5043\u5044\u5045\u5046\u5047\u5048\u5049\u504a\u504b\u504c\u504d\u504e\u504f\u5050\u5051\u5052\u5053\u5054\u5055\u5056\u5057\u5058\u5059\u505a\u505b\u505c\u505d\u505e\u505f\u5060\u5061\u5062\u5063\u5064\u5065\u5066\u5067\u5068\u5069\u506a\u506b\u506c\u506d\u506e\u506f\u5070\u5071\u5072\u5073\u5074\u5075\u5076\u5077\u5078\u5079\u507a\u507b\u507c\u507d\u507e\u507f\u3464\u346e\u346f\u3470\u3471\u3472\u5080\u5081\u5082\u5083\u5084\u5085\u5086\u5087\u5088\u5089\u508a\u508b\u508c\u508d\u508e\u508f\u5090\u5091\u5092\u5093\u5094\u5095\u5096\u5097\u5098\u5099\u509a\u509b\u509c\u509d\u509e\u509f\u50a0\u50a1\u50a2\u50a3\u50a4\u50a5\u50a6\u50a7\u50a8\u50a9\u9fd8\u3473\u3474\u3475\u3476\u3477\u3478\u3479\u347a\u50aa\u50ab\u50ac\u50ad\u50ae\u50af\u50b0\u50b1\u50b2\u50b3\u50b4\u50b5\u50b6\u50b7\u50b8\u50b9\u50ba\u50bb\u50bc\u50bd\u50be\u50bf\u50c0\u50c1\u50c2\u50c3\u50c4\u50c5\u50c6\u50c7\u50c8\u50c9\u50ca\u50cb\u50cc\u50cd\u9fd9\u347b\u347c\u347d\u347e\u347f\u3480\u3481\u50ce\u50cf\u50d0\u50d1\u50d2\u50d3\u50d4\u50d5\u50d6\u50d7\u50d8\u50d9\u50da\u50db\u50dc\u50dd\u50de\u50df\u50e0\u50e1\u50e2\u50e3\u50e4\u50e5\u50e6\u50e7\u50e8\u50e9\u50ea\u50eb\u50ec\u50ed\u50ee\u50ef\u50f0\u50f1\u50f3\u50f4\u50f7\u3482\u3483\u3484\u3485\u3486\u3487\u3488\u3489\u348a\u348b\u348c\u348d\u348e\u348f\u3490\u50f2\u50f5\u50f6\u50f8\u50f9\u50fa\u50fb\u50fc\u50fd\u50fe\u50ff\u5100\u5101\u5102\u5103\u5104\u5105\u5106\u5107\u5108\u5109\u510a\u510b\u510c\u510d\u510e\u510f\u3491\u3492\u3493\u3494\u3495\u3496\u3497\u3498\u5110\u5111\u5112\u5113\u5114\u5115\u5116\u5117\u5118\u5119\u511a\u511b\u511c\u511d\u511e\u512b\u9fda\u3499\u349a\u349b\u349c\u511f\u5120\u5121\u5122\u5123\u5124\u5125\u5126\u5127\u5128\u5129\u512a\u512c\u349d\u349e\u512d\u512e\u512f\u5130\u5131\u5132\u349f\u34a0\u5133\u5134\u5135\u34a1\u34a2\u34a3\u5136\u34a4\u34a5\u34a6\u5137\u5138\u5139\u513a\u34a7\u34a8\u513b\u513c\u513d\u34a9\u513e\u34aa\u513f\u5140\u5141\u5142\u5143\u5144\u5145\u5146\u5147\u5148\u5149\u514a\u34ab\u514b\u514c\u514d\u514e\u514f\u5150\u5151\u5152\u5153\u5154\u5155\u5156\u34ac\u5157\u5158\u5159\u515a\u515b\u34ad\u515c\u515d\u515e\u34ae\u515f\u5160\u5161\u5162\u5163\u34af\u5164\u5165\u5166\u5167\u34b0\u34b1\u5168\u6c3d\u34b2\u34b3\u34b4\u5169\u516a\u516b\u516c\u516d\u516e\u516f\u5170\u5171\u5172\u5173\u5174\u9fb9\u5175\u34b5\u34b6\u34b7\u5176\u5177\u5178\u5179\u517b\u34b8\u517a\u517c\u517d\u517e\u517f\u5180\u5181\u34b9\u5182\u5183\u5184\u5185\u5186\u5187\u5188\u5189\u518a\u518b\u518c\u518d\u518e\u518f\u5190\u34ba\u5191\u5192\u5193\u5194\u5195\u34bb\u34bc\u6700\u34bd\u34be\u34bf\u5196\u5197\u5198\u34c0\u34c1\u5199\u519a\u519b\u519c\u519d\u519e\u519f\u51a0\u34c2\u51a1\u51a2\u51a3\u51a4\u51a5\u51a6\u51a7\u51a8\u34c3\u51a9\u34c4\u51aa\u51ab\u34c5\u51ac\u51ad\u51ae\u51af\u51b0\u51b1\u51b2\u51b3\u51b4\u34c6\u34c7\u51b5\u51b6\u51b7\u51b8\u51b9\u51ba\u51bb\u9fd1\u34c8\u51bc\u51bd\u51be\u51bf\u51c0\u34c9\u34ca\u34cb\u34cc\u34cd\u51c1\u51c2\u51c3\u34ce\u34cf\u51c4\u51c5\u51c6\u51c7\u51c8\u51c9\u51ca\u51cb\u51cc\u51cd\u51ce\u34d0\u34d1\u34d2\u51cf\u51d0\u51d1\u34d3\u51d2\u51d3\u51d4\u51d5\u51d6\u34d4\u34d5\u51d7\u34d6\u51d8\u34d7\u51d9\u51da\u51db\u51dc\u51dd\u51de\u51df\u9fdb\u51e0\u51e1\u51e2\u51e3\u51e4\u51e5\u51e6\u51e7\u51e8\u51e9\u51ea\u51eb\u51ec\u51ed\u51ee\u51ef\u51f0\u34d8\u51f1\u51f2\u51f3\u51f4\u51f5\u51f6\u51f7\u51f8\u51f9\u51fa\u51fb\u51fc\u34d9\u51fd\u51fe\u51ff\u5200\u5201\u5202\u5203\u5204\u5205\u5206\u5207\u5208\u5209\u520a\u520b\u520c\u520d\u34da\u34db\u34dc\u520e\u520f\u5210\u5211\u5212\u5213\u5214\u5215\u5216\u5217\u5218\u5219\u521a\u521b\u34dd\u34de\u521c\u521d\u521e\u521f\u5220\u5221\u5222\u5223\u5224\u5225\u5226\u5227\u5228\u5229\u522a\u522b\u522c\u522d\u34df\u34e0\u522e\u522f\u5230\u5231\u5232\u5233\u5234\u5235\u5236\u5237\u5238\u5239\u523a\u523b\u523c\u523d\u523e\u523f\u5240\u5241\u5242\u34e1\u34e2\u34e3\u34e4\u34e5\u34e6\u5243\u5244\u5245\u5246\u5247\u5248\u5249\u524a\u524b\u524c\u524d\u524e\u524f\u5250\u5251\u34e7\u34e8\u34e9\u34ea\u34eb\u5252\u5253\u5254\u5255\u5256\u5257\u5258\u5259\u525a\u525b\u525c\u525d\u525e\u525f\u5260\u5261\u5262\u5263\u5264\u5265\u5266\u5267\u34ec\u34ed\u34ee\u34ef\u34f0\u5268\u526a\u526b\u526c\u526d\u526e\u526f\u5270\u5271\u5276\u34f1\u34f2\u34f3\u34f4\u34f5\u34f6\u5269\u5272\u5273\u5274\u5275\u34f7\u34f8\u34f9\u34fa\u34fb\u5277\u5278\u5279\u527a\u527b\u527c\u527d\u527e\u527f\u34fc\u34fd\u5280\u5281\u5282\u5283\u5284\u34fe\u34ff\u3500\u3501\u3502\u3503\u3504\u3505\u3506\u3507\u3508\u3509\u5285\u5286\u5287\u5288\u5289\u528a\u528b\u528c\u528d\u528e\u528f\u350a\u5290\u5291\u5292\u5293\u5294\u350b\u350c\u350d\u5295\u350e\u350f\u3510\u5296\u3511\u3512\u5297\u5298\u5299\u529a\u529b\u529c\u529d\u529e\u529f\u52a0\u52a1\u52a2\u3513\u361e\u52a3\u52a4\u52a5\u52a6\u52a7\u52a8\u3514\u3515\u3516\u52a9\u52aa\u52ab\u52ac\u52ad\u52ae\u52af\u52b0\u52b1\u52b2\u52b3\u52b4\u3517\u3518\u52b5\u52b6\u52b7\u52b8\u52b9\u52ba\u52bb\u52bc\u52bd\u52be\u52bf\u3519\u351a\u351b\u52c0\u52c1\u52c2\u52c3\u52c4\u52c5\u52c6\u52c7\u52c8\u52c9\u52ca\u52cb\u351c\u52cc\u52cd\u52ce\u52cf\u52d0\u52d1\u351d\u351e\u351f\u52d2\u52d3\u52d4\u52d5\u52d6\u52d8\u52d9\u52da\u3520\u52db\u52dc\u52dd\u52de\u3521\u52df\u52e0\u52e1\u52e2\u52e3\u52e4\u52e5\u52e6\u52e7\u52e8\u52e9\u52ea\u52eb\u52ec\u52ed\u3522\u52ee\u52ef\u52f0\u52f1\u52f2\u52f3\u52f4\u52f5\u52f6\u3523\u3524\u3525\u3526\u3527\u52f7\u52f8\u52f9\u52fa\u52fb\u52fc\u52fd\u52fe\u52ff\u5300\u5301\u5302\u5303\u5304\u5305\u5306\u5307\u5308\u5309\u530a\u530b\u530c\u530d\u530e\u530f\u5310\u3528\u5311\u5312\u3529\u5313\u352a\u5314\u5315\u5316\u352b\u5317\u352c\u5318\u5319\u352d\u531a\u531b\u531c\u531d\u531e\u531f\u5320\u5321\u5322\u5323\u5324\u5325\u352f\u3530\u5326\u5327\u5328\u5329\u532a\u532b\u9fa8\u532c\u532d\u532e\u3531\u532f\u3532\u3533\u3534\u5330\u5331\u5332\u3535\u5333\u5334\u5335\u5336\u5337\u3536\u5338\u5339\u533a\u533b\u3537\u533c\u533d\u533e\u533f\u5340\u3538\u5341\u5342\u5343\u5345\u5346\u5347\u5348\u3539\u5349\u534a\u534c\u534b\u534d\u534e\u534f\u5350\u353a\u353b\u5351\u5352\u5353\u5354\u5355\u5356\u9fba\u5357\u5358\u5359\u535a\u353c\u535b\u535c\u535d\u535e\u535f\u5360\u5361\u5362\u5363\u5364\u5365\u5366\u5367\u353d\u5368\u5369\u536a\u536b\u353e\u353f\u536c\u536d\u536e\u536f\u5370\u5371\u5372\u5373\u5374\u5375\u3540\u5376\u5377\u5378\u5379\u537a\u3541\u537b\u537c\u537d\u537e\u537f\u5380\u5381\u5382\u5383\u5384\u5385\u5386\u5387\u5388\u5389\u538a\u538b\u538c\u538d\u3542\u3543\u3544\u538e\u538f\u5390\u5391\u3545\u3546\u3547\u5392\u5393\u5394\u5395\u3548\u3549\u5396\u5397\u5398\u5399\u539a\u539b\u354a\u539c\u539d\u539e\u539f\u8652\u354b\u354c\u354d\u53a0\u53a1\u53a2\u53a3\u53a9\u53a4\u53a5\u53a6\u53a7\u53a8\u354e\u53aa\u53ab\u354f\u53ac\u53ad\u53ae\u53af\u53b0\u3550\u3551\u53b1\u53b2\u3552\u53b3\u3553\u53b4\u3554\u53b5\u53b6\u53b7\u53b8\u53b9\u3555\u53ba\u53bb\u53bc\u53bd\u53be\u53bf\u53c0\u53c1\u53c2\u3556\u53c3\u53c4\u3557\u3558\u53c5\u53c6\u53c7\u3559\u53c8\u53c9\u53ca\u53cb\u53cc\u53cd\u53ce\u355a\u355b\u53cf\u53d0\u53d1\u53d2\u355c\u53d3\u355d\u53d4\u53d5\u53d6\u53d7\u53d8\u355e\u53d9\u53da\u53db\u53dc\u53dd\u355f\u53de\u53df\u3560\u53e0\ufa0e\u3561\u53e1\u53e2\u58e1\u53e3\u53e4\u53e5\u53e6\u53e7\u53e8\u53e9\u53ea\u53eb\u53ec\u53ed\u53ee\u53ef\u53f0\u53f1\u53f2\u53f3\u53f4\u53f5\u53f6\u53f7\u53f8\u53f9\u53fa\u53fb\u53fc\u53fd\u53fe\u3563\u3564\u3565\u4db7\u53ff\u5400\u5401\u5402\u5403\u5404\u5405\u5406\u5407\u5408\u5409\u540a\u540b\u540c\u540d\u540e\u540f\u5410\u5411\u5412\u5413\u5414\u5415\u5416\u5417\u3566\u3567\u3568\u4db8\u5418\u5419\u541a\u541b\u541c\u541d\u541e\u541f\u5420\u5421\u5422\u5423\u5424\u5425\u5426\u5427\u5428\u5429\u542a\u542b\u542c\u542d\u542e\u542f\u5430\u5431\u5432\u5433\u5434\u5435\u5436\u5437\u5438\u5439\u543a\u543b\u543c\u543d\u543e\u543f\u5440\u5441\u5442\u5443\u5444\u5445\u5446\u5447\u5448\u5449\u544a\u544b\u544c\u544d\u544e\u544f\u5450\u5451\u5452\u5453\u5454\u5455\u5456\u5457\u5458\u5459\u545a\u545b\u545c\u3569\u356a\u356b\u356c\u356d\u356e\u356f\u3570\u3571\u3572\u3573\u3574\u3575\u3576\u545d\u545e\u545f\u5460\u5461\u5462\u5463\u5464\u5465\u5466\u5467\u5468\u5469\u546a\u546b\u546c\u546d\u546e\u546f\u5470\u5471\u5472\u5473\u5474\u5475\u5476\u5477\u5478\u5479\u547a\u547b\u547c\u547d\u547e\u547f\u5480\u5481\u5482\u5483\u5484\u5485\u5486\u5487\u5488\u5489\u548a\u548b\u548c\u548d\u548e\u548f\u5490\u5491\u5492\u5493\u5494\u5495\u5496\u5497\u5498\u5499\u549a\u549b\u549c\u549d\u3577\u3578\u3579\u357a\u357b\u357c\u357d\u357e\u357f\u549e\u549f\u54a0\u54a1\u54a2\u54a3\u54a4\u54a5\u54a6\u54a7\u54a8\u54a9\u54aa\u54ab\u54ac\u54ad\u54ae\u54af\u54b0\u54b1\u54b2\u54b3\u54b4\u54b5\u54b6\u54b7\u54b8\u54b9\u54ba\u54bb\u54bc\u54bd\u54be\u54bf\u54c0\u54c1\u54c2\u54c3\u54c4\u54c5\u54c6\u54c7\u54c8\u54c9\u54ca\u54cb\u54cc\u54cd\u54ce\u54cf\u54d0\u54d1\u54d2\u54d3\u54d4\u54d5\u54d6\u54d7\u54d8\u54d9\u54da\u54db\u54dc\u54dd\u54de\u54df\u3580\u3581\u3582\u3583\u3584\u3585\u3586\u3587\u3588\u3589\u358a\u358b\u358c\u358d\u358e\u54e0\u54e1\u54e2\u54e3\u54e4\u54e5\u54e6\u54e7\u54e8\u54e9\u54ea\u54eb\u54ec\u54ed\u54ee\u54ef\u54f0\u54f1\u54f2\u54f3\u54f4\u54f5\u54f6\u54f7\u54f8\u54f9\u54fa\u54fb\u54fc\u54fd\u54fe\u54ff\u5500\u5501\u5502\u5503\u5504\u5505\u5506\u5507\u5508\u5509\u550a\u550b\u550c\u550d\u550e\u550f\u5510\u5511\u5512\u5513\u5514\u5515\u5516\u5517\u5518\u5519\u551a\u551b\u551c\u551d\u551e\u551f\u5520\u5521\u5522\u5523\u5524\u5525\u5526\u5527\u358f\u3590\u3591\u3592\u3593\u3594\u3595\u3596\u3597\u3598\u3599\u359a\u359b\u359c\u359d\u359e\u5528\u5529\u552a\u552b\u552c\u552d\u552e\u552f\u5530\u5531\u5532\u5533\u5534\u5535\u5536\u5537\u5538\u5539\u553a\u553b\u553c\u553d\u553e\u553f\u5540\u5541\u5542\u5543\u5544\u5545\u5546\u5547\u5548\u5549\u554a\u554b\u554c\u554d\u554e\u554f\u5550\u5551\u5552\u5553\u5554\u5555\u5556\u5557\u5558\u555a\u555b\u555c\u555d\u555e\u5560\u5561\u5562\u5563\u5564\u5565\u5566\u5567\u5568\u5569\u556a\u556c\u556d\u556e\u556f\u5570\u5571\u5572\u5573\u5574\u5575\u5576\u5577\u5578\u5579\u359f\u35a0\u35a1\u35a2\u35a3\u35a4\u35a5\u35a6\u35a7\u35a8\u35a9\u35aa\u35ab\u35ac\u35ad\u35ae\u35af\u35b0\u35b1\u35b2\u35b3\u35b4\u35b5\u5559\u556b\u557a\u557b\u557c\u557d\u557e\u557f\u5580\u5581\u5582\u5583\u5584\u5585\u5586\u5587\u5588\u5589\u558a\u558b\u558c\u558e\u558f\u5590\u5591\u5592\u5593\u5594\u5595\u5596\u5597\u5598\u5599\u559a\u559b\u559c\u559d\u559e\u559f\u55a0\u55a1\u55a2\u55a3\u55a4\u55a5\u55a6\u55a7\u55a8\u55a9\u55aa\u55ab\u55ac\u55ad\u55ae\u55af\u55b0\u55b1\u55b2\u55b3\u55b4\u55b5\u55b6\u55b7\u55b8\u55b9\u55ba\u55bb\u55bc\u55bd\u55be\u5645\u35b6\u35b7\u35b8\u35b9\u35ba\u35bb\u35bc\u35bd\u35be\u35bf\u35c0\u35c1\u35c2\u35c3\u35c4\u35c5\u35c6\u35c7\u35c8\u35c9\u35ca\u35cb\u35cc\u35cd\u35ce\u35cf\u35d0\u35d1\u558d\u55bf\u55c0\u55c1\u55c2\u55c3\u55c4\u55c5\u55c6\u55c7\u55c8\u55c9\u55ca\u55cb\u55cc\u55cd\u55ce\u55cf\u55d0\u55d1\u55d2\u55d3\u55d4\u55d5\u55d6\u55d7\u55d8\u55d9\u55da\u55db\u55dc\u55dd\u55de\u55df\u55e0\u55e1\u55e2\u55e3\u55e4\u55e5\u55e6\u55e7\u55e8\u55e9\u55ea\u55eb\u55ec\u55ed\u55ee\u55ef\u55f0\u55f1\u55f2\u55f3\u55f4\u55f5\u35d2\u35d3\u35d4\u35d5\u35d6\u35d7\u35d8\u35d9\u35da\u35db\u35dc\u35dd\u35de\u35df\u35e0\u35e1\u55f6\u55f7\u55f8\u55f9\u55fa\u55fb\u55fc\u55fd\u55fe\u55ff\u5600\u5601\u5602\u5603\u5604\u5605\u5606\u5607\u5608\u5609\u560a\u560b\u560c\u560d\u560e\u560f\u5610\u5611\u5612\u5613\u5614\u5615\u5616\u5617\u5618\u5619\u561a\u561b\u561c\u561d\u561e\u5621\u5622\u5623\u5624\u5625\u5626\u5627\u5651\u5653\u35e2\u35e3\u35e4\u35e5\u35e6\u35e7\u35e8\u35e9\u35ea\u35eb\u35ec\u35ed\u35ee\u35ef\u35f0\u561f\u5620\u5628\u5629\u562a\u562b\u562c\u562d\u562e\u562f\u5630\u5631\u5632\u5633\u5634\u5635\u5636\u5637\u5638\u5639\u563a\u563b\u563c\u563d\u563e\u563f\u5640\u5641\u5642\u5643\u5644\u5646\u5647\u5648\u5649\u564a\u564b\u564c\u564d\u564e\u564f\u5650\u5652\u5654\u5656\u5657\u5658\u5659\u565a\u565b\u565c\u565d\u5674\u35f1\u35f2\u35f3\u35f4\u35f5\u35f6\u35f7\u35f8\u35f9\u35fa\u565e\u565f\u5660\u5661\u5662\u5663\u5664\u5665\u5666\u5667\u5668\u5669\u566a\u566b\u566c\u566d\u566e\u566f\u5670\u5671\u5672\u5673\u5675\u5676\u5677\u5678\u5679\u567a\u567b\u567c\u35fb\u35fc\u35fd\u35fe\u35ff\u3600\u3601\u3602\u3603\u3604\u567d\u567e\u567f\u5680\u5681\u5682\u5683\u5684\u5685\u5686\u5687\u5688\u5689\u568a\u568b\u568c\u568d\u568e\u568f\u5690\u5691\u5692\u5693\u56ba\u3605\u3606\u3607\u3608\u5694\u5695\u5696\u5697\u5698\u5699\u569a\u569b\u569c\u569d\u569e\u569f\u56a0\u56a1\u56a2\u56a3\u56a4\u3609\u360a\u360b\u360c\u360d\u360e\u360f\u56a5\u56a6\u56a7\u56a8\u56a9\u56aa\u56ab\u56ac\u56ad\u56ae\u56af\u56b0\u3610\u3611\u3612\u56b1\u56b2\u56b3\u56b4\u56b5\u56b6\u56b7\u56b8\u56b9\u3613\u3614\u56bb\u56bc\u56bd\u56be\u56bf\u56c0\u56c1\u56c2\u56c3\u56c4\u56cd\u3615\u3616\u3617\u56c5\u56c6\u56c7\u56c8\u56c9\u56ca\u56cb\u56ce\u3618\u56cc\u56cf\u56d0\u3619\u361a\u56d1\u56d2\u56d3\u56d4\u56d5\u361b\u361c\u56d6\u56d7\u56d8\u56d9\u56da\u56db\u56dc\u9fb1\u361d\u56dd\u56de\u56df\u56e0\u56e1\u56e2\u56e3\u361f\u56e4\u56e5\u56e6\u56e7\u56e8\u56e9\u56ea\u56eb\u56ec\u56ed\u56ee\u56ef\u56f0\u56f1\u56f2\u56f3\u56f4\u56f5\u56f6\u56f7\u56f8\u56f9\u56fa\u56fb\u56fc\u56fd\u56fe\u3620\u3621\u56ff\u5700\u3622\u5701\u5702\u5703\u5704\u5705\u5706\u3623\u5707\u5708\u5709\u570a\u570b\u570f\u570c\u570d\u570e\u5710\u5711\u5712\u5713\u5714\u5715\u5716\u5717\u5718\u5719\u3624\u571a\u571b\u571c\u3625\u571d\u571e\u571f\u5720\u5721\u9fb6\u5722\u5723\u5724\u5725\u5726\u5727\u3626\u5728\u5729\u572a\u572b\u572c\u572d\u572e\u572f\u5730\u5731\u5732\u5733\u5734\u5735\u5736\u5737\u5738\u5739\u573a\u573b\u573c\u573d\u573e\u573f\u5740\u5741\u5742\u5743\u5744\u5745\u5746\u5747\u5748\u5749\u574a\u574b\u574c\u574d\u574e\u574f\u5750\u5751\u5752\u5753\u5754\u5755\u5756\u5757\u5758\u5759\u575a\u575b\u575c\u575d\u575e\u575f\u5760\u3627\u3628\u3629\u362a\u362b\u362c\u362d\u362e\u362f\u3630\u5761\u5762\u5763\u5764\u5765\u5766\u5767\u5768\u5769\u576a\u576b\u576c\u576d\u576e\u576f\u5770\u5771\u5772\u5773\u5774\u5775\u5776\u5777\u5778\u5779\u577a\u577b\u577c\u577d\u577e\u577f\u5780\u5781\u5782\u5783\u5784\u5785\u5786\u5787\u5788\u5789\u578a\u3631\u3632\u3633\u3634\u3635\u578b\u578c\u578d\u578e\u578f\u5790\u5791\u5792\u5793\u5794\u5795\u5796\u5797\u5798\u5799\u579a\u579b\u579c\u579d\u579e\u579f\u57a0\u57a1\u57a2\u57a3\u57a4\u57a5\u57a6\u57a7\u57a8\u57a9\u57aa\u57ab\u57ac\u57ad\u57ae\u57af\u57b0\u57b1\u57b2\u57b3\u57b4\u57b5\u57ce\u9fcd\u3636\u3637\u3638\u3639\u363a\u363b\u363c\u363d\u363e\u57b6\u57b7\u57b8\u57b9\u57ba\u57bb\u57bc\u57bd\u57be\u57bf\u57c0\u57c1\u57c2\u57c3\u57c4\u57c5\u57c6\u57c7\u57c8\u57c9\u57ca\u57cb\u57cc\u57cd\u57cf\u57d0\u57d1\u57d2\u57d3\u57d4\u57d5\u57d6\u57d7\u57d8\u57d9\u57da\u57db\ufa0f\u363f\u3640\u3641\u3642\u3643\u3644\u3645\u3646\u57dc\u57dd\u57de\u57df\u57e0\u57e1\u57e2\u57e3\u57e4\u57e5\u57e6\u57e7\u57e8\u57e9\u57eb\u57ec\u57ed\u57ee\u57ef\u57f0\u57f1\u57f2\u57f3\u57f4\u57f5\u57f6\u57f7\u57f8\u57f9\u57fa\u57fb\u57fc\u57fd\u57fe\u57ff\u5800\u5801\u5802\u5803\u5804\u5805\u5806\u5807\u5808\u5809\u580a\u580b\u580c\u580d\u580e\u580f\u5810\u5811\u5812\u5813\u5814\u5815\u3647\u3648\u3649\u364a\u364b\u364c\u364d\u57ea\u5816\u5817\u5818\u5819\u581a\u581b\u581c\u581d\u581e\u581f\u5820\u5821\u5822\u5823\u5824\u5825\u5826\u5827\u5828\u5829\u582a\u582b\u582c\u582d\u582e\u582f\u5830\u5831\u5832\u5833\u5834\u5835\u5836\u5837\u5838\u5839\u583a\u583b\u583c\u583e\u583f\u5840\u5841\u5842\u5844\u5845\u5846\u5847\u5848\u364e\u364f\u3650\u3651\u3652\u3653\u3654\u3655\u3656\u3657\u3658\u583d\u5843\u5849\u584a\u584b\u584c\u584d\u584e\u584f\u5850\u5851\u5852\u5853\u5854\u5855\u5856\u5857\u5858\u5859\u585a\u585b\u585c\u585d\u585e\u585f\u5860\u5861\u5862\u5863\u5864\u5865\u5866\u5867\u5868\u5869\u586a\u586b\u586c\u586d\u586e\u586f\u5870\u5871\u3659\u365a\u365b\u365c\u365d\u365e\u365f\u5872\u5873\u5874\u5875\u5876\u5877\u5878\u5879\u587a\u587b\u587c\u587d\u587e\u587f\u5880\u5881\u5882\u5883\u5884\u5885\u5886\u5887\u5888\u5889\u588a\u588b\u588c\u588d\u588e\u588f\u5890\u5891\u5892\u5893\u5894\u5895\u5896\u5897\u5898\u5899\u589a\u589b\u3660\u3661\u3662\u3663\u3664\u3665\u3666\u589c\u589d\u589e\u589f\u58a0\u58a1\u58a2\u58a3\u58a4\u58a5\u58a6\u58a7\u58a9\u58aa\u58ab\u58ac\u58ad\u58ae\u58af\u58b0\u58b1\u58b2\u58b3\u58b4\u58b5\u58b6\u58b7\u58b8\u58b9\u3667\u3668\u3669\u366a\u366b\u366c\u366d\u366e\u366f\u58ba\u58bb\u58bc\u58bd\u58be\u58bf\u58c0\u58c1\u58c2\u58c3\u58c4\u58c5\u58c6\u58c7\u58c8\u58c9\u58ca\u58cb\u58cc\u9fb3\u3670\u3671\u3672\u3673\u3674\u3675\u3676\u58cd\u58ce\u58cf\u58d0\u58d1\u58d2\u58d3\u58d4\u58d5\u58d6\u58d7\u9fbc\u3677\u3678\u3679\u367a\u58d8\u58d9\u367b\u367c\u367d\u58da\u58db\u58dc\u58dd\u58de\u58df\u58e0\u58e2\u367e\u367f\u58e3\u58e4\u58e5\u3680\u58e6\u58e7\u58e8\u58e9\u3681\u58ea\u3682\u58eb\u58ec\u58ed\u58ee\u58ef\u58f0\u58f1\u58f2\u58f3\u58f4\u58f5\u58f6\u58f7\u58f8\u58f9\u58fa\u58fb\u3683\u58fc\u58fd\u58fe\u58ff\u5900\u3684\u5901\u5902\u5903\u5904\u5905\u5906\u5907\u5908\u3685\u590a\u590b\u590c\u5909\u590d\u3686\u3687\u590e\u590f\u5910\u5911\u5913\u5912\u5914\u5915\u5916\u5917\u5918\u3688\u5919\u591a\u591b\u591c\u591d\u3689\u591e\u591f\u5920\u5921\u368a\u5922\u5923\u5924\u5925\u368b\u368c\u5926\u368d\u5927\u5928\u5929\u592a\u592b\u592c\u592d\u592e\u592f\u5930\u5931\u5932\u5933\u5934\u368e\u5935\u5936\u5937\u5938\u5939\u593a\u593b\u593c\u368f\u3690\u3691\u593d\u593e\u593f\u5940\u5941\u5942\u3692\u3693\u5943\u5944\u5945\u5946\u5947\u5948\u5949\u594b\u594c\u594d\u3694\u3695\u3696\u3697\u3698\u3699\u594e\u594f\u5950\u5951\u5952\u5953\u5954\u5955\u5956\u369a\u369b\u594a\u5957\u5958\u5959\u595a\u595b\u595c\u595d\u595e\u369c\u369d\u369e\u595f\u5960\u5961\u5962\u5963\u5964\u5965\u369f\u5966\u5967\u5968\u36a0\u5969\u596a\u596b\u596c\u596d\u596e\u596f\u36a1\u5970\u5971\u5972\u5973\u5974\u5975\u5976\u36a2\u5977\u5978\u5979\u597a\u597b\u597c\u597d\u597e\u597f\u5980\u5981\u5982\u5983\u5984\u5985\u5986\u5987\u5988\u36a3\u36a4\u36a5\u36a6\u36a7\u36a8\u5989\u598a\u598b\u598c\u598e\u598f\u5990\u5991\u5992\u5993\u5994\u5995\u5996\u5997\u5998\u5999\u599a\u599b\u599c\u599d\u599e\u599f\u59a0\u59a1\u59a2\u59a3\u59a4\u59a5\u59a6\u59a7\u59a8\u59a9\u59aa\u59ab\u36a9\u36aa\u36ab\u36ac\u36ad\u36ae\u36af\u36e0\u59ac\u59ad\u59ae\u59af\u59b0\u59b1\u59b2\u59b3\u59b4\u59b5\u59b6\u59b7\u59b8\u59b9\u59ba\u59bb\u59bc\u59bd\u59be\u59bf\u59c0\u59c1\u59c2\u59c3\u59c4\u59c5\u59c6\u59c7\u59c8\u59c9\u59ca\u59cb\u59cc\u59cd\u59ce\u59cf\u59d0\u59d1\u59d2\u59d3\u59d4\u59d5\u59d6\u59d7\u36b0\u36b1\u36b2\u36b3\u36b4\u36b5\u36b6\u36b7\u36b8\u36b9\u36ba\u36bb\u36bc\u36bd\u36be\u36bf\u36c0\u36c1\u598d\u59d8\u59d9\u59da\u59db\u59dc\u59dd\u59de\u59df\u59e0\u59e1\u59e2\u59e3\u59e4\u59e5\u59e6\u59e7\u59e8\u59e9\u59ea\u59eb\u59ed\u59ee\u59ef\u59f0\u59f1\u59f2\u59f3\u59f4\u59f5\u59f6\u59f7\u59f8\u59f9\u59fa\u59fb\u59fc\u59fd\u59fe\u59ff\u5a00\u5a01\u5a02\u5a03\u5a05\u5a06\u5a07\u5a08\u36c2\u36c3\u36c4\u36c5\u36c6\u36c7\u36c8\u36c9\u36ca\u36cb\u36cc\u59ec\u5a09\u5a0a\u5a0b\u5a0c\u5a0d\u5a0e\u5a0f\u5a10\u5a11\u5a12\u5a13\u5a14\u5a15\u5a16\u5a17\u5a18\u5a19\u5a1a\u5a1b\u5a1c\u5a1d\u5a1e\u5a1f\u5a20\u5a21\u5a22\u5a23\u5a24\u5a25\u5a26\u5a27\u5a28\u5a29\u5a2a\u5a2b\u5a2d\u5a2e\u5a2f\u5a30\u5a31\u5a32\u5a33\u5a34\u5a3d\u36cd\u36ce\u36cf\u36d0\u36d1\u36d2\u36d3\u36d4\u36d5\u36d6\u36d7\u36d8\u36d9\u36da\u36db\u36dc\u36dd\u36de\u36df\u36e1\u36e2\u36e3\u36e4\u5a2c\u5a35\u5a36\u5a37\u5a38\u5a39\u5a3a\u5a3b\u5a3c\u5a3e\u5a3f\u5a40\u5a41\u5a42\u5a43\u5a44\u5a45\u5a46\u5a47\u5a48\u5a49\u5a4a\u5a4b\u5a4c\u5a4d\u5a4e\u5a4f\u5a50\u5a51\u5a52\u5a53\u5a54\u5a55\u5a56\u5a57\u5a58\u5a59\u5a5a\u5a5b\u5a5c\u5a5d\u5a5e\u5a5f\u5a60\u5a61\u5a62\u5a63\u5a64\u5a65\u5a66\u5a67\u5a68\u5a69\u5a6a\u5a6b\u5a6c\u5a6d\u5a6e\u5a6f\u5a70\u5a71\u5a72\u5a73\u5a74\u5a75\u5a76\u36e5\u36e6\u36e7\u36e8\u36e9\u36ea\u36eb\u36ec\u36ed\u5a77\u5a78\u5a79\u5a7a\u5a7b\u5a7c\u5a7d\u5a7e\u5a7f\u5a80\u5a81\u5a82\u5a83\u5a84\u5a85\u5a86\u5a87\u5a88\u5a89\u5a8a\u5a8b\u5a8c\u5a8d\u5a8e\u5a8f\u5a91\u5a92\u5a93\u5a94\u5a95\u5a96\u5a97\u5a98\u5a99\u5a9a\u5a9b\u5a9c\u5a9d\u5a9e\u5a9f\u5aa0\u5aa1\u5aa2\u5aa3\u5aa4\u5aa5\u5aa6\u5aa7\u5aa8\u5aa9\u5aaa\u5aab\u5aac\u5aad\u5aae\u5aaf\u5acf\u36ee\u36ef\u36f0\u36f1\u36f2\u36f3\u36f4\u36f5\u36f6\u36f7\u36f8\u36f9\u36fa\u36fb\u36fc\u36fd\u36fe\u36ff\u3700\u3701\u3702\u3703\u3704\u5a90\u5ab0\u5ab1\u5ab2\u5ab3\u5ab4\u5ab5\u5ab6\u5ab7\u5ab8\u5ab9\u5aba\u5abb\u5abc\u5abd\u5abe\u5abf\u5ac0\u5ac1\u5ac2\u5ac3\u5ac4\u5ac5\u5ac6\u5ac7\u5ac8\u5ac9\u5aca\u5acb\u5acc\u5acd\u5ace\u5ad0\u5ad1\u5ad2\u5ad3\u5ad4\u3705\u3706\u3707\u3708\u3709\u370a\u370b\u370c\u370d\u370e\u370f\u3710\u3711\u3712\u3713\u3714\u5ad5\u5ad6\u5ad7\u5ad8\u5ad9\u5ada\u5adb\u5adc\u5add\u5ade\u5adf\u5ae0\u5ae1\u5ae2\u5ae3\u5ae4\u5ae5\u5ae6\u5ae7\u5ae8\u5ae9\u5aea\u5aeb\u5aec\u5aed\u5aee\u5aef\u5af0\u5af1\u5af2\u3715\u3716\u3717\u3718\u3719\u371a\u371b\u371c\u371d\u371e\u371f\u3720\u3721\u3722\u5af3\u5af4\u5af5\u5af6\u5af7\u5af8\u5af9\u5afa\u5afb\u5afc\u5afd\u5afe\u5aff\u5b00\u5b01\u5b02\u5b03\u5b04\u5b05\u5b06\u5b07\u5b08\u5b09\u5b0a\u5b0b\u5b0c\u5b0d\u5b0e\u5b0f\u3723\u3724\u3725\u3726\u3727\u3728\u5b10\u5b11\u5b12\u5b13\u5b14\u5b15\u5b16\u5b17\u5b18\u5b19\u5b1a\u5b1b\u5b1c\u5b1d\u5b1e\u5b1f\u5b20\u5b21\u5b22\u5b34\u3729\u372a\u372b\u372c\u372d\u5b23\u5b24\u5b25\u5b26\u5b27\u5b28\u5b29\u5b2a\u5b2b\u5b2c\u5b2d\u5b2e\u5b2f\u5b30\u5b31\u5b32\u5b33\u5b35\u5b36\u5b37\u372e\u372f\u5b38\u5b3a\u5b3b\u5b3c\u5b3d\u3730\u3731\u5b39\u5b3e\u5b3f\u3732\u3733\u3734\u3735\u5b40\u5b41\u5b42\u5b43\u5b44\u5b45\u5b46\u3736\u3737\u3738\u5b47\u5b48\u5b49\u3739\u5b4a\u5b4b\u5b4c\u373a\u5b4d\u5b4e\u5b4f\u373b\u373c\u5b50\u5b51\u5b52\u5b53\u5b54\u5b55\u5b56\u5b57\u5b58\u5b59\u373d\u5b5a\u5b5b\u5b5c\u5b5d\u5b5e\u373e\u373f\u5b5f\u5b60\u5b61\u5b62\u5b63\u5b64\u5b65\u5b66\u5b67\u3740\u5b68\u5b69\u5b6a\u3741\u5b6b\u5b6c\u5b6d\u3742\u3743\u5b6e\u5b6f\u5b70\u5b72\u5b71\u3744\u5b73\u5b74\u3745\u5b75\u5b76\u5b77\u3746\u5b78\u5b79\u3747\u5b7a\u5b7b\u5b7c\u5b7d\u5b7e\u5b7f\u3748\u5b80\u3749\u5b81\u5b82\u5b83\u5b84\u374a\u374b\u5b85\u5b86\u5b87\u5b88\u5b89\u374c\u374d\u5b8a\u5b8b\u5b8c\u5b8d\u5b8e\u5b8f\u5b90\u5b91\u5b92\u374e\u374f\u3750\u3751\u5b93\u5b94\u5b95\u5b96\u5b97\u5b98\u5b99\u5b9a\u5b9b\u5b9c\u5b9d\u5b9e\u5b9f\u5ba0\u5ba1\u3752\u5ba2\u5ba3\u5ba4\u5ba5\u5ba6\u5ba8\u5ba9\u5baa\u5bab\u3753\u3754\u3755\u3756\u5ba7\u5bac\u5bad\u5bae\u5baf\u5bb0\u5bb1\u5bb2\u5bb3\u5bb4\u5bb5\u5bb6\u5bb7\u5bb8\u5bb9\u5bba\u5bbb\u5bbc\u5bbd\u5bbe\u3757\u3758\u3759\u375a\u5bbf\u5bc0\u5bc1\u5bc2\u5bc3\u5bc4\u5bc5\u5bc6\u5bc7\u5bc8\u5bc9\u375b\u375c\u375d\u375e\u375f\u3760\u3761\u5bca\u5bcb\u5bcc\u5bcd\u5bce\u5bcf\u5bd0\u5bd1\u5bd2\u5bd3\u5bd4\u5bd5\u5bea\u3762\u3763\u5bd6\u5bd7\u5bd8\u5bd9\u5bda\u5bdb\u5bdc\u5bdd\u3764\u3765\u3766\u3767\u3768\u5bde\u5bdf\u5be0\u5be1\u5be2\u5be3\u5be4\u5be5\u5be6\u5be7\u5be8\u3769\u376a\u376b\u376c\u5be9\u5beb\u5bec\u5bed\u5bee\u376d\u376e\u376f\u5bef\u5bf0\u5bf1\u5bf2\u3770\u5bf3\u5bf4\u5bf5\u5bf6\u5bf7\u3771\u3772\u5bf8\u5bf9\u3773\u5bfa\u5bfb\u5bfc\u5bfd\u5bfe\u5bff\u3774\u5c00\u3775\u5c01\u5c02\u5c06\u5c03\u5c04\u5c05\u3776\u5c07\u5c08\u5c09\u5c0a\u5c0b\u5c0c\u3777\u5c0d\u5c0e\u5c0f\u5c10\u5c11\u5c12\u5c13\u5c14\u5c15\u9fb8\u5c16\u5c17\u5c18\u5c19\u5c1a\u5c1b\u5c1c\u5c1d\u3778\u5c1e\u3779\u5c1f\u5c20\u5c21\u377a\u377b\u5c22\u5c23\u5c24\u5c25\u5c26\u5c27\u377c\u5c28\u5c29\u5c2a\u5c2b\u5c2c\u377d\u5c2d\u377e\u377f\u5c2e\u5c2f\u3780\u3781\u3782\u3783\u3784\u3785\u3786\u5c30\u5c31\u3787\u3788\u5c32\u5c33\u5c34\u3789\u378a\u5c35\u5c36\u5c37\u5c38\u5c3a\u5c3b\u5c3c\u378b\u5c3d\u378c\u378d\u5c3e\u5c3f\u5c40\u5c41\u5c42\u5c43\u378e\u5c44\u5c45\u5c46\u5c47\u5c48\u5c49\u5c4a\u378f\u3790\u3791\u5c4b\u5c4c\u5c4d\u5c4e\u5c4f\u3792\u3793\u3794\u3795\u3796\u5c50\u5c51\u5c52\u5c53\u5c54\u5c55\u5c56\u5c57\u5c58\u3797\u5c59\u5c5a\u5c5b\u5c5c\u5c5d\u3798\u3799\u5c5e\u5c5f\u5c60\u5c61\u379a\u379b\u5c62\u5c63\u379c\u379d\u379e\u5c64\u5c65\u5c66\u5c67\u379f\u37a0\u5c68\u5c69\u5c6a\u5c6b\u37a1\u5c6c\u5c6d\u5c6e\u4db9\u5c6f\u37a2\u5c70\u37a3\u37b7\u5c71\u4e62\u5c72\u5c73\u5c74\u5c75\u5c76\u5c77\u37a4\u37a5\u37a6\u37a7\u5c78\u5c79\u5c7a\u5c7b\u5c7c\u5c7d\u5c7e\u5c7f\u5c80\u5c81\u5c82\u5c83\u37a8\u37a9\u37aa\u37ab\u37ac\u37ad\u37ae\u37af\u5c84\u5c85\u5c86\u5c87\u5c88\u5c89\u5c8a\u5c8b\u5c8c\u5c8e\u5c8f\u5c90\u5c91\u5c92\u5c93\u5c94\u5c95\u5c96\u5c97\u5c98\u5c99\u5c9a\u5c9b\u5c9c\u37b0\u37b1\u37b2\u37b3\u37b4\u37b5\u37b6\u37b8\u5c9d\u5c9e\u5c9f\u5ca0\u5ca1\u5ca2\u5ca3\u5ca4\u5ca5\u5ca6\u5ca7\u5ca8\u5ca9\u5caa\u5cab\u5cac\u5cad\u5cae\u5caf\u5cb0\u5cb1\u5cb2\u5cb3\u5cb4\u5cb5\u5cb6\u5cb7\u5cb8\u5cb9\u5cba\u5cbb\u5cbc\u5cbd\u5cbe\u5cbf\u5cc0\u5cc1\u5cc2\u5cc3\u5cc4\u5cc5\u37b9\u37ba\u37bb\u37bc\u37bd\u37be\u37bf\u37c0\u37c1\u37c2\u37c3\u5c8d\u5cc6\u5cc7\u5cc8\u5cc9\u5cca\u5ccb\u5ccc\u5ccd\u5cce\u5ccf\u5cd0\u5cd1\u5cd2\u5cd3\u5cd4\u5cd5\u5cd6\u5cd7\u5cd8\u5cd9\u5cda\u5cdb\u5cdc\u5cdd\u5cde\u5cdf\u5ce0\u5ce1\u5ce2\u5ce3\u5ce4\u5ce5\u5ce6\u5ce7\u37c4\u37c5\u37c6\u5ce8\u5ce9\u5cea\u5ceb\u5cec\u5ced\u5cee\u5cef\u5cf0\u5cf1\u5cf2\u5cf3\u5cf4\u5cf5\u5cf6\u5cf7\u5cf8\u5cf9\u5cfa\u5cfb\u5cfc\u5cfd\u5cfe\u5cff\u5d00\u5d01\u5d02\u5d03\u5d04\u5d05\u37c7\u37c8\u37c9\u37ca\u37cb\u37cc\u37cd\u37ce\u37cf\u37d0\u37d1\u37d2\u37d3\u37d4\u37d5\u37d6\u5d06\u5d07\u5d08\u5d09\u5d0a\u5d0b\u5d0c\u5d0d\u5d0e\u5d0f\u5d10\u5d11\u5d12\u5d13\u5d14\u5d15\u5d16\u5d17\u5d18\u5d19\u5d1a\u5d1b\u5d1c\u5d1d\u5d1e\u5d1f\u5d20\u5d21\u5d22\u5d23\u5d24\u5d25\u5d26\u5d27\u5d28\u5d29\u5d2a\u5d2b\u5d2c\u5d2d\u5d2e\u5d2f\u5d30\u37d7\u37d8\u37d9\u37da\u37db\u37dc\u37dd\u37de\u37df\u37e0\u37e1\u37e2\u37e3\u37e4\u37e5\u5d31\u5d32\u5d33\u5d34\u5d35\u5d36\u5d37\u5d38\u5d39\u5d3a\u5d3b\u5d3c\u5d3d\u5d3e\u5d3f\u5d40\u5d41\u5d42\u5d43\u5d44\u5d45\u5d46\u5d47\u5d48\u5d49\u5d4b\u5d4c\u5d4d\u5d4e\u5d4f\u5d50\u5d51\u5d52\u5d53\u5d54\u5d55\u5d56\u5d57\u5d58\u5d59\u5d5a\u5d5b\u5d5c\u5d5d\ufa11\u37e6\u37e7\u37e8\u37e9\u37ea\u37eb\u37ec\u37ed\u37ee\u37ef\u5d4a\u5d5e\u5d5f\u5d60\u5d61\u5d62\u5d63\u5d64\u5d65\u5d66\u5d67\u5d68\u5d69\u5d6a\u5d6b\u5d6c\u5d6d\u5d6e\u5d6f\u5d70\u5d71\u5d72\u5d73\u5d74\u5d75\u5d76\u37f0\u37f1\u37f2\u37f3\u37f4\u37f5\u37f6\u37f7\u37f8\u5d77\u5d78\u5d79\u5d7a\u5d7b\u5d7c\u5d7d\u5d7e\u5d7f\u5d80\u5d81\u5d82\u5d83\u5d84\u5d85\u5d86\u5d87\u5d88\u5d89\u5d8a\u5d8b\u5d8c\u5d8d\u5d8e\u37f9\u37fa\u37fb\u37fc\u37fd\u37fe\u37ff\u3800\u3801\u3802\u3803\u3804\u5d8f\u5d90\u5d91\u5d92\u5d93\u5d94\u5d95\u5d96\u5d97\u5d98\u5d99\u5d9a\u5d9b\u5d9c\u5d9d\u5d9e\u5d9f\u5da0\u5da1\u5da2\u5da3\u5da4\u5da5\u3805\u3806\u3807\u3808\u3809\u380a\u380b\u380c\u380d\u380e\u380f\u3810\u5da6\u5da7\u5da8\u5da9\u5daa\u5dab\u5dac\u5dad\u5dae\u5daf\u5db0\u5db1\u5db2\u5db3\u5db4\u5db5\u5db6\u3811\u3812\u3813\u3814\u3815\u3816\u3817\u5db7\u5db8\u5db9\u5dba\u5dbc\u5dbd\u5dbe\u5dbf\u3818\u3819\u381a\u381b\u381c\u5dc0\u5dc1\u5dc2\u381d\u381e\u381f\u5dbb\u5dc3\u5dc4\u5dc5\u3820\u3821\u3822\u3823\u5dc6\u5dc7\u5dc8\u5dc9\u5dca\u5dcb\u5dcc\u3824\u5dcd\u5dcf\u5dd0\u3825\u3826\u5dce\u5dd1\u5dd2\u5dd3\u5dd4\u5dd5\u5dd7\u3827\u5dd6\u5dd8\u5dd9\u5dda\u3828\u5ddb\u5ddc\u5ddd\u5dde\u5ddf\u3829\u5de0\u5de2\u5de3\u5de4\u5de5\u382a\u5de6\u5de7\u5de8\u5de9\u5dea\u5deb\u5dec\u5ded\u5dee\u382b\u382c\u5def\u382d\u5df0\u382e\u5df1\u5df2\u5df3\u5df4\u382f\u5df5\u5df6\u3830\u5df7\u5df8\u5df9\u5dfa\u5dfb\u5dfc\u3831\u5dfd\u5dfe\u5dff\u5e00\u5e01\u5e02\u5e03\u5e04\u5e05\u3832\u3833\u5e06\u5e07\u5e08\u3834\u3835\u3836\u5e09\u5e0a\u5e0b\u5e0c\u5e0d\u5e0e\u5e0f\u5e10\u3837\u3838\u3839\u383a\u383b\u383c\u5e11\u5e12\u5e13\u5e14\u5e15\u5e16\u5e17\u5e18\u5e19\u5e1a\u5e1b\u5e1c\u383d\u383e\u383f\u3840\u5e1d\u5e1e\u5e1f\u5e20\u5e21\u5e22\u5e23\u5e24\u5e25\u5e26\u5e27\u3841\u3842\u3843\u3844\u3845\u3846\u5e28\u5e29\u5e2a\u5e2b\u5e2c\u5e2d\u5e2e\u5e2f\u5e30\u5e31\u3847\u3848\u5e32\u5e33\u5e34\u5e35\u5e36\u5e37\u5e38\u5e39\u5e3a\u5e3b\u5e3c\u3849\u384a\u384b\u384c\u384d\u384e\u5e3d\u5e3e\u5e3f\u5e40\u5e41\u5e42\u5e43\u5e44\u5e45\u5e46\u5e47\u5e49\u384f\u3850\u3851\u3852\u3853\u3854\u3855\u3856\u5e4a\u5e4b\u5e4c\u5e4d\u5e4e\u5e4f\u3857\u3858\u3859\u385a\u385b\u5e48\u5e51\u5e52\u5e53\u5e54\u5e55\u5e56\u5e57\u5e58\u5e59\u5e5b\u385c\u385d\u385e\u385f\u5e5a\u5e5c\u5e5d\u5e5e\u5e5f\u5e60\u5e61\u5e62\u5e63\u5e64\u5e65\u3860\u3861\u5e66\u5e67\u5e68\u5e69\u3862\u3863\u3864\u5e6a\u5e6b\u5e6c\u3865\u3866\u5e6d\u5e6e\u5e6f\u5e70\u5e71\u3867\u3868\u3869\u386a\u5e72\u5e73\u5e74\u5e75\u5e76\u5e77\u5e78\u5e79\u4e61\u5e7a\u5e7b\u5e7c\u5e7d\u5e7e\u386b\u386c\u386d\u386e\u5e7f\u5e80\u5e81\u5e82\u5e83\u5e84\u5e85\u5e86\u386f\u3870\u3871\u5e87\u5e88\u5e89\u5e8a\u5e8b\u5e8c\u5e8d\u5e8e\u5e8f\u5e90\u5e91\u5e92\u5e93\u5e94\u5e98\u3872\u3873\u5e95\u5e96\u5e97\u5e99\u5e9a\u5e9b\u5e9c\u5e9d\u5e9e\u5e9f\u3874\u3875\u3876\u3877\u3878\u3879\u387a\u387b\u5ea0\u5ea1\u5ea2\u5ea3\u5ea4\u5ea5\u5ea6\u387c\u387d\u387e\u387f\u3880\u3881\u3882\u5ea7\u5ea8\u5ea9\u5eaa\u5eab\u5eac\u5ead\u5eae\u5eaf\u3883\u3884\u3885\u3886\u3887\u5eb0\u5eb1\u5eb2\u5eb3\u5eb4\u5eb5\u5eb6\u5eb7\u5eb8\u5eb9\u5eba\u5ebb\u5ebc\u3888\u3889\u388a\u388b\u388c\u5ebd\u5ebe\u5ebf\u5ec0\u5ec1\u5ec2\u5ec3\u5eca\u388d\u388e\u388f\u3890\u5ec5\u5ec6\u5ec7\u5ec8\u5ec9\u5ecb\u5ecc\u9fee\u3891\u5ec4\u5ecd\u5ece\u5ecf\u5ed0\u5ed1\u5ed2\u5ed3\u5ed4\u5ed5\u5ed6\u5ed7\u5ed8\u3892\u3893\u3894\u3895\u5ed9\u5eda\u5edb\u5edc\u5edd\u5ede\u5edf\u5ee0\u5ee1\u5ee2\u5ee3\u5ee4\u3896\u3897\u3898\u5ee5\u5ee6\u5ee7\u5ee8\u5ee9\u5eea\u3899\u389a\u389b\u389c\u5eeb\u5eec\u5eed\u9f90\u389d\u5eee\u5eef\u5ef0\u389e\u5ef1\u5ef2\u5ef3\u5ef4\u5ef5\u389f\u5ef6\u5ef7\u5ef8\u5ef9\u38a0\u5efa\u5efb\u5efc\u5efd\u5efe\u5eff\u5f00\u5f01\u5f02\u5f03\u5f04\u5f05\u5f06\u5f07\u5f08\u5f09\u38a1\u5f0a\u38a2\u38a3\u5f0b\u5f0c\u5f0d\u5f0e\u5f0f\u5f10\u38a4\u38a5\u5f11\u5f12\u38a6\u5f13\u5f14\u5f15\u5f16\u38a7\u5f17\u5f18\u5f19\u5f1a\u5f1b\u5f1c\u38a8\u38a9\u38aa\u38ab\u5f1d\u5f1e\u5f1f\u5f20\u38ac\u38ad\u5f21\u5f22\u5f23\u5f24\u5f25\u5f26\u5f27\u5f28\u5f29\u5f2a\u38ae\u38af\u38b0\u38b1\u5f2b\u5f2c\u5f2d\u5f2e\u5f2f\u38b2\u38b3\u38b4\u38b5\u38b6\u38b7\u5f30\u5f31\u5f32\u5f33\u38b8\u38b9\u5f34\u5f35\u5f36\u5f37\u5f38\u5f39\u38ba\u38bb\u38bc\u5f3a\u5f3b\u5f3c\u5f3d\u5f3e\u38bd\u38be\u38bf\u5f3f\u5f40\u5f41\u5f42\u38c0\u38c1\u38c2\u5f43\u5f44\u5f45\u38c3\u5f46\u5f47\u5f48\u5f49\u38c4\u38c5\u5f4a\u5f4b\u5f4c\u5f4d\u38c6\u5f4e\u5f4f\u5f50\u5f51\u5f52\u5f53\u5f54\u5f55\u38c7\u5f56\u5f57\u5f58\u5f59\u5f5a\u5f5b\u5f5c\u38c8\u5f5d\u5f5e\u5f5f\u5f60\u5f61\u38c9\u5f62\u5f63\u5f64\u38ca\u38cb\u38cc\u38cd\u5f65\u5f66\u5f67\u5f68\u5f69\u5f6b\u5f6c\u38ce\u5f6d\u38cf\u38d0\u5f6e\u5f6f\u5f70\u38d1\u5f71\u38d2\u38d3\u5f72\u5f73\u38d4\u5f74\u5f75\u38d5\u5f76\u5f77\u5f78\u5f79\u5f7a\u5f7b\u9fc8\u9fc9\u38d6\u38d7\u5f7c\u5f7d\u5f7e\u5f7f\u5f80\u5f81\u5f82\u5f83\u5f84\u38d8\u38d9\u5f85\u5f86\u5f87\u5f88\u5f89\u5f8a\u5f8b\u5f8c\u5f8d\u5f94\u38da\u38db\u38dc\u38dd\u38de\u38df\u38e0\u38e1\u5f8e\u5f8f\u5f90\u5f91\u5f92\u5f93\u5f95\u38e2\u38e3\u5f96\u5f97\u5f98\u5f99\u5f9b\u5f9c\u5f9d\u5f9e\u5f9f\u5fa0\u5fa1\u5fa2\u5fa3\u5fa4\u38e4\u38e5\u38e6\u38e7\u38e8\u38e9\u5f9a\u5fa5\u5fa6\u5fa7\u5fa8\u5fa9\u5faa\u5fab\u38ea\u38eb\u38ec\u38ed\u38ee\u5fac\u5fad\u5fae\u5faf\u5fb0\u38ef\u5fb1\u5fb3\u5fb4\u38f0\u38f1\u38f2\u5fb2\u5fb5\u5fb6\u5fb7\u5fb8\u5fb9\u5fba\u38f3\u38f4\u5fbb\u5fbc\u38f5\u38f6\u5fbd\u5fbe\u38f7\u5fbf\u38f8\u5fc0\u5fc1\u38f9\u5fc2\u5fc3\u5fc4\u5fc5\u5fc6\u38fa\u5fc7\u5fc8\u5fc9\u5fca\u38fb\u5fcb\u5fcc\u5fcd\u5fce\u5fcf\u5fd0\u5fd1\u5fd2\u5fd3\u5fd4\u5fd5\u5fd6\u5fd7\u5fd8\u5fd9\u5fda\u5fdb\u5fdc\u38fc\u38fd\u38fe\u38ff\u3900\u5fdd\u5fde\u5fdf\u5fe0\u5fe1\u5fe2\u5fe3\u5fe4\u5fe5\u5fe6\u5fe7\u5fe8\u5fe9\u5fea\u5feb\u5fec\u5fed\u5fee\u5fef\u5ff0\u5ff1\u5ff2\u5ff3\u5ff4\u5ff5\u5ff6\u5ff7\u5ff8\u5ff9\u5ffa\u5ffb\u5ffc\u5ffd\u5ffe\u5fff\u6000\u6001\u6002\u6003\u6004\u6005\u6006\u3901\u3902\u3903\u3904\u3905\u3906\u3907\u3908\u3909\u390a\u390b\u6007\u6008\u6009\u600a\u600b\u600c\u600d\u600e\u600f\u6010\u6011\u6012\u6013\u6014\u6015\u6016\u6017\u6018\u6019\u601a\u601b\u601c\u601d\u601e\u601f\u6020\u6021\u6022\u6023\u6024\u6025\u6026\u6027\u6028\u6029\u602a\u602b\u602c\u602d\u602e\u602f\u6030\u6031\u6032\u6033\u6034\u6035\u6036\u6037\u6038\u6039\u603a\u603b\u603c\u603d\u603e\u603f\u390c\u390d\u390e\u390f\u3910\u3911\u3912\u3913\u3914\u3915\u3916\u3917\u3918\u3919\u6040\u6041\u6042\u6043\u6044\u6045\u6046\u6047\u6048\u6049\u604a\u604b\u604c\u604d\u604e\u604f\u6050\u6051\u6052\u6053\u6054\u6055\u6056\u6057\u6058\u6059\u605a\u605b\u605c\u605d\u605e\u605f\u6060\u6061\u6062\u6063\u6064\u6065\u6066\u6067\u6068\u6069\u606a\u606b\u606c\u606d\u606e\u606f\u6070\u6071\u6072\u6073\u6074\u6075\u6076\u6077\u6078\u6079\u607a\u607b\u607c\u607d\u391a\u391b\u391c\u391d\u391e\u391f\u3920\u3921\u3922\u3923\u3924\u3925\u3926\u3927\u3928\u3929\u392a\u392b\u392c\u392d\u393a\u607e\u607f\u6080\u6081\u6082\u6083\u6084\u6085\u6086\u6087\u6088\u6089\u608a\u608b\u608c\u608d\u608e\u608f\u6090\u6091\u6092\u6093\u6094\u6095\u6096\u6097\u6098\u6099\u609a\u609b\u609c\u609d\u609e\u609f\u60a0\u60a1\u60a2\u60a3\u60a4\u60a5\u60a6\u60a7\u60a8\u60a9\u60aa\u60ab\u60ac\u60ad\u60ae\u60af\u392e\u392f\u3930\u3931\u3932\u3933\u3934\u3935\u3936\u3937\u3938\u3939\u393b\u393c\u393d\u60b0\u60b1\u60b2\u60b3\u60b4\u60b5\u60b6\u60b7\u60b8\u60b9\u60ba\u60bb\u60bc\u60bd\u60be\u60bf\u60c0\u60c1\u60c2\u60c3\u60c4\u60c5\u60c6\u60c7\u60c8\u60c9\u60ca\u60cb\u60cc\u60cd\u60ce\u60cf\u60d0\u60d1\u60d2\u60d3\u60d4\u60d5\u60d6\u60d7\u60d8\u60d9\u60da\u60db\u60dc\u60dd\u60de\u60df\u60e0\u60e1\u60e2\u60e3\u60e4\u60e5\u60e6\u60e7\u60e8\u60e9\u60ea\u60eb\u60ec\u60ed\u60ee\u60ef\u393e\u393f\u3940\u3941\u3942\u3943\u3944\u3945\u3946\u3947\u3948\u3949\u394a\u394b\u394c\u394d\u394e\u394f\u3950\u3951\u3952\u3953\u3954\u3955\u3956\u3957\u3958\u3959\u60f0\u60f1\u60f2\u60f3\u60f4\u60f5\u60f6\u60f7\u60f8\u60f9\u60fa\u60fb\u60fc\u60fd\u60fe\u60ff\u6100\u6101\u6102\u6103\u6104\u6105\u6106\u6107\u6108\u6109\u610a\u610b\u610c\u610d\u610e\u610f\u6110\u6111\u6112\u6113\u6114\u6115\u6116\u6117\u6118\u6119\u611a\u611b\u611c\u611d\u611e\u611f\u6120\u6121\u6122\u6123\u6124\u6125\u6126\u6168\u395a\u395b\u395c\u395d\u395e\u395f\u3960\u3961\u3962\u3963\u3964\u3965\u3966\u3967\u3968\u3969\u396a\u396b\u6127\u6128\u6129\u612a\u612b\u612c\u612d\u612e\u612f\u6130\u6131\u6132\u6133\u6134\u6135\u6136\u6137\u6138\u6139\u613a\u613b\u613c\u613d\u613e\u613f\u6140\u6141\u6142\u6143\u6144\u6145\u6146\u6147\u6148\u6149\u614a\u614b\u614c\u614d\u614e\u614f\u6150\u6151\u396c\u396d\u396e\u396f\u3970\u3971\u3972\u3973\u3974\u3975\u3976\u3977\u3978\u3979\u397a\u397b\u6152\u6153\u6154\u6155\u6156\u6157\u6158\u6159\u615a\u615b\u615c\u615d\u615e\u615f\u6160\u6161\u6162\u6163\u6164\u6165\u6166\u6167\u6169\u616a\u616b\u616c\u616e\u616f\u6170\u6171\u6172\u6173\u6174\u6175\u6176\u6177\u6178\u6179\u617a\u617b\u617c\u617d\u617e\u617f\u6180\u6181\u6182\u6183\u6184\u6185\u6186\u6187\u6188\u397c\u397d\u397e\u397f\u3980\u3981\u3982\u3983\u3984\u3985\u3986\u3987\u3988\u616d\u6189\u618a\u618b\u618c\u618d\u618e\u618f\u6190\u6191\u6192\u6193\u6194\u6195\u6196\u6197\u6198\u6199\u619a\u619b\u619c\u619d\u619e\u619f\u61a0\u61a1\u61a2\u61a3\u61a4\u61a5\u61a6\u61a7\u61a8\u61a9\u61aa\u61ab\u61ac\u61ad\u61ae\u61af\u61b0\u61b1\u61b2\u61b3\u3989\u398a\u398b\u398c\u398d\u398e\u398f\u3990\u3991\u3992\u3993\u3994\u3995\u3996\u61b4\u61b5\u61b6\u61b7\u61b8\u61b9\u61ba\u61bc\u61bd\u61be\u61bf\u61c0\u61c1\u61c2\u61c3\u61c4\u61c5\u61c6\u61c7\u61c8\u61c9\u61ca\u61cb\u61cc\u61cd\u61ce\u61cf\u61d0\u61d1\u61d2\u61d3\u61d4\u3997\u3998\u3999\u61bb\u61d5\u61d6\u61d7\u61d8\u61d9\u61da\u61db\u61dc\u61dd\u61de\u61df\u61e0\u61e1\u61e2\u61e3\u61e4\u61e5\u61e6\u61e7\u61e8\u399a\u399b\u399c\u399d\u399e\u399f\u39a0\u61e9\u61ea\u61eb\u61ec\u61ed\u61ee\u61ef\u61f0\u61f1\u61f2\u61f3\u61f4\u39a1\u39a2\u61f5\u61f6\u61f7\u61f8\u39a3\u39a4\u39a5\u39a6\u39a7\u61f9\u61fa\u61fb\u39a8\u39a9\u39aa\u61fc\u61fd\u61fe\u61ff\u6200\u6201\u6202\u39ab\u39ac\u6203\u6204\u6205\u6206\u6207\u39ad\u6208\u6209\u620a\u620b\u620c\u620d\u620e\u620f\u6210\u6211\u6212\u6213\u39ae\u39af\u6214\u6215\u6216\u6217\u39b0\u39b1\u39b2\u6218\u39b3\u6219\u39b4\u39b5\u39b6\u621a\u621b\u621c\u621d\u39b7\u621e\u621f\u6226\u39b8\u6220\u6221\u6222\u6223\u6224\u6225\u39b9\u6227\u6228\u6229\u622a\u622b\u622c\u39ba\u622d\u622e\u622f\u6231\u39bb\u39bc\u6230\u6232\u6234\u39bd\u6233\u6235\u6236\u6237\u6238\u6239\u623a\u623b\u623c\u39be\u623d\u623e\u623f\u6240\u39bf\u39c0\u6241\u6242\u6243\u39c1\u39c2\u6244\u6245\u6246\u6247\u6248\u6249\u624a\u624b\u624c\u624d\u9fb5\u624e\u6250\u6251\u6252\u6253\u6254\u6255\u6256\u39c3\u39c4\u39c5\u624f\u6257\u6258\u6259\u625a\u625b\u625c\u625d\u625e\u6260\u6261\u6262\u6263\u6264\u6265\u6266\u6267\u6268\u6269\u626a\u626b\u626c\u39c6\u39c7\u39c8\u625f\u626d\u626e\u626f\u6270\u6271\u6272\u6273\u6274\u6275\u6276\u6277\u6279\u627a\u627b\u627c\u627d\u627e\u627f\u6280\u6281\u6282\u6283\u6284\u6285\u6286\u6287\u6288\u6289\u628a\u628b\u628c\u628d\u628e\u628f\u6290\u6291\u6292\u6293\u6294\u6295\u6296\u6297\u6298\u6299\u629a\u629b\u629c\u629d\u629e\u629f\u62a0\u62a1\u62a2\u62a3\u62a4\u62a5\u39c9\u39ca\u39cb\u39cc\u39cd\u39ce\u39cf\u39d0\u39d1\u6278\u62a6\u62a7\u62a8\u62a9\u62aa\u62ab\u62ac\u62ad\u62ae\u62af\u62b0\u62b1\u62b2\u62b3\u62b4\u62b5\u62b6\u62b7\u62b8\u62b9\u62ba\u62bb\u62bc\u62bd\u62be\u62bf\u62c0\u62c1\u62c2\u62c3\u62c4\u62c5\u62c6\u62c7\u62c8\u62c9\u62ca\u62cb\u62cc\u62cd\u62ce\u62cf\u62d0\u62d1\u62d2\u62d3\u62d4\u62d5\u62d6\u62d7\u62d8\u62d9\u62da\u62db\u62dc\u62dd\u62de\u62df\u62e0\u62e1\u62e2\u62e3\u62e4\u62e5\u62e6\u62e7\u62e8\u62e9\u39d2\u39d3\u39d4\u39d5\u39d6\u39d7\u39d8\u39d9\u39da\u39db\u39dc\u39dd\u39de\u39df\u39e0\u62ea\u62eb\u62ec\u62ed\u62ee\u62ef\u62f0\u62f1\u62f2\u62f3\u62f4\u62f5\u62f6\u62f7\u62f8\u62f9\u62fa\u62fb\u62fc\u62fd\u62fe\u62ff\u6300\u6301\u6302\u6303\u6304\u6305\u6306\u6307\u6308\u6309\u630a\u630b\u630c\u630d\u630e\u630f\u6310\u6311\u6312\u6313\u6314\u6315\u6316\u6317\u6318\u6319\u631a\u631b\u631c\u631d\u631e\u631f\u6320\u6321\u6322\u6323\u6324\u6325\u6326\u6327\u39e1\u39e2\u39e3\u39e4\u39e5\u39e6\u39e7\u39e8\u39e9\u39ea\u39eb\u39ec\u39ed\u39ee\u39ef\u39f0\u39f1\u6328\u6329\u632a\u632b\u632c\u632d\u632e\u632f\u6330\u6331\u6332\u6333\u6334\u6335\u6336\u6337\u6338\u6339\u633a\u633b\u633c\u633d\u633e\u633f\u6340\u6341\u6342\u6343\u6344\u6345\u6346\u6347\u6348\u6349\u634a\u634b\u634c\u634d\u634e\u634f\u6350\u6351\u6352\u6353\u6354\u6355\u6356\u6357\u6358\u6359\u635a\u635b\u635c\u635d\u635e\u635f\u6360\u6361\u6362\u6363\u6364\u39f2\u39f3\u39f4\u39f5\u39f6\u39f7\u39f8\u6365\u6366\u6367\u6368\u6369\u636a\u636b\u636c\u636d\u636e\u636f\u6370\u6371\u6372\u6373\u6374\u6375\u6376\u6377\u6378\u6379\u637a\u637b\u637c\u637d\u637e\u637f\u6380\u6381\u6382\u6383\u6384\u6385\u6386\u6387\u6388\u6389\u638a\u638b\u638c\u638d\u638e\u638f\u6390\u6391\u6392\u6393\u6394\u6395\u6396\u6397\u6398\u6399\u639a\u639b\u639c\u639d\u639e\u639f\u63a0\u63a1\u63a2\u63a3\u63a4\u63a5\u63a6\u63a7\u63a8\u63a9\u63aa\u63ab\u63ac\u63ad\u63ae\u63af\u63b0\u63b1\u63b3\u63b4\u63b5\u63b6\u63b7\u63b8\u63b9\u63ba\u63bb\u63bc\u63bd\u39f9\u39fa\u39fb\u39fc\u39fd\u39fe\u39ff\u3a00\u3a01\u3a02\u3a03\u3a04\u3a05\u3a06\u3a07\u3a08\u63b2\u63be\u63bf\u63c0\u63c1\u63c2\u63c3\u63c4\u63c6\u63c7\u63c8\u63c9\u63ca\u63cb\u63cc\u63cd\u63ce\u63cf\u63d0\u63d1\u63d2\u63d3\u63d4\u63d5\u63d6\u63d7\u63d8\u63d9\u63da\u63db\u63dc\u63dd\u63de\u63df\u63e0\u63e1\u63e2\u63e3\u63e4\u63e5\u63e6\u63e7\u63e8\u63e9\u63ea\u63eb\u63ec\u63ed\u63ee\u63ef\u63f0\u63f1\u63f2\u63f3\u63f4\u63f5\u63f6\u63f7\u63f8\u63f9\u63fa\u63fb\u63fc\u63fd\u63fe\u63ff\u6400\u6401\u6402\u6403\u6404\u6405\u6452\u3a09\u3a0a\u3a0b\u3a0c\u3a0d\u3a0e\u3a0f\u3a10\u3a11\u3a12\u3a13\u3a14\u3a15\u3a17\u3a18\u6406\u6407\u6408\u6409\u640a\u640b\u640c\u640d\u640e\u640f\u6410\u6411\u6412\u6413\u6414\u6415\u6416\u6417\u6418\u6419\u641a\u641b\u641c\u641d\u641e\u641f\u6420\u6421\u6422\u6423\u6424\u6425\u6426\u6427\u6428\u6429\u642a\u642b\u642c\u642d\u642e\u642f\u6430\u6432\u6433\u6434\u6435\u6436\u6437\u6438\u6439\u643a\u643b\u643c\u643d\u643e\u643f\u6440\u6441\u6442\u6443\u6444\u6445\u6446\u6447\u6448\u6449\u644a\u3a16\u3a19\u3a1a\u3a1b\u3a1c\u3a1d\u3a1e\u3a1f\u3a20\u3a21\u3a22\u3a23\u3a24\u3a25\u3a26\u3a27\u3a28\u3a29\u3a2a\u3a2b\u3a2c\u63c5\u644b\u644c\u644d\u644e\u644f\u6450\u6451\u6453\u6454\u6455\u6457\u6458\u6459\u645a\u645b\u645c\u645d\u645e\u645f\u6460\u6461\u6462\u6463\u6464\u6465\u6466\u6467\u6468\u6469\u646a\u646b\u646c\u646d\u646e\u646f\u6470\u6471\u6472\u6473\u6474\u6475\u6476\u6477\u6478\u6479\u647a\u647b\u647c\u647d\u647e\u647f\u6480\u6481\u6482\u6483\u6484\u6487\u3a2d\u3a2e\u3a2f\u3a30\u3a31\u3a32\u3a33\u3a34\u3a35\u3a36\u3a37\u3a38\u3a39\u3a3a\u3a3b\u3a3c\u3a3d\u3a3e\u3a3f\u3a40\u3a41\u3a42\u6431\u6456\u6485\u6486\u6488\u6489\u648a\u648b\u648c\u648d\u648e\u648f\u6490\u6491\u6492\u6493\u6494\u6495\u6496\u6497\u6498\u6499\u649a\u649b\u649c\u649d\u649e\u649f\u64a0\u64a1\u64a2\u64a3\u64a4\u64a5\u64a6\u64a7\u64a8\u64a9\u64aa\u64ab\u64ac\u64ad\u64ae\u64af\u64b0\u64b1\u64b2\u64b3\u64b4\u64b5\u64b6\u64b7\u64b8\u64b9\u64ba\u64c6\u3a43\u3a44\u3a45\u3a46\u3a47\u3a48\u3a49\u3a4a\u3a4b\u3a4c\u3a4d\u3a4e\u3a4f\u3a50\u3a51\u64bb\u64bc\u64bd\u64be\u64bf\u64c0\u64c1\u64c2\u64c3\u64c4\u64c5\u64c7\u64c8\u64c9\u64ca\u64cb\u64cc\u64cd\u64ce\u64cf\u64d0\u64d1\u64d2\u64d3\u64d4\u64d5\u64d6\u64d7\u64d8\u64d9\u64da\u64db\u64dc\u64dd\u64de\u3a52\u3a53\u3a54\u3a55\u3a56\u3a57\u3a58\u3a59\u64df\u64e0\u64e1\u64e2\u64e3\u64e4\u64e6\u64e7\u64e8\u64e9\u64ea\u64eb\u64ec\u64ed\u64ee\u64ef\u64f0\u64f1\u3a5a\u3a5b\u3a5c\u3a5d\u3a5e\u3a5f\u64e5\u64f2\u64f3\u64f4\u64f5\u64f6\u64f7\u64f8\u64f9\u64fa\u64fb\u64fc\u64fd\u64fe\u64ff\u6500\u6501\u6502\u6503\u6504\u6505\u6506\u3a60\u3a61\u3a62\u3a63\u3a64\u3a65\u3a66\u3a67\u3a68\u3a69\u3a6a\u3a6b\u6507\u6508\u6509\u650a\u650b\u650c\u650d\u650e\u650f\u6510\u6512\u3a6c\u3a6d\u6511\u6513\u6514\u6515\u6516\u6517\u6518\u6519\u651a\u3a6e\u3a6f\u3a70\u651b\u651c\u651d\u3a71\u3a72\u3a73\u3a74\u651e\u651f\u6520\u6521\u6522\u6523\u6524\u6526\u6527\u9fdc\u6525\u6528\u6529\u652a\u652b\u3a75\u3a76\u3a77\u652c\u652d\u652e\u3a78\u3a79\u652f\u6530\u3a7a\u6531\u3a7b\u3a7c\u3a7d\u6532\u3a7e\u6533\u6534\u6535\u6536\u6537\u6538\u6539\u653a\u653b\u653c\u3a7f\u3a80\u653d\u653e\u653f\u3a81\u3a82\u6540\u6541\u6542\u6543\u6544\u6545\u3a83\u3a84\u3a85\u3a86\u6546\u6547\u6548\u6549\u654a\u654b\u654c\u3a87\u3a88\u3a89\u555f\u654d\u654e\u654f\u6550\u6551\u6552\u6553\u6554\u6555\u6556\u6557\u6558\u6559\u655a\u655b\u3a8a\u3a8b\u3a8c\u3a8d\u3a8e\u655c\u655d\u655e\u655f\u6560\u6561\u6562\u6563\u6564\u6565\u6566\u6567\u6568\u6569\u656a\u656d\u3a8f\u3a90\u3a91\u3a92\u3a93\u3a94\u3a95\u3a96\u3a97\u3a98\u3a99\u3a9a\u656b\u656c\u656e\u656f\u6570\u3a9b\u3a9c\u3a9d\u3a9e\u3a9f\u6571\u6572\u6573\u3aa0\u3aa1\u3aa2\u3aa3\u6574\u6575\u6576\u6577\u6578\u6579\u657a\u657b\u3aa4\u3aa5\u3aa6\u657c\u657d\u657e\u657f\u3aa7\u3aa8\u3aa9\u3aaa\u6580\u6581\u6582\u6583\u8d01\u3aab\u3aac\u6584\u6585\u6586\u3aad\u3aae\u6587\u6588\u3aaf\u6589\u658a\u658b\u3ab0\u658c\u658d\u658e\u658f\u6590\u6591\u6592\u3ab1\u6593\u6594\u6595\u6596\u6597\u3ab2\u3ab3\u6598\u3ab4\u3ab5\u6599\u659a\u3ab6\u659b\u659c\u3ab7\u659d\u3ab8\u659e\u659f\u65a0\u65a1\u3ab9\u65a2\u65a3\u3aba\u3abb\u65a4\u65a5\u65a6\u65a7\u65a8\u65a9\u65aa\u65ab\u3abc\u3abd\u3abe\u3abf\u65ac\u65ad\u65ae\u65af\u3ac0\u65b0\u65b1\u65b2\u3ac1\u65b3\u3ac2\u65b4\u65b5\u65b6\u65b7\u65b8\u65b9\u3ac3\u65ba\u65bb\u65bc\u3ac4\u65bd\u65be\u65bf\u65c0\u3ac6\u65c1\u65c2\u65c3\u65c4\u65c5\u65c6\u65ca\u3ac5\u3ac7\u3ac8\u3ac9\u65c7\u65c8\u65c9\u65cb\u65cc\u65cd\u65ce\u65cf\u3aca\u3acb\u3acc\u65d0\u65d1\u3acd\u65d2\u65d3\u65d4\u65d5\u65d6\u65d7\u3ace\u3acf\u65d8\u65d9\u65da\u65db\u65dc\u65dd\u65de\u65df\u65e0\u65e1\u65e2\u65e3\u65e4\u65e5\u65e6\u65e7\u65e8\u65e9\u65ea\u65eb\u65ec\u65ed\u65ee\u65ef\u3ad0\u3ad1\u65f0\u65f1\u65f2\u65f3\u65f4\u65f5\u65f6\u65f7\u65f8\u3ad2\u3ad3\u3ad4\u3ad5\u3ad6\u3ad7\u65f9\u65fa\u65fb\u65fc\u65fd\u65fe\u65ff\u6600\u6601\u6602\u6603\u6604\u6605\u6606\u6607\u6608\u6609\u660a\u660b\u660c\u660d\u660e\u660f\u6610\u6611\u6612\u6613\u6614\u6615\u6616\u6617\u6618\u6619\u3ad8\u3ad9\u3ada\u661a\u661b\u661c\u661d\u661e\u661f\u6620\u6621\u6622\u6623\u6624\u6625\u6626\u6627\u6628\u6629\u662a\u662b\u662c\u662d\u662e\u662f\u6630\u6631\u6632\u6633\u6634\u6635\u6636\u6637\u6638\u6639\u663a\u663b\u663c\u663d\u663e\u663f\u3adb\u3adc\u3add\u3ade\u3adf\u3ae0\u3ae1\u3ae2\u3ae3\u3ae4\u6640\u6641\u6642\u6643\u6644\u6645\u6646\u6647\u6648\u6649\u664a\u664b\u664c\u664d\u664e\u664f\u6650\u6651\u6652\u6653\u6654\u6655\u6656\u3ae5\u3ae6\u3ae7\u3ae8\u3ae9\u3aea\u3aeb\u3aec\u3aed\u3aee\u52d7\u6657\u6658\u6659\u665a\u665b\u665c\u665d\u665e\u665f\u6660\u6661\u6662\u6663\u6664\u6665\u6666\u6667\u6668\u6669\u66fd\u3aef\u3af0\u3af1\u3af2\u3af3\u3af4\u666a\u666b\u666c\u666d\u666e\u666f\u6670\u6671\u6672\u6673\u6674\u6675\u6676\u6677\u6678\u6679\u667a\u667b\u667c\u667d\u667e\u667f\u6680\u6681\u6682\u6683\u6691\u3af5\u3af6\u3af7\u3af8\u3af9\u3afa\u3afb\u3afc\u3afd\u3afe\u3aff\u3b00\u6684\u6685\u6686\u6687\u6688\u6689\u668a\u668b\u668c\u668d\u668e\u668f\u6690\u6692\u6693\u6694\u6695\u6696\u6697\u6698\u6699\u3b01\u3b02\u3b03\u3b04\u3b05\u3b06\u3b07\u3b08\u3b09\u3b0a\u3b0b\u3b0c\u669a\u669b\u669c\u669d\u669e\u669f\u66a0\u66a1\u66a2\u66a3\u66a4\u66a5\u66a6\u66a7\u66a8\u3b0d\u3b0e\u3b0f\u3b10\u66a9\u66aa\u66ab\u66ac\u66ad\u66ae\u66af\u66b0\u66b1\u66b2\u66b3\u66b4\u66b5\u66b6\u66b7\u3b11\u3b12\u3b13\u3b14\u3b15\u3b16\u66b8\u66b9\u66ba\u66bb\u66bc\u66bd\u66be\u66bf\u66c0\u66c1\u66c2\u66c3\u66c4\u66c5\u66c6\u66c7\u66c8\u66c9\u66ca\u66cb\u66cc\u66cd\u9fa7\u3b17\u3b18\u3b19\u3b1a\u3b1b\u3b1c\u3b1d\u3b1e\u3b1f\u66ce\u66cf\u66d0\u66d1\u66d2\u66d3\u66d4\u66d5\u66d6\u66d7\u66da\u3b20\u3b21\u3b22\u66d8\u66d9\u66db\u66dc\u3b23\u3b24\u3b25\u3b26\u3b27\u3b28\u66dd\u66de\u66df\u66e0\u66e1\u66e2\u3b29\u3b2a\u66e3\u66e4\u66e5\u66e6\u66e7\u66e8\u3b2b\u66e9\u3b2c\u3b2d\u66ea\u66eb\u66ec\u3b2e\u66ed\u66ee\u66ef\u3b2f\u66f0\u66f1\u66f2\u66f3\u3b30\u66f4\u66f5\u66f6\u66f7\u66f8\u66fa\u66f9\u66fb\u66fc\u66fe\u66ff\u6701\u6702\u6703\u6704\u6705\u6706\u3b31\u3b32\u6707\u6708\u6709\u670a\u670b\u670c\u670d\u3b33\u4dba\u4dbb\u670e\u670f\u6710\u6712\u6713\u6714\u6715\u3b34\u3b35\u6716\u6717\u6718\u6719\u671a\u671b\u3b36\u3b37\u671c\u671d\u671e\u671f\u3b38\u4dbc\u6720\u4dbd\u6722\u3b3a\u3b3b\u81a4\u3b3c\u3b3d\u3b3e\u6723\u6724\u3b3f\u3b40\u6726\u6727\u6728\u6729\u672a\u672b\u672c\u672d\u672e\u672f\u6730\u6731\u6732\u6733\u6734\u6735\u6736\u6737\u6738\u6739\u673a\u673b\u673c\u673d\u673e\u673f\u6740\u6741\u6742\u6743\u3b41\u6744\u6745\u6746\u6747\u6748\u6749\u674a\u674b\u674c\u674d\u674e\u674f\u6750\u6751\u6752\u6753\u6754\u6755\u6756\u6757\u6758\u6759\u675a\u675b\u675c\u675d\u675e\u675f\u6760\u6761\u6762\u6763\u6764\u6765\u6766\u6767\u6768\u6769\u6781\u3b42\u3b43\u3b44\u3b45\u3b46\u676a\u676b\u676c\u676d\u676e\u676f\u6770\u6771\u6772\u6773\u6774\u6775\u6776\u6777\u6778\u6779\u677a\u677b\u677c\u677d\u677e\u677f\u6780\u6782\u6783\u6784\u6785\u6786\u6787\u6788\u6789\u678a\u678b\u678c\u678d\u678e\u678f\u6790\u6791\u6792\u6793\u6794\u6795\u6796\u6797\u6798\u6799\u679a\u679b\u679c\u679d\u679e\u679f\u67a0\u67a1\u67a2\u67a3\u67a4\u67a5\u67a6\u67a7\u67a8\u67a9\u67aa\u67ab\u67ac\u67ad\u3b47\u3b48\u3b49\u3b4a\u3b4b\u3b4c\u3b4d\u3b4e\u3b4f\u3b50\u67ae\u67af\u67b0\u67b1\u67b2\u67b3\u67b4\u67b5\u67b6\u67b7\u67b8\u67b9\u67ba\u67bb\u67bc\u67bd\u67be\u67bf\u67c0\u67c1\u67c2\u67c3\u67c4\u67c5\u67c6\u67c7\u67c8\u67c9\u67ca\u67cb\u67cc\u67cd\u67ce\u67cf\u67d0\u67d1\u67d2\u67d3\u67d4\u67d5\u67d6\u67d7\u67d8\u67d9\u67da\u67db\u67dc\u67dd\u67de\u67df\u67e0\u67e1\u67e2\u67e3\u67e4\u67e5\u67e6\u67e7\u67e8\u67e9\u67ea\u67eb\u67ec\u67ed\u67ee\u67ef\u67f0\u67f1\u67f2\u67f3\u67f4\u67f5\u67f6\u67f7\u67f8\u67f9\u67fa\u67fb\u67fc\u67fd\u67fe\u67ff\u6800\u6801\u6802\u6803\u6804\u6805\u6806\u6807\u6808\u6809\u680a\u680b\u680c\u680d\u680e\u680f\u6810\u6811\u3b51\u3b52\u3b53\u3b54\u3b55\u3b56\u3b57\u6812\u6813\u6814\u6815\u6816\u6817\u6818\u6819\u681a\u681b\u681c\u681d\u681e\u681f\u6820\u6821\u6822\u6823\u6824\u6825\u6826\u6827\u6828\u6829\u682a\u682b\u682c\u682d\u682e\u682f\u6830\u6831\u6832\u6833\u6834\u6835\u6836\u6837\u6838\u6839\u683a\u683b\u683c\u683d\u683e\u683f\u6840\u6841\u6842\u6843\u6844\u6845\u6846\u6847\u6848\u6849\u684a\u684b\u684c\u684d\u684e\u684f\u6850\u6851\u6852\u6853\u6854\u6855\u6856\u6857\u6858\u6859\u685a\u685b\u685c\u685d\u685e\u685f\u6860\u6861\u6862\u6863\u6864\u6865\u6866\u6867\u6868\u6869\u686a\u9fc4\u3b58\u3b59\u3b5a\u3b5b\u3b5c\u3b5d\u3b5e\u3b5f\u3b60\u3b61\u3b62\u3b63\u3b64\u3b65\u3b66\u3b67\u686b\u686c\u686d\u686e\u686f\u6870\u6871\u6872\u6873\u6874\u6875\u6876\u6877\u6878\u6879\u687a\u687b\u687c\u687d\u687e\u687f\u6880\u6881\u6882\u6883\u6884\u6885\u6886\u6887\u6888\u6889\u688a\u688b\u688c\u688d\u688e\u688f\u6890\u6891\u6892\u6893\u6894\u6895\u6896\u6897\u6898\u6899\u689a\u689b\u689c\u689d\u689e\u689f\u68a0\u68a1\u68a2\u68a3\u68a4\u68a5\u68a6\u68a7\u68a8\u68a9\u68aa\u68ab\u68ac\u68ad\u68ae\u68af\u68b0\u68b1\u68b2\u68b3\u68b4\u68b5\u68b6\u68b7\u68b8\u68b9\u68ba\u68bb\u68bc\u68bd\u68be\u68bf\u68c0\u68c1\u68c2\u3b68\u3b69\u3b6a\u3b6b\u3b6c\u3b6d\u3b6e\u3b6f\u3b70\u3b71\u3b72\u3b73\u3b74\u3b75\u3b77\u68c3\u68c4\u68c5\u68c6\u68c7\u68c8\u68c9\u68ca\u68cb\u68cc\u68cd\u68ce\u68cf\u68d0\u68d1\u68d2\u68d3\u68d4\u68d5\u68d6\u68d7\u68d8\u68d9\u68da\u68db\u68dc\u68dd\u68de\u68df\u68e0\u68e1\u68e2\u68e3\u68e4\u68e5\u68e6\u68e7\u68e8\u68e9\u68ea\u68eb\u68ec\u68ed\u68ee\u68ef\u68f0\u68f1\u68f2\u68f3\u68f4\u68f5\u68f6\u68f7\u68f8\u68f9\u68fa\u68fb\u68fc\u68fd\u68fe\u68ff\u6900\u6901\u6902\u6903\u6904\u6905\u6906\u6907\u6908\u6909\u690a\u690b\u690c\u690d\u690e\u690f\u6910\u6911\u6912\u6913\u6914\u6915\u6916\u6917\u6918\u6919\u691a\u691b\u691c\u691d\u691e\u691f\u6920\u6921\u6922\u6923\u6924\u6925\u6926\u6927\u6928\u6929\u692a\u692b\u692c\u692d\u692e\u3b76\u3b78\u3b79\u3b7a\u3b7b\u3b7c\u3b7d\u3b7e\u3b7f\u3b80\u3b81\u3b82\u3b83\u3b84\u3b85\u3b86\u3b87\u3b88\u3b89\u3b8a\u692f\u6930\u6931\u6932\u6933\u6934\u6935\u6936\u6937\u6938\u6939\u693a\u693b\u693c\u693d\u693e\u693f\u6940\u6941\u6942\u6943\u6944\u6945\u6946\u6947\u6948\u6949\u694a\u694b\u694c\u694d\u694e\u694f\u6950\u6951\u6952\u6953\u6954\u6955\u6956\u6957\u6958\u6959\u695a\u695b\u695c\u695d\u695e\u695f\u6960\u6961\u6962\u6963\u6964\u6965\u6966\u6967\u6968\u6969\u696a\u696b\u696c\u696d\u696e\u696f\u6970\u6971\u6972\u6973\u6974\u6975\u6976\u6977\u6978\u6979\u697a\u697b\u697c\u697d\u697e\u697f\u6980\u6981\u6982\u6983\u6984\u6985\u6986\u6987\u6988\u6989\u698b\u698c\u6994\u6998\ufa13\u3b8b\u3b8c\u3b8d\u3b8e\u3b8f\u3b90\u3b91\u3b92\u3b93\u3b94\u3b95\u3b96\u3b97\u3b98\u3b99\u3b9a\u3b9b\u3b9c\u3b9d\u3b9e\u3b9f\u3ba0\u3ba2\u3ba3\u698a\u698d\u698e\u698f\u6990\u6991\u6992\u6993\u6995\u6996\u6997\u6999\u699a\u699b\u699c\u699d\u699e\u699f\u69a0\u69a1\u69a2\u69a3\u69a4\u69a5\u69a6\u69a7\u69a8\u69a9\u69aa\u69ab\u69ac\u69ad\u69ae\u69af\u69b0\u69b1\u69b2\u69b3\u69b4\u69b5\u69b6\u69b7\u69b8\u69b9\u69ba\u69bb\u69bc\u69bd\u69be\u69bf\u69c0\u69c1\u69c2\u69c3\u69c4\u69c5\u69c6\u69c7\u69c8\u69c9\u69ca\u69cb\u69cc\u69cd\u69ce\u69cf\u69d0\u69d1\u69d2\u69d3\u69d4\u69d5\u69d6\u69d7\u69d8\u69d9\u69da\u69db\u69dc\u69dd\u69de\u69df\u69e0\u69e1\u69e9\u6a2e\ufa14\u3ba4\u3ba5\u3ba6\u3ba7\u3ba8\u3ba9\u3baa\u3bab\u3bac\u3bad\u3bae\u3baf\u3bb0\u3bb1\u3bb2\u3bb3\u3bb4\u3bb5\u3bb6\u3bb7\u3bb8\u3bb9\u3bba\u3bbb\u3bbc\u3bbd\u69e2\u69e3\u69e4\u69e5\u69e6\u69e7\u69e8\u69ea\u69eb\u69ec\u69ed\u69ee\u69ef\u69f0\u69f1\u69f2\u69f3\u69f4\u69f5\u69f6\u69f7\u69f8\u69f9\u69fa\u69fb\u69fc\u69fd\u69fe\u69ff\u6a00\u6a01\u6a02\u6a03\u6a04\u6a05\u6a06\u6a07\u6a08\u6a09\u6a0a\u6a0b\u6a0c\u6a0d\u6a0e\u6a0f\u6a10\u6a11\u6a12\u6a13\u6a14\u6a15\u6a16\u6a17\u6a18\u6a19\u6a1a\u6a1b\u6a1c\u6a1d\u6a1e\u6a1f\u6a20\u6a21\u6a22\u6a23\u6a24\u6a25\u6a26\u6a27\u6a28\u6a29\u6a2a\u6a2b\u6a2c\u6a2d\u6a2f\u6a30\u6a31\u6a65\u6a74\u3bbe\u3bbf\u3bc0\u3bc1\u3bc2\u3bc3\u3bc4\u3bc5\u3bc6\u3bc7\u3bc8\u3bc9\u3bca\u3bcb\u3bcc\u3bcd\u3bce\u3bcf\u3bd1\u3bd2\u3be0\u6a32\u6a33\u6a34\u6a35\u6a36\u6a37\u6a38\u6a39\u6a3a\u6a3b\u6a3c\u6a3d\u6a3e\u6a3f\u6a40\u6a41\u6a42\u6a43\u6a44\u6a45\u6a46\u6a47\u6a48\u6a49\u6a4a\u6a4b\u6a4c\u6a4d\u6a4e\u6a4f\u6a50\u6a51\u6a52\u6a53\u6a54\u6a55\u6a56\u6a57\u6a58\u6a59\u6a5a\u6a5b\u6a5c\u6a5d\u6a5e\u6a5f\u6a60\u6a61\u6a62\u6a63\u6a64\u6a66\u6a67\u6a68\u6a69\u6a6a\u6a6b\u6a6c\u6a6d\u6a6e\u6a6f\u6a70\u6a71\u6a72\u6a73\u6a75\u6a76\u6a77\u6a78\u6a79\u6a7a\u6a7b\u6a7c\u3bd0\u3bd3\u3bd4\u3bd5\u3bd6\u3bd7\u3bd8\u3bd9\u3bda\u3bdb\u3bdc\u3bdd\u3bde\u3bdf\u3be1\u3be2\u3be3\u3be4\u3be5\u3be6\u3be7\u3be8\u3be9\u6a7d\u6a7e\u6a7f\u6a80\u6a81\u6a82\u6a83\u6a84\u6a85\u6a86\u6a87\u6a88\u6a89\u6a8a\u6a8b\u6a8c\u6a8d\u6a8e\u6a8f\u6a90\u6a91\u6a92\u6a93\u6a94\u6a95\u6a96\u6a97\u6a98\u6a99\u6a9a\u6a9b\u6a9c\u6a9d\u6a9e\u6a9f\u6aa0\u6aa1\u6aa2\u6aa3\u6aa4\u6aa5\u6aa6\u6aa7\u6aa8\u6aa9\u6aaa\u3bea\u3beb\u3bec\u3bed\u3bee\u3bef\u3bf0\u3bf1\u3bf2\u3bf3\u3bf4\u3bf5\u3bf6\u6aab\u6aac\u6aad\u6aae\u6aaf\u6ab0\u6ab1\u6ab2\u6ab3\u6ab4\u6ab5\u6ab6\u6ab7\u6ab8\u6ab9\u6aba\u6abb\u6abc\u6abd\u6abe\u6abf\u6ac0\u6ac1\u6ac2\u6ac3\u6ac4\u6ac5\u6ac6\u6ac7\u6ac8\u6ac9\u6aca\u3bf7\u3bf8\u3bf9\u3bfa\u3bfb\u3bfc\u3bfd\u6acb\u6acc\u6acd\u6ace\u6acf\u6ad0\u6ad1\u6ad2\u6ad3\u6ad4\u6ad5\u6ad6\u6ad7\u6ad8\u6ad9\u6ada\u6adb\u6adc\u6add\u6ade\u6adf\u6ae0\u6ae1\u6ae2\u6ae3\u6ae4\u6ae5\u6ae6\u6aeb\u6aed\u3bfe\u3bff\u3c00\u3c01\u3c02\u3c03\u3c04\u3c05\u3c06\u3c07\u3c08\u6ae7\u6ae8\u6ae9\u6aea\u6aec\u6aee\u6aef\u6af0\u6af1\u6af2\u6af3\u6af4\u6af5\u6af6\u3c09\u3c0a\u3c0b\u3c0c\u3c0d\u3c0e\u3c0f\u3c10\u3c11\u3c12\u3c13\u3c16\u6af8\u6af9\u6afa\u6afb\u6afc\u6afd\u6afe\u6aff\u6b00\u6b01\u6b02\u6b03\u6b04\u6b05\u6b0c\u3c14\u3c15\u6af7\u6b06\u6b07\u6b08\u6b09\u6b0a\u6b0b\u6b0d\u6b0e\u3c17\u3c18\u6b0f\u6b10\u6b11\u6b12\u3c19\u3c1a\u3c1b\u3c1c\u6b13\u6b14\u6b15\u6b16\u6b17\u6b18\u6b19\u6b1a\u6b1b\u6b1c\u6b1d\u9fdd\u6b1e\u6b1f\u6b20\u6b21\u6b22\u6b24\u3c1d\u3c1e\u6b23\u6b25\u6b26\u6b27\u3c1f\u3c20\u3c21\u3c22\u6b28\u6b29\u6b2a\u3c23\u3c24\u3c25\u3c26\u3c27\u3c28\u6b2b\u6b2c\u6b2d\u6b2e\u6b2f\u6b30\u6b31\u3c29\u3c2a\u3c2b\u3c2c\u3c2d\u4dbe\u6b32\u6b33\u6b34\u6b35\u6b36\u6b37\u6b38\u3c2e\u3c2f\u3c30\u3c31\u6b39\u6b3a\u6b3b\u6b3c\u6b3d\u6b3e\u6b3f\u3c32\u3c33\u3c34\u3c35\u3c36\u3c38\u6b40\u6b41\u6b42\u6b43\u6b44\u6b45\u6b46\u6b47\u6b48\u3c39\u3c3a\u3c3b\u3c3c\u3c3d\u3c3e\u6b49\u6b4a\u6b4b\u6b4c\u6b4d\u3c3f\u3c40\u3c41\u6b4e\u6b4f\u6b50\u6b51\u6b52\u6b53\u3c42\u3c43\u6b54\u6b55\u6b56\u6b57\u6b58\u6b59\u6b5a\u3c44\u3c45\u6b5b\u6b5c\u6b5d\u3c46\u3c47\u3c48\u3c49\u6b5e\u6b5f\u6b60\u3c4a\u3c4b\u6b61\u3c4c\u3c4d\u3c4e\u6b62\u9fb0\u6b63\u6b64\u3c4f\u6b65\u3c50\u3c51\u6b66\u6b67\u6b68\u6b69\u6b6a\u6b6b\u3c52\u3c53\u3c54\u6b6c\u6b6d\u6b6e\u6b6f\u3c55\u3c56\u6b70\u6b71\u6b72\u6b73\u6b74\u3c57\u6b75\u6b76\u6b77\u6b78\u3c58\u6b79\u6b7a\u6b7b\u3c59\u6b7c\u6b7d\u6b7e\u6b7f\u6b80\u6b81\u3c5a\u3c5b\u3c5c\u3c5d\u6b82\u6b83\u6b84\u6b85\u6b86\u6b87\u3c5e\u3c5f\u3c60\u6b88\u6b89\u6b8a\u6b8b\u3c37\u3c61\u6b8c\u6b8d\u6b8e\u6b8f\u6b90\u6b91\u6b92\u6b93\u3c62\u3c63\u6b94\u6b95\u6b96\u6b97\u6b98\u6b99\u6b9a\u3c64\u3c65\u3c66\u3c67\u3c68\u3c69\u6b9b\u6b9c\u3c6a\u3c6b\u3c6c\u3c6d\u3c6e\u6b9d\u6b9e\u6b9f\u6ba0\u6ba1\u3c6f\u3c70\u3c71\u3c72\u6ba2\u6ba3\u6ba4\u6ba5\u6ba6\u3c73\u3c74\u6ba7\u6ba8\u6ba9\u6baa\u6bab\u3c75\u3c76\u3c77\u6bac\u6bad\u6bae\u3c78\u6baf\u6bb0\u6bb1\u9fde\u3c79\u3c7a\u6bb2\u3c7b\u6bb3\u3c7c\u6bb4\u3c7d\u6bb5\u6bb6\u6bb7\u3c7e\u3c7f\u6bb8\u6bb9\u6bba\u6bbb\u3c80\u6bbc\u6bbd\u3c81\u3c82\u3c83\u6bbe\u6bbf\u6bc0\u6bc1\u6bc2\u3c84\u6bc3\u6bc4\u3c85\u6bc5\u6bc6\u6bc7\u6bc8\u3c86\u3c87\u3c88\u3c89\u3c8a\u6bc9\u6bca\u6bcb\u6bcc\u6bcd\u6bce\u6bcf\u6bd0\u6bd1\u6bd2\u6bd3\u6bd4\u6bd5\u6bd6\u6bd7\u6bd8\u3c8b\u6bd9\u6bda\u6bdb\u3c8c\u6bdc\u6bdd\u6bde\u6bdf\u3c8d\u3c8e\u3c8f\u3c90\u3c91\u6be0\u6be1\u3c92\u6be2\u6be3\u6be4\u6be5\u6be6\u6be7\u6be8\u6be9\u6bea\u3c93\u6beb\u6bec\u6bed\u6bee\u3c94\u3c95\u3c96\u3c97\u3c98\u3c99\u3c9a\u6bef\u6bf0\u6bf1\u6bf2\u6bf3\u6bf4\u6bf5\u6bf6\u3c9b\u3c9c\u3c9d\u3c9e\u6bf7\u6bf8\u6bf9\u6bfa\u6bfb\u6bfc\u6bfd\u3c9f\u3ca0\u3ca1\u3ca2\u3ca3\u6bfe\u3ca4\u3ca5\u3ca6\u3ca7\u3ca8\u3ca9\u6bff\u6c00\u6c01\u6c02\u6c03\u6c04\u6c05\u6c06\u6c07\u3caa\u3cab\u3cac\u3cad\u3cae\u6c08\u6c09\u6c0a\u6c0b\u3caf\u3cb0\u6c0c\u3cb1\u6c0d\u6c0e\u3cb2\u6c0f\u6c10\u6c11\u6c12\u6c13\u3cb3\u6c14\u6c15\u6c16\u6c17\u6c18\u6c19\u6c1a\u6c1b\u6c1c\u6c1d\u3cb4\u6c1e\u6c1f\u6c20\u6c21\u6c22\u6c23\u6c24\u6c25\u6c26\u6c27\u6c28\u6c29\u6c2a\u6c2b\u3cb5\u6c2c\u6c2d\u6c2e\u6c2f\u6c30\u6c31\u6c32\u6c33\u3cb6\u3cb7\u9feb\u6c34\u6c35\u6c3a\u6c36\u6c37\u6c38\u6c39\u3cb8\u6c3b\u6c3c\u6c3e\u6c3f\u6c40\u6c41\u6c42\u6c43\u6c44\u6c45\u6c46\u6c47\u6c48\u6c49\u3cb9\u3cba\u3cbb\u3cbc\u6c4a\u6c4b\u6c4c\u6c4d\u6c4e\u6c4f\u6c50\u6c51\u6c52\u6c53\u6c54\u6c55\u6c56\u6c57\u6c58\u6c59\u6c5a\u6c5b\u6c5c\u6c5d\u6c5e\u6c5f\u6c60\u6c61\u6c62\u6c63\u6c64\u3cbd\u3cbe\u3cbf\u6c65\u6c66\u6c67\u6c68\u6c69\u6c6a\u6c6b\u6c6c\u6c6d\u6c6e\u6c6f\u6c70\u6c71\u6c72\u6c73\u6c74\u6c75\u6c76\u6c77\u6c78\u6c79\u6c7a\u6c7b\u6c7c\u6c7d\u6c7e\u6c7f\u6c80\u6c81\u6c82\u6c83\u6c84\u6c85\u6c86\u6c87\u6c88\u6c89\u6c8a\u6c8b\u6c8c\u6c8d\u6c8e\u6c8f\u6c90\u6c91\u6c92\u6c93\u6c94\u6c95\u6c96\u6c97\u6c98\u6c99\u6c9a\u6c9b\u6c9c\u6c9d\u6c9e\u6c9f\u6ca0\u6ca1\u6ca2\u6ca3\u6ca4\u6ca5\u6ca6\u6ca7\u6ca8\u6ca9\u6caa\u3cc0\u3cc1\u3cc2\u3cc3\u3cc4\u3cc5\u3cc6\u3cc7\u3cc8\u3cc9\u3cca\u6cab\u6cac\u6cad\u6cae\u6caf\u6cb0\u6cb1\u6cb2\u6cb3\u6cb4\u6cb5\u6cb6\u6cb7\u6cb8\u6cb9\u6cba\u6cbb\u6cbc\u6cbd\u6cbe\u6cbf\u6cc0\u6cc1\u6cc2\u6cc3\u6cc4\u6cc5\u6cc6\u6cc7\u6cc8\u6cc9\u6cca\u6ccb\u6ccc\u6ccd\u6cce\u6ccf\u6cd0\u6cd1\u6cd2\u6cd3\u6cd4\u6cd5\u6cd6\u6cd7\u6cd8\u6cd9\u6cdb\u6cdc\u6cdd\u6cde\u6cdf\u6ce0\u6ce1\u6ce2\u6ce3\u6ce4\u6ce5\u6ce6\u6ce7\u6ce8\u6ce9\u6cea\u6ceb\u6cec\u6ced\u6cee\u6cef\u6cf0\u6cf1\u6cf2\u6cf3\u6cf4\u6cf6\u6cf7\u6cf8\u6cf9\u6cfa\u6cfb\u6cfc\u6cfd\u6cfe\u3ccb\u3ccc\u3ccd\u3cce\u3ccf\u3cd0\u3cd1\u3cd2\u3cd3\u3cd4\u3cd5\u6cda\u6cff\u6d00\u6d01\u6d02\u6d03\u6d04\u6d05\u6d06\u6d07\u6d08\u6d09\u6d0a\u6d0b\u6d0c\u6d0e\u6d0f\u6d10\u6d11\u6d12\u6d13\u6d14\u6d15\u6d17\u6d18\u6d19\u6d1a\u6d1b\u6d1c\u6d1d\u6d1e\u6d1f\u6d20\u6d21\u6d22\u6d23\u6d24\u6d25\u6d26\u6d27\u6d28\u6d29\u6d2a\u6d2b\u6d2c\u6d2d\u6d2e\u6d2f\u6d30\u6d31\u6d32\u6d33\u6d34\u6d35\u6d36\u6d37\u6d38\u6d39\u6d3a\u6d3b\u6d3c\u6d3d\u6d3e\u6d3f\u6d40\u6d41\u6d42\u6d43\u6d44\u6d45\u6d46\u6d47\u6d48\u6d49\u6d4a\u6d4b\u6d4c\u6d4d\u6d4e\u6d4f\u6d50\u6d51\u6d52\u6d53\u6d54\u6d55\u3cd6\u3cd7\u3cd8\u3cd9\u3cda\u3cdb\u3cdc\u3cdd\u3cde\u3cdf\u3ce0\u3ce1\u3ce2\u3ce3\u6d0d\u6d16\u6d56\u6d57\u6d58\u6d59\u6d5a\u6d5b\u6d5c\u6d5d\u6d5e\u6d5f\u6d60\u6d61\u6d62\u6d63\u6d64\u6d65\u6d66\u6d67\u6d68\u6d69\u6d6a\u6d6b\u6d6c\u6d6d\u6d6e\u6d6f\u6d70\u6d71\u6d72\u6d73\u6d74\u6d75\u6d76\u6d77\u6d78\u6d79\u6d7a\u6d7b\u6d7c\u6d7d\u6d7e\u6d7f\u6d80\u6d81\u6d82\u6d83\u6d84\u6d85\u6d86\u6d87\u6d88\u6d89\u6d8a\u6d8b\u6d8c\u6d8d\u6d8e\u6d8f\u6d90\u6d91\u6d92\u6d93\u6d94\u6d95\u6d96\u6d97\u6d98\u6d9a\u6d9b\u6d9c\u6d9d\u6d9e\u6d9f\u6da0\u6da1\u6da2\u6da3\u6da4\u6da5\u6da6\u6da7\u6da8\u6da9\u3ce4\u3ce5\u3ce6\u3ce7\u3ce8\u3ce9\u3cea\u3ceb\u3cec\u3ced\u3cee\u3cef\u3cf0\u3cf1\u3cf2\u3cf3\u6d99\u6daa\u6dab\u6dac\u6dad\u6dae\u6daf\u6db0\u6db1\u6db2\u6db3\u6db4\u6db5\u6db6\u6db7\u6db8\u6db9\u6dba\u6dbb\u6dbc\u6dbd\u6dbe\u6dbf\u6dc0\u6dc1\u6dc2\u6dc3\u6dc4\u6dc5\u6dc6\u6dc7\u6dc8\u6dc9\u6dca\u6dcb\u6dcc\u6dcd\u6dce\u6dcf\u6dd0\u6dd1\u6dd2\u6dd3\u6dd4\u6dd5\u6dd6\u6dd7\u6dd8\u6dd9\u6dda\u6ddb\u6ddc\u6ddd\u6dde\u6ddf\u6de0\u6de1\u6de2\u6de3\u6de4\u6de5\u6de6\u6de7\u6de8\u6de9\u6dea\u6deb\u6dec\u6ded\u6dee\u6def\u6df0\u6df1\u6df2\u6df3\u6df4\u6df5\u6df6\u6df7\u6df8\u6df9\u6dfa\u6dfb\u6dfc\u6dfd\u6dfe\u6dff\u6e00\u6e01\u6e02\u6e04\u6e05\u6e06\u6e07\u6e08\u6e09\u6e0a\u6e0b\u6e0c\u6e0d\u6e0e\u6e0f\u6e10\u6e11\u6e12\u6e13\u6e14\u6e15\u6e16\u6e17\u6e1a\u6e74\u3cf4\u3cf5\u3cf6\u3cf7\u3cf8\u3cf9\u3cfa\u3cfb\u3cfc\u3cfd\u3cfe\u3cff\u3d00\u3d01\u3d02\u3d03\u3d04\u3d05\u3d06\u3d07\u3d08\u3d09\u3d0a\u3d0b\u3d0c\u3d0d\u3d0e\u6e03\u6e18\u6e19\u6e1b\u6e1c\u6e1d\u6e1e\u6e1f\u6e20\u6e21\u6e22\u6e23\u6e24\u6e25\u6e26\u6e27\u6e28\u6e29\u6e2a\u6e2b\u6e2c\u6e2d\u6e2e\u6e2f\u6e30\u6e31\u6e32\u6e33\u6e34\u6e35\u6e36\u6e37\u6e38\u6e39\u6e3a\u6e3b\u6e3c\u6e3d\u6e3e\u6e3f\u6e40\u6e41\u6e42\u6e43\u6e44\u6e45\u6e46\u6e47\u6e48\u6e49\u6e4a\u6e4b\u6e4c\u6e4d\u6e4e\u6e4f\u6e50\u6e51\u6e52\u6e53\u6e54\u6e55\u6e56\u6e57\u6e58\u6e59\u6e5a\u6e5b\u6e5c\u6e5d\u6e5e\u6e5f\u6e60\u6e61\u6e62\u6e63\u6e64\u6e65\u6e66\u6e67\u6e68\u6e69\u6e6a\u6e6b\u6e6c\u6e6d\u6e6e\u6e6f\u6e70\u6e71\u6e72\u6e73\u6e75\u6e76\u6e77\u6e78\u6e79\u6e7a\u6e7b\u6e7c\u6e7d\u6e7e\u6e7f\u6e80\u6e81\u6e82\u6e83\u6e84\u6e85\u6e86\u6e87\u6e88\u6e89\u6e8a\u6e8b\u6e8c\u6ecb\u6ede\u9fcc\u3d0f\u3d10\u3d11\u3d12\u3d13\u3d14\u3d15\u3d16\u3d17\u3d18\u3d19\u3d1a\u3d1b\u3d1c\u3d1d\u3d1e\u3d1f\u3d20\u3d21\u3d22\u3d23\u3d24\u6e8d\u6e8e\u6e8f\u6e90\u6e91\u6e92\u6e93\u6e94\u6e95\u6e96\u6e97\u6e98\u6e99\u6e9a\u6e9b\u6e9c\u6e9d\u6e9e\u6e9f\u6ea0\u6ea1\u6ea2\u6ea3\u6ea4\u6ea5\u6ea6\u6ea7\u6ea8\u6ea9\u6eaa\u6eab\u6eac\u6ead\u6eae\u6eaf\u6eb0\u6eb1\u6eb2\u6eb3\u6eb4\u6eb5\u6eb6\u6eb7\u6eb8\u6eb9\u6eba\u6ebb\u6ebc\u6ebd\u6ebe\u6ebf\u6ec0\u6ec1\u6ec2\u6ec3\u6ec4\u6ec5\u6ec6\u6ec7\u6ec8\u6ec9\u6eca\u6ecd\u6ece\u6ecf\u6ed0\u6ed1\u6ed2\u6ed3\u6ed4\u6ed5\u6ed6\u6ed7\u6ed8\u6ed9\u6edb\u6edc\u6edd\u6edf\u6ee0\u6ee1\u6ee2\u6ee3\u6ee4\u6ee5\u6ee6\u6ee7\u6ee8\u6ee9\u6eea\u6f13\u3d25\u3d26\u3d27\u3d28\u3d29\u3d2a\u3d2b\u3d2c\u3d2d\u3d2e\u3d2f\u3d30\u3d31\u3d32\u3d33\u3d34\u3d35\u3d36\u3d37\u3d38\u3d39\u3d3a\u3d3b\u6ecc\u6eda\u6eeb\u6eec\u6eed\u6eee\u6eef\u6ef0\u6ef1\u6ef2\u6ef3\u6ef4\u6ef5\u6ef6\u6ef7\u6ef8\u6ef9\u6efa\u6efb\u6efc\u6efd\u6efe\u6eff\u6f00\u6f01\u6f02\u6f03\u6f04\u6f05\u6f06\u6f07\u6f08\u6f09\u6f0a\u6f0c\u6f0d\u6f0e\u6f0f\u6f10\u6f11\u6f12\u6f14\u6f15\u6f16\u6f17\u6f18\u6f19\u6f1a\u6f1b\u6f1c\u6f1d\u6f1e\u6f1f\u6f20\u6f21\u6f22\u6f23\u6f24\u6f25\u6f26\u6f27\u6f28\u6f29\u6f2a\u6f2b\u6f2c\u6f2d\u6f2e\u6f2f\u6f30\u6f31\u6f32\u6f33\u6f34\u6f35\u6f36\u6f37\u6f38\u6f39\u6f3a\u6f3b\u6f3c\u6f3e\u6f3f\u6f40\u6f41\u6f42\u6f43\u6f44\u6f45\u6f46\u6f47\u6f48\u6f49\u6f4a\u6f4b\u6f4c\u6f4d\u3d3c\u3d3d\u3d3e\u3d3f\u3d40\u3d41\u3d42\u3d43\u3d44\u3d45\u3d46\u3d47\u3d48\u3d49\u6f0b\u6f3d\u6f4e\u6f4f\u6f50\u6f51\u6f52\u6f53\u6f54\u6f55\u6f56\u6f57\u6f58\u6f59\u6f5a\u6f5b\u6f5c\u6f5d\u6f5e\u6f5f\u6f60\u6f61\u6f62\u6f63\u6f64\u6f65\u6f66\u6f67\u6f68\u6f69\u6f6a\u6f6b\u6f6c\u6f6d\u6f6e\u6f6f\u6f70\u6f71\u6f72\u6f73\u6f74\u6f75\u6f76\u6f77\u6f78\u6f79\u6f7a\u6f7b\u6f7c\u6f7d\u6f7e\u6f7f\u6f81\u6f82\u6f83\u6f84\u6f85\u6f86\u6f87\u6f88\u6f89\u6f8a\u6f8b\u6f8c\u6f8d\u6f8e\u6f8f\u6f90\u6f91\u6f92\u6f93\u6f94\u6f95\u6f96\u6f97\u6f98\u6f9a\u6f9b\u6f9c\u6f9d\u6fd0\u9ff0\u3d4a\u3d4b\u3d4c\u3d4d\u3d4e\u3d4f\u3d50\u3d51\u3d52\u3d53\u3d54\u3d55\u3d56\u3d57\u3d58\u3d59\u3d5a\u3d5b\u3d5c\u6f99\u6f9e\u6f9f\u6fa0\u6fa1\u6fa2\u6fa3\u6fa4\u6fa5\u6fa6\u6fa7\u6fa8\u6fa9\u6faa\u6fab\u6fac\u6fad\u6fae\u6faf\u6fb0\u6fb1\u6fb2\u6fb3\u6fb4\u6fb5\u6fb6\u6fb7\u6fb8\u6fb9\u6fba\u6fbb\u6fbc\u6fbd\u6fbe\u6fbf\u6fc0\u6fc1\u6fc2\u6fc3\u6fc4\u6fc5\u6fc6\u6fc7\u6fc8\u6fc9\u6fca\u6fcb\u6fcc\u6fcd\u6fce\u6fcf\u6fd1\u6fd2\u6fd3\u6fd6\u3d5d\u3d5e\u3d5f\u3d60\u3d61\u3d62\u3d63\u3d64\u3d65\u3d66\u3d67\u3d68\u3d69\u3d6a\u3d6b\u3d6c\u3d6d\u3d6e\u6f80\u6fd4\u6fd5\u6fd7\u6fd8\u6fd9\u6fda\u6fdb\u6fdc\u6fdd\u6fde\u6fdf\u6fe0\u6fe1\u6fe2\u6fe3\u6fe4\u6fe5\u6fe6\u6fe7\u6fe8\u6fe9\u6fea\u6feb\u6fec\u6fed\u6fee\u6fef\u6ff0\u6ff1\u6ff2\u6ff4\u6ff5\u6ff6\u6ff7\u6ff8\u3d6f\u3d70\u3d71\u3d72\u3d73\u3d74\u3d75\u3d76\u3d77\u3d78\u3d79\u3d7a\u3d7b\u3d7c\u6ff9\u6ffa\u6ffb\u6ffc\u6ffd\u6ffe\u6fff\u7000\u7001\u7002\u7003\u7004\u7005\u7006\u7007\u7008\u7009\u700a\u700b\u700c\u700d\u700e\u700f\u7010\u7011\u7012\u7013\u7014\u3d7d\u3d7e\u3d7f\u3d80\u3d81\u3d82\u3d83\u6ff3\u7015\u7016\u7017\u7018\u7019\u701a\u701b\u701c\u701d\u701e\u701f\u7020\u7021\u7022\u7023\u7024\u7025\u7026\u7027\u7028\u7029\u702a\u702b\u702c\u702d\u702e\u3d84\u3d85\u3d86\u3d87\u3d88\u3d89\u3d8a\u3d8b\u702f\u7030\u7031\u7032\u7033\u7034\u7035\u7036\u7037\u7038\u7039\u703a\u703b\u703c\u703d\u703e\u703f\u7040\u7041\u3d8c\u3d8d\u3d8e\u3d8f\u3d90\u3d91\u7042\u7043\u7044\u7045\u7046\u7047\u7048\u7049\u704a\u704b\u704c\u704d\u704f\u7050\u3d92\u3d93\u3d94\u3d95\u3d96\u3d97\u3d98\u7051\u7052\u7053\u7054\u7055\u7056\u7057\u7058\u3d99\u3d9a\u7059\u705a\u705b\u705c\u3d9b\u3d9c\u3d9d\u705d\u705e\u705f\u7060\u7061\u3d9e\u3d9f\u7062\u7063\u704e\u7064\u7065\u7066\u3da0\u7067\u7068\u7069\u706a\u706b\u706c\u706d\u706e\u706f\u7070\u7071\u7072\u7073\u7087\u3da1\u3da2\u7074\u7075\u7076\u7077\u7078\u7079\u707a\u707b\u707c\u707d\u707e\u707f\u7080\u3da3\u3da4\u3da5\u7081\u7082\u7083\u7084\u7085\u7086\u7088\u7089\u708a\u708b\u708c\u708d\u708e\u708f\u7090\u7091\u7092\u7093\u7094\u7095\u7096\u7097\u7098\u7099\u709a\u709b\u709c\u709d\u709e\u3da6\u3da7\u3da8\u3da9\u3daa\u709f\u70a0\u70a1\u70a2\u70a3\u70a4\u70a5\u70a6\u70a7\u70a8\u70a9\u70aa\u70ab\u70ac\u70ad\u70ae\u70af\u70b0\u70b1\u70b2\u70b3\u70b4\u70b5\u70b6\u70b7\u70b8\u70b9\u70ba\u70bb\u70bc\u70bd\u70be\u70bf\u70c0\u70c1\u70c2\u70c3\u3dab\u3dac\u3dad\u3dae\u3daf\u3db0\u3db1\u3db2\u70c4\u70c5\u70c6\u70c7\u70c8\u70c9\u70ca\u70cb\u70cc\u70cd\u70ce\u70cf\u70d0\u70d1\u70d2\u70d3\u70d4\u70d5\u70d6\u70d7\u70d8\u70d9\u70da\u70db\u70dc\u70dd\u70de\u70df\u70e0\u70e1\u70e2\u70e3\u70e4\u70e5\u70e6\u70e7\u70e8\u70e9\u70ea\u70eb\u70ec\u70ed\u70ee\u3db3\u3db4\u3db5\u3db6\u3db7\u3db8\u70ef\u70f0\u70f1\u70f2\u70f3\u70f4\u70f5\u70f6\u70f7\u70f8\u70f9\u70fa\u70fb\u70fc\u70fd\u70fe\u70ff\u7100\u7101\u7102\u7103\u7104\u7105\u7106\u7107\u7108\u7109\u710a\u710b\u710c\u710d\u710e\u710f\u7110\u7111\u7112\u7113\u7115\u7116\u7117\u7118\u3db9\u3dba\u3dbb\u3dbc\u3dbd\u3dbe\u3dbf\u3dc0\u3dc1\u7114\u7119\u711a\u711b\u711c\u711d\u711e\u711f\u7120\u7121\u7122\u7123\u7124\u7125\u7126\u7127\u7128\u7129\u712a\u712b\u712c\u712d\u712e\u712f\u7130\u7131\u7132\u7133\u7134\u7135\u7136\u7137\u7138\u7139\u713a\u713b\u713c\u713d\u713e\u713f\u7140\u716e\u3dc2\u3dc3\u3dc4\u3dc5\u3dc6\u3dc7\u3dc8\u3dc9\u3dca\u3dcb\u3dcc\u3dcd\u7141\u7142\u7143\u7144\u7145\u7146\u7147\u7148\u7149\u714a\u714b\u714c\u714d\u714e\u714f\u7150\u7151\u7152\u7153\u7154\u7155\u7156\u7157\u7158\u7159\u715a\u715b\u715c\u715d\u715e\u715f\u7160\u7161\u7162\u7163\u7164\u7165\u7166\u7167\u7168\u7169\u716a\u716b\u716c\u716d\u716f\u7170\u7171\u7172\u7173\u7174\u7175\u7176\u7177\u7178\u717a\u3ba1\u3dce\u3dcf\u3dd0\u3dd1\u3dd2\u3dd3\u3dd4\u3dd5\u3dd6\u3dd7\u3dd8\u3dd9\u3dda\u3ddb\u3ddc\u3ddd\u3dde\u7179\u717b\u717c\u717d\u717e\u717f\u7180\u7181\u7182\u7183\u7184\u7185\u7186\u7187\u7188\u7189\u718a\u718b\u718c\u718d\u718e\u718f\u7190\u7191\u7192\u7193\u7194\u7195\u7196\u7197\u7198\u7199\u71a6\u84b8\u3ddf\u3de0\u3de1\u3de2\u3de3\u3de4\u3de5\u3de6\u3de7\u3de8\u3de9\u3dea\u719a\u719b\u719c\u719d\u719e\u719f\u71a0\u71a1\u71a2\u71a3\u71a4\u71a5\u71a7\u71a8\u71a9\u71aa\u71ab\u71ac\u71ad\u71ae\u71af\u71b0\u71b1\u71b2\u71b3\u71b4\u71b5\u9ed9\u9fa6\u9fbd\u3deb\u3dec\u3ded\u3dee\u3def\u3df0\u3df1\u3df2\u71b6\u71b7\u71b8\u71b9\u71ba\u71bb\u71bc\u71bd\u71be\u71bf\u71c0\u71c1\u71c2\u71c3\u71c4\u71c5\u71c6\u71c7\u71c8\u71c9\u71ca\u71cb\u71cc\u71cd\u71ce\u71cf\u71d0\u71d1\u71d2\u71d3\u71d4\u71d5\u71d6\u71d7\u71d8\u71d9\u71da\u71db\u71dc\u71dd\u71de\u3df3\u3df4\u3df5\u3df6\u3df7\u3df8\u3df9\u3dfa\u3dfb\u3dfc\u3dfd\u71df\u71e0\u71e1\u71e2\u71e3\u71e4\u71e5\u71e6\u71e7\u71e8\u71e9\u71ea\u71eb\u71ec\u71ed\u71ee\u71ef\u71f0\u71f1\u71f2\u71f3\u71f4\u71f5\u71f6\u71f7\u9fea\u3dfe\u3dff\u3e00\u3e01\u3e02\u3e03\u71f8\u71f9\u71fa\u71fb\u71fc\u71fd\u71fe\u71ff\u7200\u7201\u7202\u7203\u3e04\u3e05\u7204\u7205\u7206\u7207\u7208\u7209\u720a\u720c\u720d\u720e\u7215\u3e06\u3e07\u3e09\u720b\u720f\u7210\u7211\u7212\u7213\u7214\u7216\u7217\u7218\u3e08\u3e0a\u3e0b\u3e0c\u7219\u721a\u721b\u3e0d\u721c\u721d\u721e\u721f\u7220\u3e0e\u7221\u7222\u3e0f\u3e10\u7223\u7224\u7225\u7226\u3e11\u7227\u7228\u7229\u722a\u722b\u722c\u722d\u3e12\u3e13\u722e\u722f\u7230\u7231\u3e14\u7232\u7233\u3e15\u5655\u7234\u7235\u7236\u7237\u7238\u3e16\u7239\u3e17\u3e18\u723a\u3e19\u723b\u3e1a\u723c\u723d\u723e\u4e2c\u723f\u7240\u7241\u3e1b\u7242\u3e1c\u7243\u7244\u7245\u7246\u7247\u7248\u3e1d\u3e1e\u7249\u724a\u3e1f\u3e20\u3e21\u724b\u724c\u724d\u724e\u724f\u7250\u7251\u7252\u7253\u7254\u3e22\u7255\u7256\u7257\u3e23\u3e24\u7258\u3e25\u7259\u3e26\u3e27\u725a\u725b\u725c\u725d\u725e\u725f\u3e28\u7260\u7261\u7262\u7263\u7264\u3e29\u3e2a\u7265\u7266\u7267\u7268\u7269\u726a\u726b\u726c\u3e2b\u3e2c\u3e2d\u3e2e\u3e2f\u726d\u726e\u726f\u7270\u7271\u7272\u7273\u7274\u7275\u3e30\u3e31\u3e32\u3e33\u3e34\u7276\u7277\u7278\u7279\u727a\u3e35\u3e36\u3e37\u3e38\u727b\u727c\u727d\u727e\u727f\u7281\u3e39\u3e3a\u3e3b\u3e3c\u3e3d\u3e3e\u3e3f\u3e40\u7280\u7282\u7283\u7284\u7285\u7286\u7287\u7288\u7289\u728a\u728b\u3e41\u3e42\u3e43\u728c\u728d\u728e\u728f\u7290\u7291\u3e45\u3e46\u3e47\u3e48\u7292\u7293\u7294\u7295\u7296\u7297\u3e44\u3e49\u3e4a\u3e4b\u7298\u7299\u729a\u729b\u3e4c\u3e4d\u3e4e\u3e4f\u3e50\u729c\u729d\u729e\u729f\u3e51\u3e52\u3e53\u72a0\u3e54\u3e55\u3e56\u3e57\u3e58\u72a1\u72a2\u72a3\u72a4\u72a5\u72a6\u3e59\u72a7\u72a8\u3e5a\u72a9\u3e5b\u72aa\u72ab\u72ac\u72ad\u72ae\u72af\u72b0\u72b1\u72b2\u72b3\u72b4\u72b5\u72b6\u72b7\u72b8\u72b9\u72ba\u72bb\u72bc\u72bd\u72be\u72bf\u72c0\u72c1\u72c2\u72c3\u72c4\u72c5\u72c6\u72c7\u72c8\u3e5c\u3e5d\u3e5e\u3e5f\u3e60\u72c9\u72ca\u72cb\u72cc\u72cd\u72ce\u72cf\u72d0\u72d1\u72d2\u72d3\u72d4\u72d5\u72d6\u72d7\u72d8\u72d9\u72da\u72db\u72dc\u72dd\u72de\u3e61\u3e62\u3e63\u3e64\u3e65\u3e66\u3e67\u3e68\u3e69\u3e6a\u72df\u72e0\u72e1\u72e2\u72e3\u72e4\u72e5\u72e6\u72e7\u72e8\u72e9\u72ea\u72eb\u72ec\u72ed\u72ee\u72ef\u72f0\u72f1\u72f2\u3e6b\u3e6c\u3e6d\u3e6e\u3e6f\u3e70\u72f3\u72f4\u72f5\u72f6\u72f7\u72f8\u72f9\u72fa\u72fb\u72fc\u72fd\u72fe\u72ff\u7300\u7301\u7302\u7303\u3e71\u3e72\u3e73\u3e74\u3e75\u3e76\u3e77\u3e78\u7304\u7305\u7306\u7307\u7308\u7309\u730a\u730b\u730c\u730d\u730e\u730f\u7310\u7311\u7312\u7313\u7314\u7315\u7316\u7317\u7318\u7319\u731a\u731b\u731c\u731d\u731e\u731f\u7320\u7321\u732a\u732b\u3e79\u3e7a\u3e7b\u3e7c\u3e7d\u3e7e\u3e7f\u3e80\u7322\u7323\u7324\u7325\u7326\u7327\u7328\u7329\u732c\u732d\u732e\u732f\u7330\u7331\u7332\u7333\u7334\u7335\u7336\u7337\u7338\u7339\u7341\u3e81\u3e82\u3e83\u3e84\u3e85\u3e86\u733a\u733b\u733c\u733d\u733e\u733f\u7340\u7342\u7343\u7345\u7346\u7347\u7348\u7349\u734a\u3e87\u3e88\u3e89\u3e8a\u3e8b\u3e8c\u3e8d\u7344\u734c\u734d\u734e\u734f\u7350\u7351\u7352\u7353\u7354\u7355\u3e8e\u3e8f\u3e90\u3e91\u3e92\u3e93\u734b\u7356\u7357\u7358\u7359\u735a\u735b\u735c\u735d\u735e\u735f\u7360\u7361\u7362\u7363\u7364\u3e94\u3e95\u3e96\u3e97\u3e98\u3e99\u7365\u7366\u7367\u7368\u7369\u736a\u736b\u736c\u736d\u3e9a\u3e9b\u3e9c\u736e\u736f\u7370\u7371\u7372\u7373\u7374\u3e9d\u3e9e\u3e9f\u7375\u7376\u7377\u7378\u3ea0\u7379\u737a\u737b\u3ea1\u3ea2\u737c\u737d\u3ea3\u3ea4\u3ea5\u3ea6\u737e\u737f\u7380\u7381\u7382\u7383\u3ea7\u7384\u7385\u7386\u7387\u7388\u7389\u738b\u738a\u738c\u738d\u738e\u738f\u7390\u7391\u3ea8\u3ea9\u3eaa\u3eab\u7392\u7393\u7394\u7395\u7396\u7397\u7398\u7399\u739a\u739b\u3eac\u3ead\u3eae\u3eaf\u739c\u739d\u739e\u739f\u73a0\u73a1\u73a2\u73a3\u73a4\u73a5\u73a6\u73a7\u73a8\u73a9\u73aa\u73ab\u73ac\u73ad\u73ae\u73af\u73b0\u73b1\u9ff1\u3eb0\u3eb1\u3eb2\u3eb3\u3eb4\u3eb5\u3eb6\u73b2\u73b3\u73b4\u73b5\u73b6\u73b7\u73b8\u73b9\u73ba\u73bb\u73bc\u73bd\u73be\u73bf\u73c0\u73c1\u73c2\u73c3\u73c4\u73c5\u73c6\u73c7\u73c8\u73c9\u73ca\u73cb\u73cc\u73cd\u73ce\u73cf\u73d0\u73d1\u3eb7\u3eb8\u3eb9\u3eba\u3ebb\u3ebc\u3ebd\u3ebe\u73d2\u73d3\u73d4\u73d5\u73d6\u73d7\u73d8\u73d9\u73da\u73db\u73dc\u73dd\u73de\u73df\u73e0\u73e1\u73e2\u73e3\u73e4\u73e5\u73e6\u73e7\u73e8\u73e9\u73ea\u73eb\u73ec\u73ed\u73ee\u73ef\u73f0\u73f1\u73f2\u7409\u3ebf\u3ec0\u3ec1\u3ec2\u3ec3\u3ec4\u3ec5\u3ec6\u3ec7\u3ec8\u73f3\u73f4\u73f5\u73f6\u73f8\u73f9\u73fa\u73fb\u73fc\u73fd\u73fe\u73ff\u7400\u7401\u7402\u7403\u7404\u7405\u7406\u7407\u7408\u740a\u740b\u740c\u740d\u740e\u740f\u7410\u7411\u7412\u7413\u3ec9\u3eca\u3ecb\u3ecc\u3ecd\u3ece\u3ecf\u3ed0\u73f7\u7414\u7415\u7416\u7417\u7418\u7419\u741a\u741b\u741c\u741d\u741f\u7420\u7421\u7422\u7423\u7424\u7425\u7426\u7427\u7428\u7429\u742a\u742b\u742c\u742d\u742e\u742f\u7430\u7431\u7432\u7433\u7434\u7435\u7436\u7437\u7438\u7439\u743a\u743b\u743c\u3ed1\u3ed2\u3ed3\u3ed4\u3ed5\u3ed6\u3ed7\u3ed8\u3ed9\u3eda\u3edb\u3edc\u741e\u743d\u743e\u743f\u7440\u7441\u7442\u7443\u7444\u7445\u7446\u7447\u7448\u7449\u744a\u744b\u744c\u744d\u744e\u744f\u7450\u7451\u7452\u7453\u7454\u7455\u7456\u7457\u7458\u7459\u745a\u745b\u745c\u745d\u745e\u745f\u3edd\u3ede\u3edf\u3ee0\u3ee1\u3ee2\u3ee3\u3ee4\u3ee5\u3ee6\u7460\u7461\u7462\u7463\u7464\u7465\u7466\u7467\u7468\u7469\u746a\u746b\u746c\u746d\u746e\u746f\u7470\u7471\u7472\u7473\u7474\u7475\u7476\u7477\u7478\u3ee7\u3ee8\u3ee9\u3eea\u7479\u747a\u747b\u747c\u747d\u747e\u747f\u7480\u7481\u7482\u7483\u7484\u7485\u7486\u7487\u7488\u7489\u748a\u748b\u748c\u748e\u7493\u3eeb\u3eec\u3eed\u3eee\u3eef\u3ef0\u3ef1\u3ef2\u3ef3\u3ef4\u748d\u748f\u7490\u7491\u7492\u7494\u7495\u7496\u7497\u7498\u7499\u749a\u749b\u749c\u749d\u749e\u749f\u74a0\u74a1\u74a3\u74a4\u3ef5\u3ef6\u3ef7\u3ef8\u3ef9\u3efa\u3efb\u3efc\u74a2\u74a5\u74a6\u74a7\u74a8\u74a9\u74aa\u74ab\u74ac\u74ad\u74ae\u74af\u74b0\u74b1\u74b2\u74b3\u74b4\u3efd\u3efe\u3eff\u3f00\u3f01\u3f02\u74b5\u74b6\u74b7\u74b8\u74b9\u74ba\u74bb\u74bc\u74bd\u74be\u74bf\u74c0\u74c1\u74c2\u74c3\u74c4\u74c5\u74c6\u74c7\u74c8\u74c9\u74ca\u74cb\u3f03\u3f04\u3f05\u3f06\u74cc\u74cd\u74ce\u74cf\u74d0\u74d1\u74d2\u3f07\u74d3\u74d4\u74d5\u74d6\u74d7\u74d8\u74d9\u74da\u3f08\u74db\u74dc\u74dd\u3f09\u3f0a\u74de\u74df\u3f0b\u3f0c\u74e0\u3f0d\u3f0e\u3f0f\u74e1\u3f10\u3f11\u3f12\u3f13\u3f14\u74e2\u3f15\u74e3\u74e4\u74e5\u3f16\u74e6\u74e7\u3f17\u74e8\u74e9\u3f18\u3f19\u74ea\u74eb\u74ec\u74ed\u74ee\u74ef\u74f0\u74f1\u74f2\u3f1a\u3f1b\u74f3\u74f4\u74f5\u3f1c\u3f1d\u3f1e\u3f1f\u3f20\u74f6\u74f7\u74f8\u3f21\u3f22\u3f23\u3f24\u3f25\u3f26\u74f9\u74fa\u74fb\u74fc\u3f27\u3f28\u3f29\u3f2a\u74fd\u74fe\u74ff\u7500\u7501\u3f2b\u3f2c\u3f2d\u3f2e\u3f2f\u3f30\u3f31\u7502\u7503\u7504\u7505\u7506\u3f32\u3f33\u3f34\u3f35\u3f36\u3f37\u7507\u7508\u7509\u3f38\u3f39\u3f3a\u750a\u750b\u750c\u750d\u750e\u3f3b\u3f3c\u3f3d\u3f3e\u750f\u7510\u7511\u7512\u3f3f\u3f40\u3f41\u3f42\u3f43\u3f44\u3f45\u7513\u7514\u7515\u3f46\u3f47\u7516\u3f48\u3f49\u7517\u3f4a\u3f4b\u3f4c\u7518\u7519\u751a\u3f4d\u751b\u751c\u751d\u751e\u3f4e\u3f4f\u3f50\u3f51\u751f\u7520\u7521\u7522\u7523\u7524\u7525\u7526\u3f52\u7527\u3f53\u3f54\u7528\u7529\u752a\u752b\u752c\u752d\u752e\u752f\u7530\u7531\u7532\u7533\u7534\u7535\u7536\u7537\u7538\u7539\u753a\u753c\u3f55\u3f56\u3f57\u753b\u753d\u753e\u753f\u7540\u7541\u7542\u7543\u7544\u7545\u7546\u7547\u7548\u7549\u754a\u754b\u754c\u754d\u754e\u754f\u7550\u7551\u7552\u7553\u3f58\u3f59\u3f5a\u7554\u7555\u7556\u7557\u7558\u7559\u755a\u755b\u755c\u755d\u755e\u755f\u3f5b\u3f5c\u7561\u7562\u7563\u7564\u7565\u7566\u7567\u7569\u7570\u3f5d\u3f5e\u756a\u756b\u756c\u756d\u756e\u756f\u7572\u7573\u7574\u3f5f\u3f60\u7575\u7576\u7577\u7578\u7579\u757a\u3f61\u3f62\u3f63\u3f64\u7571\u757b\u757c\u757d\u3f65\u757e\u757f\u3f66\u3f67\u3f68\u7580\u7581\u7582\u3f69\u7583\u7584\u3f6a\u7585\u3f6b\u3f6c\u7586\u7587\u3f6d\u7588\u3f6e\u7589\u758a\u3f6f\u758b\u758c\u758d\u758e\u758f\u3f70\u7590\u7591\u7592\u7593\u7594\u7595\u7596\u7597\u3f71\u3f72\u7598\u7599\u759a\u759b\u759c\u759d\u759e\u759f\u75a0\u3f73\u3f74\u3f75\u3f76\u75a1\u75a2\u75a3\u75a4\u75a5\u75a6\u75a7\u75a8\u75a9\u75aa\u75ab\u75ac\u75ad\u75ae\u75af\u75ba\u3f77\u3f78\u3f79\u3f7a\u3f7b\u3f7c\u75b0\u75b1\u75b2\u75b3\u75b4\u75b5\u75b6\u75b7\u75b8\u75b9\u75bb\u75bc\u75bd\u75be\u75bf\u75c0\u75c1\u75c2\u75c3\u75c4\u75c5\u75c6\u75c7\u75c8\u75c9\u3f7d\u3f7e\u3f7f\u3f80\u3f81\u3f82\u3f83\u3f84\u3f85\u3f86\u3f87\u3f88\u3f89\u75ca\u75cb\u75cc\u75cd\u75ce\u75cf\u75d0\u75d1\u75d2\u75d3\u75d4\u75d5\u75d6\u3f8a\u3f8b\u3f8c\u3f8d\u3f8e\u3f8f\u3f90\u3f91\u3f92\u75d7\u75d8\u75d9\u75da\u75db\u75dc\u75dd\u75de\u75df\u75e0\u75e1\u75e2\u75e3\u75e4\u75e5\u75e6\u75e7\u75e8\u75e9\u75ea\u75eb\u3f93\u3f94\u3f95\u3f96\u3f97\u3f98\u3f99\u3f9a\u3f9b\u3f9c\u3f9d\u3f9e\u3f9f\u3fa0\u3fa1\u75ec\u75ed\u75ee\u75ef\u75f0\u75f1\u75f2\u75f3\u75f4\u75f5\u75f6\u75f7\u75f8\u75f9\u75fa\u75fb\u75fc\u75fd\u75fe\u75ff\u7600\u7601\u7602\u7603\u7604\u7605\u7606\u3fa2\u3fa3\u3fa4\u3fa5\u3fa6\u3fa7\u3fa8\u3fa9\u7607\u7608\u7609\u760a\u760b\u760c\u760d\u760e\u760f\u7610\u7611\u7612\u7613\u7614\u7615\u7616\u7617\u7618\u761f\u7627\u3faa\u3fab\u3fac\u3fad\u3fae\u3faf\u3fb0\u3fb1\u3fb2\u3fb3\u3fb4\u3fb5\u7619\u761a\u761b\u761c\u761d\u761e\u7620\u7621\u7622\u7623\u7624\u7625\u7626\u7628\u7629\u762a\u762b\u3fb6\u3fb7\u3fb8\u3fb9\u3fba\u3fbb\u3fbc\u3fbd\u3fbe\u3fbf\u3fc0\u3fc1\u762c\u762d\u762e\u762f\u7630\u7631\u7632\u7633\u7634\u7635\u7636\u7637\u7638\u7639\u763a\u763b\u763c\u763d\u763e\u763f\u764a\u3fc2\u3fc3\u3fc4\u3fc5\u3fc6\u3fc7\u3fc8\u7640\u7641\u7642\u7643\u7644\u7645\u7646\u7647\u7648\u7649\u764b\u764c\u764d\u764e\u3fc9\u3fca\u764f\u7650\u7651\u7652\u7653\u7654\u7655\u7656\u7657\u7658\u7659\u765a\u765b\u765c\u765d\u765e\u3fcb\u3fcc\u3fcd\u3fce\u3fcf\u3fd0\u765f\u7660\u7661\u7663\u3fd1\u3fd2\u3fd3\u7662\u7664\u7665\u7666\u3fd4\u7667\u7668\u7669\u766a\u766b\u3fd5\u3fd6\u3fd7\u766c\u766d\u766e\u3fd8\u766f\u7670\u3fd9\u7671\u7672\u3fda\u3fdb\u7673\u7674\u3fdc\u7675\u7676\u7677\u7678\u7679\u767a\u767b\u767c\u767d\u767e\u767f\u7680\u7681\u7682\u7683\u3fdd\u7684\u7685\u7686\u7687\u7688\u3fde\u7560\u7689\u768a\u768b\u768c\u768d\u3fdf\u768e\u768f\u7690\u7691\u3fe0\u3fe1\u7692\u7693\u7694\u7695\u7696\u7697\u7698\u7699\u3fe2\u3fe3\u3fe4\u769a\u769b\u769c\u769d\u769e\u3fe5\u769f\u76a0\u76a1\u3fe6\u76a2\u76a3\u76a4\u76a5\u76a6\u76a7\u76a8\u76a9\u3fe7\u76aa\u76ab\u76ac\u3fe8\u76ad\u3fe9\u76ae\u76af\u3fea\u3feb\u3fec\u76b0\u76b1\u3fed\u3fee\u76b2\u3fef\u3ff0\u76b3\u76b4\u3ff1\u76b5\u9fbe\u3ff2\u3ff3\u76b6\u76b7\u76b8\u76b9\u3ff4\u3ff5\u76ba\u3ff6\u3ff7\u76bb\u3ff8\u76bc\u76bd\u3ff9\u76be\u3ffa\u76bf\u76c0\u76c1\u76c2\u3ffb\u76c3\u76c4\u76c5\u76c6\u76c7\u76c8\u3ffc\u3ffd\u76c9\u76ca\u76cb\u76cc\u76cd\u76ce\u76cf\u76d0\u76d1\u3ffe\u3fff\u4000\u76d2\u76d3\u76d4\u76d5\u76d6\u76d7\u76d8\u76db\u4001\u4002\u76d9\u76da\u76dc\u4003\u76dd\u76de\u76df\u4004\u4005\u76e0\u76e1\u76e2\u76e3\u4006\u76e4\u76e5\u76e6\u76e7\u4007\u4008\u76e8\u76e9\u76ea\u4009\u76eb\u76ec\u400a\u76ed\u400b\u400c\u400d\u76ee\u76ef\u400e\u400f\u76f0\u76f1\u76f2\u76f3\u76f4\u76f5\u4010\u4011\u4012\u4013\u4014\u76f6\u76f7\u76f8\u76f9\u76fa\u76fb\u76fc\u76fd\u76fe\u76ff\u7700\u7701\u7702\u7703\u7704\u7705\u7706\u7707\u7708\u7709\u770a\u770b\u770c\u770d\u4015\u4016\u4017\u4018\u4019\u401a\u401b\u401c\u401d\u401e\u770e\u770f\u7710\u7711\u7712\u7713\u7714\u7715\u7716\u7717\u7718\u7719\u771a\u771b\u771c\u771d\u771e\u771f\u7720\u7721\u7722\u7723\u7724\u7725\u7726\u7727\u7728\u7729\u772a\u772b\u772c\u773f\u401f\u4020\u4021\u4022\u4023\u4024\u4025\u4026\u772d\u772e\u772f\u7730\u7731\u7732\u7733\u7734\u7735\u7736\u7737\u7738\u7739\u773a\u773b\u773c\u773d\u773e\u7741\u4027\u4028\u4029\u402a\u402b\u402c\u402d\u402e\u7740\u7742\u7743\u7744\u7745\u7746\u7747\u7748\u7749\u774a\u774b\u774c\u774d\u774e\u774f\u7750\u7751\u9fc3\u402f\u4030\u4031\u4032\u4033\u4034\u4035\u4036\u4037\u4038\u4039\u403a\u403b\u403c\u403d\u403e\u403f\u4040\u7752\u7753\u7754\u7755\u7756\u7757\u7758\u7759\u775a\u775b\u775c\u775d\u775e\u775f\u7760\u7762\u7763\u7764\u7765\u7766\u7767\u7768\u7769\u776a\u776b\u776c\u776d\u4041\u4042\u4043\u4044\u4045\u4046\u4047\u4048\u4049\u7761\u776e\u776f\u7770\u7771\u7772\u7773\u7774\u7775\u7776\u7777\u7778\u7779\u777a\u777b\u777c\u777d\u777e\u777f\u7780\u7781\u7782\u7783\u7784\u7785\u7786\u404a\u404b\u404c\u404d\u404e\u404f\u4050\u4051\u4052\u4053\u4054\u4055\u4056\u7787\u7788\u7789\u778a\u778b\u778c\u778d\u778e\u778f\u7790\u7791\u7792\u7793\u4057\u4058\u4059\u405a\u405b\u405c\u405d\u405e\u405f\u4060\u4061\u7794\u7795\u7796\u7797\u7798\u7799\u779a\u779b\u779c\u779d\u779e\u779f\u77a0\u77a1\u77a2\u77a3\u4062\u4063\u4064\u4065\u4066\u4067\u4068\u4069\u406a\u77a4\u77a5\u77a6\u77a7\u77a8\u77a9\u77aa\u77ab\u77ac\u77ad\u77ae\u77af\u77b0\u77b1\u77b2\u77b3\u77b4\u77b5\u77b6\u77b7\u406b\u406c\u406d\u406e\u406f\u4070\u4071\u4072\u4073\u77b8\u77b9\u77ba\u77bb\u77bc\u77bd\u77be\u77bf\u77c0\u77c1\u77c2\u4074\u4075\u4076\u4077\u4078\u4079\u407a\u77c3\u77c4\u77c5\u77c6\u77c7\u77c8\u77c9\u77ca\u77cb\u77cc\u77cd\u77ce\u77cf\u407b\u407c\u407d\u407e\u77d0\u77d1\u77d2\u77d3\u407f\u4080\u4081\u77d4\u4082\u4083\u77d5\u77d7\u77d8\u77d9\u4084\u77d6\u77da\u4085\u77db\u4086\u77dc\u4087\u77dd\u4088\u77de\u77df\u77e0\u4089\u408a\u408b\u408c\u408d\u408e\u77e1\u77e2\u77e3\u77e4\u77e5\u77e6\u77e7\u77e8\u77e9\u408f\u4090\u77ea\u77eb\u4091\u4092\u77ec\u77ed\u4093\u77ee\u4094\u4095\u77ef\u77f0\u77f1\u77f2\u77f3\u4096\u77f4\u77f5\u77f6\u4097\u77f7\u77f8\u77f9\u77fa\u77fb\u77fc\u77fd\u77fe\u77ff\u7800\u7801\u4098\u4099\u6cf5\u7802\u7803\u7804\u7805\u7806\u7807\u7808\u7809\u780a\u780b\u780c\u780d\u780e\u780f\u7810\u7811\u7812\u7813\u7814\u7815\u7816\u7817\u7818\u7819\u781a\u781b\u781c\u409a\u409b\u409c\u409d\u409e\u781d\u781e\u781f\u7820\u7821\u7822\u7823\u7824\u7825\u7826\u7827\u7828\u7829\u782a\u782b\u782c\u782d\u782e\u782f\u7830\u7831\u7832\u7833\u7834\u7835\u7836\u7837\u7838\u7839\u783a\u783b\u783c\u783d\u783e\u783f\u7840\u7841\u9fec\u409f\u40a0\u40a1\u40a2\u40a3\u40a4\u40a5\u40a6\u40a7\u40a8\u7842\u7843\u7844\u7845\u7846\u7847\u7848\u7849\u784a\u784b\u784c\u784d\u784e\u784f\u7850\u7851\u7852\u7853\u7854\u7855\u7856\u7857\u7858\u7859\u785a\u785b\u9fce\u40a9\u40aa\u40ab\u40ac\u40ad\u40ae\u40af\u785c\u785d\u785e\u785f\u7860\u7861\u7862\u7863\u7864\u7865\u7866\u7867\u7868\u7869\u786a\u786b\u786c\u786d\u786e\u786f\u7870\u7871\u7872\u7873\u7874\u7875\u7876\u7877\u40b0\u40b1\u40b2\u40b3\u40b4\u40b5\u40b6\u7878\u7879\u787a\u787b\u787c\u787d\u787f\u7880\u7881\u7882\u7883\u7884\u7885\u7886\u7887\u7888\u7889\u788a\u788b\u788c\u788d\u788e\u788f\u7890\u7891\u7892\u7893\u7894\u7895\u7896\u7897\u7898\u7899\u789a\u789b\u789c\u78b0\u40b7\u40b8\u40b9\u40ba\u40bb\u40bc\u40bd\u40be\u40bf\u40c0\u40c1\u40c2\u40c3\u40c4\u40c5\u40c6\u40c7\u787e\u789d\u789e\u789f\u78a0\u78a1\u78a2\u78a3\u78a4\u78a5\u78a6\u78a7\u78a8\u78a9\u78aa\u78ab\u78ac\u78ad\u78ae\u78af\u78b1\u78b2\u78b3\u78b4\u78b5\u78b6\u78b7\u78b8\u78b9\u78c1\u40c8\u40c9\u40ca\u40cb\u40cc\u40cd\u40ce\u40cf\u40d0\u78ba\u78bb\u78bc\u78bd\u78be\u78bf\u78c0\u78c2\u78c3\u78c4\u78c5\u78c6\u78c7\u78c8\u78c9\u78ca\u78cb\u78cc\u78cd\u78ce\u78cf\u78d0\u78d1\u78d2\u78d3\u78d4\u78d5\u78d6\u78d7\u78d8\u78d9\u78dc\u78e4\u40d1\u40d2\u40d3\u40d4\u40d5\u40d6\u40d7\u78da\u78db\u78dd\u78de\u78df\u78e0\u78e1\u78e2\u78e3\u78e5\u78e6\u78e7\u78e8\u78e9\u78ea\u78eb\u78ec\u78ed\u78ee\u40d8\u40d9\u40da\u40db\u40dc\u40dd\u40de\u40e0\u78ef\u78f0\u78f1\u78f2\u78f3\u78f4\u78f5\u78f6\u78f7\u78f8\u78f9\u78fa\u78fb\u78fc\u78fd\u78fe\u78ff\u7900\u7901\u7902\u7903\u7904\u7905\u40df\u40e1\u40e2\u40e3\u40e4\u40e5\u40e6\u40e7\u40e8\u7906\u7907\u7908\u7909\u790a\u790b\u790c\u790d\u790e\u790f\u7910\u7911\u7912\u7913\u7914\u7915\u7916\u40e9\u40ea\u40eb\u40ec\u40ed\u40ee\u40ef\u7917\u7918\u7919\u791a\u791b\u791c\u791d\u791e\u791f\u7920\u7921\u40f0\u7922\u7923\u7924\u7925\u7926\u7927\u7928\u7929\u792a\u792b\u792c\u40f1\u40f2\u40f3\u792d\u792e\u792f\u7930\u7931\u7932\u7933\u7934\u40f4\u40f5\u40f6\u40f7\u7935\u40f8\u40f9\u7936\u7937\u7938\u40fa\u7939\u40fb\u793a\u793b\u793c\u793d\u40fc\u793e\u793f\u7940\u7941\u7942\u7943\u7944\u7945\u7946\u7947\u7948\u7949\u794a\u794b\u794c\u794d\u794e\u89c6\u9fc6\u40fd\u40fe\u40ff\u4100\u794f\u7950\u7951\u7952\u7953\u7954\u7955\u7956\u7957\u7958\u7959\u795a\u795b\u795c\u795d\u795e\u795f\u7960\u7961\u7962\u4101\u4102\u4103\u7963\u7964\u7965\u7967\u7968\u7969\u796a\u796b\u796c\u796d\u796e\u796f\u4104\u4105\u4106\u7966\u7970\u7971\u7972\u7973\u7974\u7975\u7976\u7977\u7978\u7984\u8996\u4107\u4108\u4109\u410a\u7979\u797a\u797b\u797c\u797d\u797e\u797f\u7980\u7981\u7982\u7983\u7985\u7986\u410b\u410c\u410d\u410e\u410f\u4110\u4111\u4112\u7987\u7988\u7989\u798a\u798b\u798c\u798d\u798e\u798f\u7990\u7991\u7992\u7993\u7994\u7995\u7996\u7997\u7998\u7999\u4113\u4114\u4115\u4116\u4117\u799a\u799b\u799c\u799d\u799e\u799f\u79a0\u79a1\u79a2\u79a3\u4118\u4119\u79a4\u79a5\u79a6\u411a\u411b\u411c\u411d\u411e\u79a7\u79a8\u79a9\u79aa\u79ab\u411f\u79ac\u79ad\u79ae\u79af\u9fc5\u4120\u4121\u79b0\u79b1\u4122\u79b2\u4123\u4124\u79b3\u79b4\u79b5\u79b6\u79b7\u4125\u79b8\u79b9\u79ba\u79bb\u79bc\u79bd\u842c\u79be\u79bf\u79c0\u79c1\u79c2\u79c3\u4126\u4127\u79c4\u79c5\u79c6\u79c7\u79c8\u79c9\u79ca\u4128\u4129\u412a\u412b\u412c\u412d\u79cb\u79cc\u79cd\u79ce\u79cf\u79d0\u79d1\u79d2\u79d3\u79d4\u79d5\u79d6\u79d7\u412e\u412f\u4130\u4131\u4132\u4133\u4134\u4135\u79d8\u79d9\u79da\u79db\u79dc\u79dd\u79de\u79df\u79e0\u79e1\u79e2\u79e3\u79e4\u79e5\u79e6\u79e7\u79e8\u79e9\u79ea\u79eb\u79ec\u79ed\u79ee\u79ef\u79f0\u4136\u4137\u4138\u4139\u79f1\u79f2\u79f3\u79f4\u79f5\u79f6\u79f7\u79f8\u79f9\u79fa\u79fb\u79fc\u79fd\u79fe\u7a06\u413a\u413b\u413c\u413d\u413e\u413f\u4140\u4141\u4142\u4143\u4144\u4145\u4146\u4147\u4148\u4149\u414a\u79ff\u7a00\u7a01\u7a02\u7a03\u7a04\u7a05\u7a07\u7a08\u7a09\u7a0a\u7a0b\u7a0c\u7a0d\u7a0e\u9fdf\u414b\u414c\u414d\u414e\u414f\u4150\u4151\u4152\u4153\u7a0f\u7a10\u7a11\u7a12\u7a13\u7a14\u7a15\u7a16\u7a17\u7a18\u7a19\u7a1a\u7a1b\u7a1c\u7a1d\u7a1e\u7a1f\u7a20\u7a21\u7a22\u7a23\u7a24\u7a25\u4154\u4155\u4156\u4157\u4158\u4159\u415a\u415b\u415c\u415d\u415e\u415f\u7a26\u7a27\u7a28\u7a29\u7a2a\u7a2b\u7a2c\u7a2d\u7a2e\u7a2f\u7a30\u7a31\u7a32\u7a33\u7a4a\u4160\u4161\u4162\u4163\u4164\u4165\u4166\u4167\u4168\u4169\u416a\u416b\u7a34\u7a35\u7a36\u7a37\u7a38\u7a39\u7a3a\u7a3b\u7a3c\u7a3d\u7a3e\u7a3f\u7a40\u7a41\u7a42\u7a43\u416c\u416d\u416e\u416f\u4170\u4171\u4172\u4173\u4174\u4175\u4176\u7a44\u7a45\u7a46\u7a47\u7a48\u7a4b\u7a4c\u7a4d\u7a4e\u7a4f\u7a50\u7a51\u7a52\u4177\u4178\u4179\u417a\u417b\u417c\u417d\u7a49\u7a53\u7a54\u7a55\u7a56\u7a57\u7a58\u7a59\u7a5a\u7a5b\u7a5c\u7a5d\u7a5e\u417e\u417f\u4180\u7a5f\u7a60\u7a61\u7a62\u7a63\u4181\u4182\u4183\u4184\u4185\u4186\u4187\u7a64\u7a65\u7a66\u7a67\u7a68\u7a69\u7a6a\u7a6b\u7a6c\u7a6d\u7a6e\u7a6f\u4188\u4189\u9fe0\u418a\u418b\u418c\u418d\u7a70\u7a73\u418e\u418f\u7a71\u7a72\u4190\u7a74\u7a75\u7a76\u7a77\u4191\u7a78\u7a79\u7a7a\u7a7b\u4192\u7a7c\u7a7d\u7a7e\u7a7f\u7a80\u7a81\u7a82\u7a83\u4193\u4194\u4195\u4196\u7a84\u7a85\u7a86\u7a87\u7a88\u7a89\u7a8a\u7a8b\u7a8c\u7a8d\u7a8e\u4197\u4198\u4199\u7a8f\u7a90\u7a91\u7a92\u7a93\u7a94\u7a95\u419a\u419b\u419c\u419d\u419e\u419f\u41a0\u7a96\u7a97\u7a98\u7a99\u7a9a\u7a9b\u7a9c\u7a9d\u41a1\u41a2\u41a3\u41a4\u41a5\u7a9e\u7a9f\u7aa0\u7aa1\u7aa2\u7aa3\u7aa4\u7aa5\u7aa6\u7aa7\u41a6\u41a7\u41a8\u41a9\u7aa8\u7aa9\u7aaa\u7aab\u7aac\u7aad\u41aa\u41ab\u7aae\u7aaf\u7ab0\u7ab1\u7ab2\u7ab3\u7ab4\u41ac\u41ad\u41ae\u7ab5\u7ab6\u7ab7\u7ab8\u7ab9\u7aba\u7abb\u7abc\u7abd\u41af\u41b0\u41b1\u41b2\u41b3\u41b4\u7abe\u7abf\u7ac0\u7ac1\u7ac2\u7ac3\u41b5\u41b6\u41b7\u41b8\u41b9\u41ba\u41bb\u7ac4\u7ac5\u41bc\u41bd\u7ac6\u41be\u41bf\u7ac7\u41c0\u7ac8\u7ac9\u7aca\u41c1\u7acb\u41c2\u7acc\u7acd\u7ace\u7acf\u41c3\u41c4\u7ad0\u7ad1\u7ad2\u7ad3\u7ad4\u7ad5\u7ad6\u7ad7\u41c5\u41c6\u7ad8\u7ad9\u7ada\u7adb\u7adc\u7add\u7ade\u41c7\u41c8\u41c9\u41ca\u7ae1\u41cb\u7ae2\u7ae3\u7ae4\u7ae5\u7ae6\u7ae7\u41cc\u41cd\u7ae8\u7ae9\u7aea\u7aeb\u41ce\u41cf\u41d0\u41d1\u7aec\u7aed\u7aef\u7af0\u7aee\u7af1\u41d2\u7af2\u7af3\u7af4\u41d3\u7af5\u41d4\u41d5\u7af6\u7af7\u7af8\u7af9\u7afa\u7afb\u7afc\u7afd\u7afe\u7aff\u7b00\u7b01\u7b02\u7b03\u41d6\u7b05\u7b06\u7b07\u7b08\u7b09\u7b0a\u7b0b\u7b0c\u7b0d\u7b0e\u7b0f\u7b10\u7b11\u7b12\u7b13\u7b14\u7b15\u41d7\u41d8\u41d9\u41da\u41db\u41dc\u41dd\u7b16\u7b17\u7b18\u7b19\u7b1a\u7b1b\u7b1c\u7b1d\u7b1e\u7b1f\u7b20\u7b21\u7b22\u7b23\u7b24\u7b25\u7b26\u7b27\u7b28\u7b29\u7b2a\u7b2b\u7b2c\u7b2d\u7b2e\u7b2f\u7b30\u7b31\u7b32\u7b33\u7b34\u7b35\u7b36\u7b37\u7b38\u7b39\u7b3a\u7b3b\u7b3c\u7b3d\u7b3e\u41de\u41df\u41e0\u41e1\u41e2\u41e3\u41e4\u41e5\u41e6\u7b04\u7b3f\u7b40\u7b41\u7b42\u7b43\u7b44\u7b45\u7b46\u7b47\u7b48\u7b49\u7b4a\u7b4b\u7b4c\u7b4d\u7b4e\u7b4f\u7b50\u7b51\u7b52\u7b53\u7b54\u7b55\u7b56\u7b57\u7b58\u7b59\u7b5a\u7b5b\u7b5c\u7b5d\u41e7\u41e8\u41e9\u41ea\u41eb\u41ec\u41ed\u41ee\u41ef\u41f0\u41f1\u41f2\u41f3\u41f4\u7b5e\u7b5f\u7b60\u7b61\u7b62\u7b63\u7b64\u7b65\u7b66\u7b67\u7b68\u7b69\u7b6a\u7b6b\u7b6c\u7b6d\u7b6e\u7b6f\u7b70\u7b71\u7b72\u7b73\u7b74\u7b75\u7b76\u7b77\u7b78\u7b79\u7b7a\u7b7b\u7b7c\u7b7d\u7b7e\u7b7f\u7b80\u7bc0\u41f5\u41f6\u41f7\u41f8\u41f9\u41fa\u41fb\u41fc\u41fd\u41fe\u41ff\u4200\u7b81\u7b82\u7b83\u7b84\u7b85\u7b86\u7b87\u7b88\u7b89\u7b8a\u7b8b\u7b8c\u7b8d\u7b8e\u7b8f\u7b90\u7b91\u7b92\u7b93\u7b94\u7b95\u7b96\u7b97\u7b98\u7b99\u7b9a\u7b9b\u7b9c\u7b9d\u7b9e\u7b9f\u7ba0\u7ba1\u7ba2\u7ba3\u7ba4\u7ba5\u7ba6\u7ba7\u7ba8\u7ba9\u7baa\u7bab\u4201\u4202\u4203\u4204\u4205\u4206\u4207\u4208\u4209\u420a\u420b\u420c\u420d\u7bac\u7bad\u7bae\u7baf\u7bb0\u7bb1\u7bb2\u7bb3\u7bb4\u7bb5\u7bb6\u7bb7\u7bb8\u7bb9\u7bba\u7bbb\u7bbc\u7bbd\u7bbe\u7bbf\u7bc1\u7bc2\u7bc3\u7bc4\u7bc5\u7bc6\u7bc7\u7bc8\u7bca\u7bcb\u7bcc\u7bcd\u7bce\u7bcf\u7bd0\u7bd1\u7bd2\u7bd3\u420e\u420f\u4210\u4211\u4212\u4213\u4214\u4215\u4216\u4217\u4218\u4219\u421a\u421b\u421c\u421d\u421e\u421f\u4220\u4221\u4222\u4223\u4224\u4225\u4226\u4227\u4228\u4229\u7bc9\u7bd4\u7bd5\u7bd6\u7bd7\u7bd8\u7bd9\u7bda\u7bdb\u7bdc\u7bdd\u7bde\u7bdf\u7be0\u7be1\u7be2\u7be3\u7be4\u7be5\u7be6\u7be7\u7be8\u7be9\u7bea\u7beb\u7bec\u7bed\u7bee\u7bef\u7c11\u7c15\u422a\u422b\u422c\u422d\u422e\u422f\u4230\u4231\u4232\u4233\u4234\u4235\u4236\u4237\u7bf0\u7bf1\u7bf2\u7bf3\u7bf4\u7bf5\u7bf6\u7bf7\u7bf8\u7bf9\u7bfa\u7bfb\u7bfc\u7bfd\u7bfe\u7bff\u7c00\u7c01\u7c02\u7c03\u7c04\u7c05\u7c06\u7c07\u7c08\u7c09\u7c0a\u7c0b\u7c0c\u7c0d\u7c0e\u7c0f\u7c10\u7c12\u7c13\u7c14\u7c16\u7c17\u4238\u4239\u423a\u423b\u423c\u423d\u423e\u423f\u4240\u4241\u4242\u4243\u4244\u4245\u4246\u4247\u7c18\u7c19\u7c1a\u7c1b\u7c1c\u7c1d\u7c1e\u7c1f\u7c20\u7c21\u7c22\u7c23\u7c24\u7c25\u7c26\u7c27\u7c28\u7c29\u7c2a\u7c2b\u7c2c\u7c2d\u7c2e\u7c2f\u7c30\u7c31\u7c32\u4248\u4249\u424a\u424b\u424c\u424d\u424e\u4250\u4251\u4252\u4253\u4254\u4255\u4256\u4257\u4258\u4259\u425a\u4263\u7c33\u7c34\u7c35\u7c36\u7c37\u7c38\u7c39\u7c3a\u7c3b\u7c3c\u7c3d\u7c3e\u7c3f\u7c40\u7c41\u7c42\u424f\u425b\u425c\u425d\u425e\u425f\u4260\u4261\u4262\u4264\u7c43\u7c44\u7c45\u7c46\u7c47\u7c48\u7c49\u7c4a\u7c4b\u7c4c\u7c4d\u7c4e\u7c4f\u7c55\u7c56\u4265\u7c50\u7c51\u7c52\u7c53\u7c54\u4266\u4267\u4268\u4269\u426a\u426b\u426c\u426d\u7c57\u7c58\u7c59\u7c5a\u7c5b\u7c5c\u7c5d\u7c5e\u7c5f\u7c60\u7c61\u426e\u426f\u4270\u4271\u7c62\u7c63\u7c64\u7c65\u7c66\u7c67\u7c68\u4272\u4273\u4274\u7c6a\u4276\u7c69\u7c6b\u7c6c\u7c6d\u7c6e\u7c6f\u7c70\u4277\u4278\u7c71\u4279\u7c72\u7c73\u7c74\u7c75\u7c76\u5a04\u7c77\u7c78\u7c79\u7c7a\u7c7b\u7c7c\u7c7d\u7c7e\u7c7f\u7c80\u7c81\u7c82\u427a\u7c83\u7c84\u7c85\u7c86\u7c87\u7c88\u7c89\u7c8a\u7c8b\u7c8c\u7c8d\u7c8e\u7c8f\u7c90\u7c91\u427b\u427c\u7568\u7c92\u7c93\u7c94\u7c95\u7c96\u7c97\u7c98\u7c99\u7c9a\u7c9b\u7c9c\u7c9d\u7ca3\u427d\u427e\u427f\u4280\u7c9e\u7c9f\u7ca0\u7ca1\u7ca2\u7ca4\u7ca5\u7ca6\u7ca7\u7ca8\u7ca9\u7caa\u7cab\u7cac\u7cad\u4281\u4282\u4283\u4284\u4285\u4286\u7cae\u7caf\u7cb0\u7cb1\u7cb2\u7cb3\u7cb4\u7cb5\u7cc0\u4287\u4288\u4289\u428a\u428b\u428c\u7cb6\u7cb7\u7cb8\u7cb9\u7cba\u7cbb\u7cbc\u7cbd\u7cbe\u7cbf\u7cc1\u428d\u428e\u428f\u4290\u4291\u4292\u7cc2\u7cc3\u7cc4\u7cc5\u7cc6\u7cc7\u7cc8\u7cc9\u7cca\u7ccb\u7ccc\u7ccd\u7cce\u4293\u4294\u4295\u4296\u4297\u4298\u4299\u7ccf\u7cd0\u7cd1\u7cd2\u7cd3\u7cd4\u7cd5\u7cd6\u7cd7\u7cd8\u9fef\u429a\u429b\u4a00\u7cd9\u7cda\u7cdb\u7cdc\u7cdd\u7cde\u7cdf\u7ce0\u7ce1\u7ce2\u7ce8\u429c\u429d\u429e\u429f\u42a0\u42a1\u42a2\u7ce3\u7ce4\u7ce5\u7ce6\u7ce7\u42a3\u42a4\u42a5\u42a6\u42a7\u42a8\u42a9\u7ce9\u7cea\u7ceb\u7cec\u7ced\u42aa\u42ab\u42ac\u7cee\u7cef\u7cf0\u42ad\u42ae\u7cf2\u42af\u7cf1\u7cf3\u7cf4\u42b0\u7cf5\u42b1\u42b2\u7cf6\u42b3\u42b4\u7cf7\u7cf8\u7cf9\u7cfa\u7cfb\u7cfc\u7cfd\u7cfe\u7cff\u42b5\u7d00\u7d01\u7d02\u7d03\u7d04\u7d05\u7d06\u7d07\u7d08\u7d09\u42b6\u42b7\u42b8\u42b9\u7d0a\u7d0b\u7d0c\u7d0d\u7d0e\u7d0f\u7d10\u7d11\u7d12\u7d13\u7d14\u7d15\u7d16\u7d17\u7d18\u7d19\u7d1a\u7d1b\u7d1c\u7d1d\u7d1e\u7d1f\u7d20\u7d21\u7d22\u7d23\u7d24\u7d25\u7d26\u7d27\u42ba\u42bb\u42bc\u42bd\u42be\u42bf\u42c0\u42c1\u42c2\u42c3\u42c4\u42c5\u42c6\u42c7\u7d28\u7d29\u7d2a\u7d2b\u7d2c\u7d2d\u7d2e\u7d2f\u7d30\u7d31\u7d32\u7d33\u7d34\u7d35\u7d36\u7d37\u7d38\u7d39\u7d3a\u7d3b\u7d3c\u7d3d\u7d3e\u7d3f\u7d40\u7d41\u7d42\u7d43\u7d44\u7d45\u7d46\u7d47\u7d48\u7d49\u7d4a\u7d4b\u7d4c\u42c8\u42c9\u42ca\u42cb\u42cc\u42cd\u42ce\u42cf\u42d0\u42d1\u42d2\u42d3\u42d4\u7d4d\u7d4e\u7d4f\u7d50\u7d51\u7d52\u7d53\u7d54\u7d55\u7d56\u7d57\u7d58\u7d59\u7d5a\u7d5c\u7d5d\u7d5e\u7d5f\u7d60\u7d61\u7d62\u7d63\u7d64\u7d65\u7d66\u7d67\u7d68\u7d69\u7d6a\u7d6b\u7d6c\u7d6d\u7d6e\u7d6f\u7d70\u7d71\u7d72\u7d73\u7d74\u7d75\u7d76\u7d77\u42d5\u42d6\u42d7\u42d8\u42d9\u42da\u42db\u42dc\u42dd\u42de\u7d5b\u7d78\u7d79\u7d7a\u7d7b\u7d7c\u7d7d\u7d7e\u7d7f\u7d80\u7d81\u7d82\u7d83\u7d84\u7d85\u7d86\u7d87\u7d88\u7d89\u7d8a\u7d8b\u7d8c\u7d8d\u7d8e\u7d8f\u7d90\u7d91\u7d92\u7d93\u7d94\u7d95\u7d96\u7d97\u7d98\u7d99\u7d9a\u7d9b\u7dd0\u42df\u42e0\u42e1\u42e2\u42e3\u42e4\u42e5\u42e6\u7d9c\u7d9d\u7d9e\u7d9f\u7da0\u7da1\u7da2\u7da3\u7da4\u7da5\u7da6\u7da7\u7da8\u7da9\u7daa\u7dab\u7dac\u7dad\u7dae\u7daf\u7db0\u7db1\u7db2\u7db3\u7db4\u7db5\u7db6\u7db7\u7db8\u7db9\u7dba\u7dbb\u7dbc\u7dbd\u7dbe\u7dbf\u7dc0\u7dc1\u7dc2\u7dc3\u7dc4\u7dc5\u7dc6\u7dc7\u7dc8\u7dc9\u7dca\u7dcb\u7dcc\u7dcd\u7dce\u7dcf\u7dd1\u7dd2\u7dd4\u7dd5\u42e7\u42e8\u42e9\u42ea\u42eb\u42ec\u42ed\u42ee\u42ef\u42f0\u42f1\u42f2\u7dd3\u7dd6\u7dd7\u7dd8\u7dd9\u7dda\u7ddb\u7ddc\u7ddd\u7dde\u7ddf\u7de0\u7de1\u7de2\u7de3\u7de4\u7de5\u7de6\u7de7\u7de8\u7de9\u7dea\u7deb\u7dec\u7ded\u7dee\u7def\u7df0\u7df1\u7df2\u7df3\u7df4\u7df5\u7df6\u7df7\u7df8\u7df9\u7dfa\u7dfb\u7dfc\u7dfd\u7dfe\u7dff\u7e00\u7e01\u7e02\u7e03\u7e04\u7e05\u7e06\u7e07\u42f3\u42f4\u42f5\u42f6\u42f7\u42f8\u42f9\u42fa\u42fb\u42fc\u42fd\u42fe\u42ff\u4300\u4301\u4302\u4303\u4304\u7e08\u7e09\u7e0a\u7e0b\u7e0c\u7e0d\u7e0e\u7e0f\u7e10\u7e11\u7e12\u7e13\u7e14\u7e15\u7e16\u7e17\u7e18\u7e19\u7e1a\u7e1b\u7e1c\u7e1d\u7e1e\u7e1f\u7e20\u7e21\u7e22\u7e23\u7e24\u7e25\u7e26\u7e27\u7e28\u4305\u4306\u4307\u4308\u4309\u430a\u430b\u7e29\u7e2a\u7e2b\u7e2c\u7e2d\u7e2e\u7e2f\u7e30\u7e31\u7e32\u7e33\u7e34\u7e35\u7e36\u7e37\u7e38\u7e39\u7e3a\u7e3b\u7e3c\u7e3d\u7e3e\u7e3f\u7e40\u7e41\u7e42\u7e43\u7e44\u7e45\u7e46\u7e47\u7e49\u7e4a\u7e4c\u7e4d\u430c\u430d\u430e\u430f\u4310\u4311\u4312\u4313\u4314\u4315\u7e48\u7e4e\u7e4f\u7e50\u7e51\u7e52\u7e53\u7e54\u7e55\u7e56\u7e57\u7e58\u7e59\u7e5a\u7e5b\u7e5c\u7e5d\u7e5e\u7e5f\u7e60\u7e61\u7e62\u7e63\u7e64\u7e65\u7e67\u7e71\u4316\u4317\u4318\u4319\u431a\u431b\u7e4b\u7e66\u7e68\u7e69\u7e6a\u7e6b\u7e6c\u7e6d\u7e6e\u7e6f\u7e70\u7e72\u7e73\u7e74\u7e75\u7e76\u7e77\u7e78\u7e79\u7e7a\u431c\u431d\u431e\u431f\u4320\u4321\u4322\u7e7b\u7e7c\u7e7d\u7e7e\u7e7f\u7e80\u7e81\u7e82\u7e83\u4323\u4324\u4325\u4326\u4327\u7e84\u7e85\u7e86\u7e87\u7e88\u7e89\u7e8a\u7e8b\u7e8c\u7e8d\u7e8e\u7e8f\u7e90\u4328\u4329\u7e91\u7e92\u432a\u432b\u432c\u432d\u7e93\u7e94\u7e95\u7e96\u432e\u7e97\u432f\u4330\u4331\u4332\u7e98\u7e99\u7e9a\u7e9b\u4333\u4334\u7e9c\u7e9d\u4335\u7e9e\u7e9f\u7ea0\u7ea1\u7ea2\u7ea3\u7ea4\u7ea5\u7ea6\u7ea7\u7ea8\u7ea9\u7eaa\u7eab\u7eb6\u4336\u7eac\u7ead\u7eae\u7eaf\u7eb0\u7eb1\u7eb2\u7eb3\u7eb4\u7eb5\u7eb7\u7eb8\u7eb9\u7eba\u7ebb\u7ebc\u7ebd\u7ebe\u4338\u7ebf\u7ec0\u7ec1\u7ec2\u7ec3\u7ec4\u7ec5\u7ec6\u7ec7\u7ec8\u7ec9\u7eca\u7ecb\u7ecc\u7ecd\u7ece\u7ecf\u7ed0\u4337\u4339\u7ed1\u7ed2\u7ed3\u7ed4\u7ed5\u7ed6\u7ed7\u7ed8\u7ed9\u7eda\u7edb\u7edc\u7edd\u7ede\u7edf\u433a\u433b\u7ee0\u7ee1\u7ee2\u7ee3\u7ee4\u7ee5\u7ee6\u7ee7\u7ee8\u433c\u7ee9\u7eea\u7eeb\u7eec\u7eed\u7eee\u7eef\u7ef0\u7ef1\u7ef2\u7ef3\u7ef4\u7ef5\u7ef6\u7ef7\u7ef8\u7ef9\u7efa\u7efb\u7efc\u7efd\u7efe\u7eff\u7f00\u7f01\u433d\u7f02\u7f03\u7f04\u7f05\u7f06\u7f07\u7f08\u7f09\u7f0a\u7f0b\u7f0c\u7f0d\u7f0e\u7f0f\u7f10\u7f11\u7f12\u7f13\u7f14\u7f15\u7f16\u7f17\u7f18\u433e\u433f\u7f19\u7f1a\u7f1b\u7f1c\u7f1d\u7f1e\u7f1f\u7f20\u7f21\u7f22\u7f23\u7f24\u4340\u7f25\u7f26\u7f27\u7f28\u7f29\u7f2a\u7f2b\u7f2c\u7f2d\u7f2e\u7f2f\u7f30\u7f31\u7f32\u7f33\u7f34\u4341\u7f35\u7f36\u7f37\u7f38\u4342\u7f39\u7f3a\u7f3c\u4343\u7f3b\u7f3d\u4344\u4345\u4346\u4347\u4348\u4349\u7f3e\u7f3f\u7f40\u434a\u7f41\u7f42\u434b\u434c\u7f43\u434d\u7f44\u7f45\u7f46\u7f47\u7f48\u7f49\u7f4a\u7f4b\u7f4c\u7f4d\u7f4e\u7f4f\u434e\u7f50\u7f51\u7f52\u7f53\u434f\u7f54\u7f55\u7f56\u7f57\u4350\u4351\u7f58\u7f59\u7f5a\u4352\u4353\u4354\u7f5b\u7f5c\u7f5d\u7f5e\u7f5f\u7f60\u7f61\u7f62\u4355\u4356\u4357\u7f63\u4358\u7f64\u7f65\u7f66\u4359\u435a\u7f67\u7f68\u7f69\u7f6a\u7f6b\u7f6c\u7f6d\u7f6e\u7f72\u435b\u435c\u435d\u435e\u7f6f\u7f70\u7f71\u7f73\u7f74\u435f\u7f75\u7f76\u7f77\u7f78\u7f79\u7f7a\u7f7b\u7f7c\u4360\u4361\u7f7d\u7f7e\u7f7f\u7f80\u7f81\u4362\u7f82\u4363\u7f83\u7f84\u7f85\u7f86\u4364\u4365\u7f87\u7f88\u7f89\u4366\u9fe1\u7f8a\u7f8b\u7f8c\u7f8d\u7f8e\u7f8f\u7f90\u7f91\u7f92\u7f93\u7f94\u7f96\u7f97\u7f98\u7f99\u4367\u4368\u4369\u7f95\u7f9a\u7f9b\u7f9c\u7f9d\u7f9e\u7f9f\u436a\u436b\u436c\u436d\u7fa0\u7fa1\u7fa2\u436e\u436f\u4370\u7fa3\u7fa4\u7fa5\u7fa6\u7fa7\u7fa8\u7fa9\u7faa\u4371\u7fab\u4372\u4373\u4374\u4375\u4376\u7fac\u7fad\u7fae\u7faf\u7fb0\u4377\u7fb1\u7fb2\u4378\u4379\u437a\u7fb3\u7fb4\u7fb5\u437b\u437c\u7fb6\u7fb7\u7fb8\u7fb9\u7fba\u7fbb\u7fbc\u437d\u7fbd\u7fbe\u7fbf\u7fc0\u7fc1\u7fc2\u7fc3\u7fc4\u7fc5\u7fc6\u437e\u437f\u7fc7\u7fc8\u7fc9\u7fca\u7fcb\u7fcc\u7fcd\u7fce\u7fcf\u7fd0\u7fd1\u7fd2\u4380\u4381\u4382\u4383\u4384\u4385\u4386\u7fd3\u7fd4\u7fd5\u7fd6\u7fd7\u7fd8\u7fd9\u7fda\u4387\u4388\u4389\u438a\u7fdb\u7fdc\u7fdd\u438b\u438c\u438d\u438e\u7fde\u7fdf\u7fe0\u7fe1\u7fe2\u7fe3\u7fe4\u438f\u4390\u4391\u4392\u4393\u7fe5\u7fe6\u7fe7\u7fe8\u7fe9\u7fea\u7feb\u7fec\u7fed\u7fee\u7fef\u7ff0\u7ff1\u4394\u4395\u7ff2\u7ff3\u7ff4\u7ff5\u7ff6\u7ffc\u7ff7\u7ff8\u7ff9\u7ffa\u7ffb\u4396\u4397\u4398\u7ffd\u7ffe\u7fff\u8000\u4399\u439a\u8001\u8002\u8003\u439b\u8004\u8005\u8006\u8007\u8008\u8009\u800a\u800b\u439c\u439d\u439e\u800c\u800d\u800e\u800f\u8010\u8011\u439f\u43a0\u43a1\u8012\u8013\u8014\u43a2\u8015\u8016\u8017\u8018\u8019\u801a\u801b\u801c\u801d\u801e\u801f\u43a3\u8020\u8021\u8022\u43a4\u43a5\u8023\u8024\u8025\u43a6\u43a7\u43a8\u43a9\u43aa\u8026\u8027\u43ab\u43ac\u8028\u8029\u802a\u802b\u802c\u43ad\u43ae\u43af\u802d\u802e\u43b0\u802f\u8030\u43b1\u8031\u8032\u8033\u8034\u43b2\u8035\u8036\u8037\u8038\u8039\u803a\u803b\u803c\u803d\u803e\u803f\u8040\u8041\u8042\u43b3\u43b4\u8043\u8044\u8045\u8046\u8047\u8048\u8049\u804a\u804b\u804c\u804d\u43b5\u43b6\u804e\u804f\u8050\u8051\u8052\u8053\u8054\u8060\u43b7\u8055\u8056\u8057\u8058\u43b8\u43b9\u8059\u805a\u805b\u805c\u805d\u805e\u805f\u8061\u8062\u8063\u9fe2\u43ba\u43bb\u43bc\u43bd\u43be\u8064\u8065\u8066\u8067\u8068\u8069\u806a\u806b\u9fe3\u43bf\u43c0\u806c\u806d\u43c1\u43c2\u43c3\u806f\u8070\u8071\u8072\u8073\u43c4\u43c5\u43c6\u43c7\u806e\u8074\u8075\u8076\u8077\u9fe4\u43c8\u8078\u8079\u807a\u807b\u807c\u43c9\u807d\u807e\u43ca\u807f\u8080\u8081\u8082\u8083\u8084\u8085\u8086\u43cb\u8087\u8088\u8089\u808a\u808b\u808c\u808d\u808e\u808f\u43cc\u43cd\u8090\u8091\u8092\u8093\u8094\u8095\u8096\u8097\u8098\u8099\u809a\u809b\u809c\u809d\u809e\u809f\u80a0\u43ce\u43cf\u80a1\u80a2\u80a3\u80a4\u80a5\u80a6\u80a7\u80a8\u80a9\u80aa\u80ab\u80ac\u80ad\u80ae\u80af\u80b0\u80b1\u80b2\u80b3\u80b4\u80b5\u80b6\u80b7\u80b8\u80b9\u80ba\u80bb\u80bc\u80bd\u80be\u80bf\u80c0\u80c1\u43d0\u43d1\u43d2\u43d3\u43d4\u43d5\u43d6\u43d7\u43d8\u43d9\u43da\u43db\u43dc\u43dd\u6711\u80c2\u80c3\u80c4\u80c5\u80c6\u80c7\u80c8\u80c9\u80ca\u80cb\u80cc\u80cd\u80ce\u80cf\u80d0\u80d1\u80d2\u80d3\u80d4\u80d5\u80d6\u80d7\u80d8\u80d9\u80da\u80db\u80dc\u80dd\u80de\u80df\u80e0\u80e1\u80e2\u80e3\u80e4\u80e5\u80e6\u80e7\u80e8\u80e9\u80ea\u80eb\u80ec\u8109\u43de\u43df\u43e0\u43e1\u43e2\u43e3\u43e4\u43e5\u80ed\u80ee\u80ef\u80f0\u80f1\u80f2\u80f3\u80f4\u80f5\u80f6\u80f7\u80f8\u80f9\u80fa\u80fb\u80fc\u80fd\u80fe\u80ff\u8100\u8101\u8102\u8103\u8104\u8105\u8106\u8107\u8108\u810a\u810b\u810c\u810d\u810e\u810f\u8110\u8111\u8112\u8113\u8114\u43e6\u43e7\u43e8\u43e9\u43ea\u43eb\u43ec\u43ed\u43ee\u8115\u8116\u8117\u8118\u8119\u811a\u811b\u811c\u811d\u811e\u811f\u8120\u8121\u8122\u8123\u8124\u8125\u8126\u8127\u8128\u8129\u812a\u812b\u812c\u812d\u812e\u812f\u8130\u8131\u8132\u8133\u8134\u8135\u8136\u8137\u8138\u43ef\u43f0\u43f1\u43f2\u43f3\u43f4\u43f5\u43f6\u43f7\u43f8\u43f9\u43fa\u43fb\u8139\u813a\u813b\u813c\u813d\u813e\u813f\u8140\u8141\u8142\u8143\u8144\u8145\u8146\u8147\u8148\u8149\u814a\u814b\u814c\u814d\u814e\u814f\u8150\u8151\u8152\u8153\u8154\u8155\u8156\u8157\u8158\u8159\u815a\u3b39\u43fc\u43fd\u43fe\u43ff\u4400\u4401\u4402\u4403\u4404\u4405\u4406\u4407\u4408\u4409\u440a\u440b\u440c\u5e50\u6721\u815b\u815c\u815d\u815e\u815f\u8160\u8161\u8162\u8163\u8164\u8165\u8166\u8167\u8168\u8169\u816a\u816b\u816c\u816d\u816e\u816f\u8170\u8171\u8172\u8173\u8174\u8175\u8176\u8177\u8178\u8179\u817a\u817b\u817c\u817d\u817e\u440d\u440e\u440f\u4410\u4411\u4412\u4413\u4414\u4415\u4416\u4417\u4418\u4419\u441a\u441b\u817f\u8180\u8181\u8182\u8183\u8184\u8185\u8186\u8187\u8188\u8189\u818a\u818b\u818c\u818d\u818e\u818f\u8190\u8191\u441c\u441d\u441e\u441f\u4420\u4421\u4422\u4423\u4424\u4425\u4426\u4427\u4428\u4429\u442a\u8192\u8193\u8194\u8195\u8196\u8197\u8198\u8199\u819a\u819b\u819c\u819d\u819e\u819f\u81a0\u81a1\u81a2\u81a3\u442b\u442c\u442d\u442e\u442f\u4430\u4431\u4432\u4433\u4434\u6725\u81a5\u81a6\u81a7\u81a8\u81a9\u81aa\u81ab\u81ac\u81ad\u81ae\u81af\u81b0\u81b1\u81b2\u81b3\u81b4\u81b5\u81b6\u4435\u4436\u4437\u4438\u4439\u443a\u443b\u443c\u443d\u81b7\u81b8\u81b9\u81ba\u81bb\u81bc\u81bd\u81be\u81bf\u81c0\u81c1\u81c2\u81c3\u81c4\u81c5\u81c6\u81c7\u81c8\u81c9\u81ca\u81cb\u81cc\u443e\u443f\u4440\u4441\u81cd\u81ce\u81cf\u81d0\u81d1\u81d2\u81d3\u4442\u4443\u4444\u4445\u81d4\u81d5\u81d7\u81d8\u4446\u4447\u4448\u81d6\u81d9\u81da\u81db\u81dc\u4449\u444a\u81dd\u352e\u444b\u444c\u444d\u444e\u81de\u81df\u444f\u81e0\u81e1\u81e2\u81e3\u81e4\u81e5\u4450\u81e6\u81e7\u81e8\u81e9\u4451\u81ea\u81eb\u81ec\u81ed\u81ee\u81ef\u81f0\u81f1\u81f2\u81f3\u81f4\u4452\u81f5\u81f6\u81f7\u81f8\u81f9\u4453\u81fa\u81fb\u81fc\u81fd\u81fe\u81ff\u8200\u8201\u4454\u8202\u4455\u8203\u8204\u8205\u8207\u4456\u8208\u4457\u8206\u8209\u4458\u820a\u820b\u820c\u820d\u820e\u820f\u8210\u4459\u445a\u8211\u445b\u8212\u8213\u8214\u8215\u8216\u8217\u445c\u8218\u8219\u821a\u821b\u821c\u821d\u821e\u445d\u445e\u445f\u821f\u8220\u4460\u8221\u8222\u8223\u8224\u4461\u4462\u4463\u8225\u8226\u8227\u8228\u8229\u822a\u822b\u822c\u822d\u822e\u822f\u8230\u8231\u4464\u4465\u8232\u8233\u8234\u8235\u8236\u8237\u8238\u8239\u823a\u823b\u4466\u4467\u4468\u4469\u823c\u823d\u823e\u823f\u446a\u446b\u446c\u446d\u446e\u8240\u8241\u8242\u8243\u8244\u8245\u8246\u8247\u8248\u8249\u446f\u4470\u824a\u824b\u824c\u824d\u4471\u4472\u4473\u4474\u4475\u4476\u4477\u4478\u824e\u824f\u8250\u8251\u8252\u8253\u8254\u4479\u447a\u447b\u8255\u8256\u8257\u8258\u8259\u447c\u447d\u447e\u825a\u825b\u825c\u825d\u447f\u4480\u4481\u4482\u4483\u4484\u4485\u825e\u825f\u8260\u4486\u4487\u4488\u8261\u8262\u8263\u8264\u8265\u8266\u8267\u8268\u8269\u4489\u826a\u826b\u826c\u826d\u826e\u826f\u8270\u8271\u9fe5\u8272\u448a\u8273\u8274\u448b\u8275\u448c\u448d\u448e\u448f\u8276\u4490\u8277\u8278\u8279\u4491\u827a\u9fb7\u827b\u827c\u827d\u827e\u827f\u8280\u8281\u8282\u4492\u4493\u4494\u8283\u8284\u8285\u8286\u8287\u8288\u8289\u828a\u828b\u828c\u828d\u828e\u828f\u8290\u8291\u8292\u8293\u8294\u8295\u8296\u8297\u4495\u4496\u4497\u4498\u4499\u8298\u8299\u829a\u829b\u829c\u829d\u829e\u829f\u82a0\u82a1\u82a2\u82a3\u82a4\u82a5\u82a6\u82a7\u82a8\u82a9\u82aa\u82ab\u82ac\u82ad\u82ae\u82af\u82b0\u82b1\u82b2\u82b3\u82b4\u82b5\u82b6\u82b7\u82b8\u82b9\u82ba\u82bb\u82bc\u82bd\u82be\u82c0\u82c1\u82c2\u82c3\u82c4\u82c5\u82c6\u82c7\u82c8\u82c9\u82ca\u82cb\u82cc\u82cd\u82ce\u82cf\u833e\u449a\u449b\u449c\u449d\u449e\u449f\u44a0\u44a1\u44a2\u44a3\u44a4\u44a5\u82bf\u82d0\u82d1\u82d2\u82d3\u82d4\u82d5\u82d6\u82d7\u82d8\u82d9\u82da\u82db\u82dc\u82dd\u82de\u82df\u82e0\u82e1\u82e2\u82e3\u82e4\u82e5\u82e6\u82e7\u82e8\u82e9\u82ea\u82eb\u82ec\u82ed\u82ee\u82ef\u82f0\u82f1\u82f2\u82f3\u82f4\u82f5\u82f6\u82f7\u82f8\u82f9\u82fa\u82fb\u82fc\u82fd\u82fe\u82ff\u8300\u8301\u8302\u8303\u8304\u8305\u8306\u8307\u8308\u8309\u830a\u830b\u830c\u830d\u830e\u830f\u8310\u8311\u8313\u8314\u8315\u44a6\u44a7\u44a8\u44a9\u44aa\u44ab\u44ac\u44ad\u44ae\u44af\u8312\u8316\u8317\u8318\u8319\u831a\u831b\u831c\u831e\u831f\u8320\u8321\u8322\u8324\u8325\u8326\u8327\u8328\u8329\u832a\u832b\u832c\u832d\u832e\u832f\u8330\u8331\u8332\u8333\u8334\u8335\u8336\u8337\u8338\u8339\u833a\u833b\u833c\u833d\u833f\u8340\u8341\u8342\u8343\u8344\u8345\u8346\u8347\u8348\u8349\u834a\u834b\u834c\u834d\u834e\u834f\u8350\u8351\u8352\u8354\u8355\u8356\u8357\u8358\u8359\u835a\u835b\u835c\u835d\u835e\u835f\u8360\u8361\u8362\u8363\u8364\u8365\u8366\u8367\u8368\u8369\u836a\u836b\u836c\u836d\u836e\u836f\u9fd2\u44b0\u44b1\u44b2\u44b3\u44b4\u44b5\u44b6\u44b7\u44b8\u44b9\u44ba\u44bb\u44bc\u44bd\u44be\u44bf\u44c0\u44c1\u831d\u8323\u8370\u8371\u8372\u8373\u8374\u8375\u8376\u8377\u8378\u8379\u837a\u837b\u837c\u837d\u837e\u837f\u8380\u8381\u8382\u8383\u8384\u8385\u8386\u8387\u8388\u8389\u838a\u838b\u838c\u838d\u838e\u838f\u8390\u8391\u8392\u8393\u8394\u8395\u8396\u8397\u8398\u8399\u839a\u839b\u839c\u839d\u839e\u839f\u83a0\u83a1\u83a2\u83a3\u83a4\u83a5\u83a6\u83a7\u83a8\u83a9\u83aa\u83ab\u83ac\u83ae\u83af\u83b0\u83b1\u83b2\u83b3\u83b4\u83b5\u83b6\u83b7\u83b8\u83b9\u83ba\u83bb\u83bc\u83bd\u9fca\u44c2\u44c3\u44c4\u44c5\u44c6\u44c7\u44c8\u44c9\u44ca\u44cb\u44cc\u44cd\u44ce\u44cf\u44d0\u44d1\u44d2\u44d3\u44d4\u44d6\u8353\u83be\u83bf\u83c0\u83c1\u83c2\u83c3\u83c4\u83c5\u83c6\u83c7\u83c8\u83c9\u83ca\u83cb\u83cc\u83cd\u83ce\u83cf\u83d0\u83d1\u83d2\u83d3\u83d4\u83d5\u83d6\u83d7\u83d8\u83d9\u83da\u83db\u83dc\u83dd\u83de\u83df\u83e0\u83e1\u83e2\u83e3\u83e4\u83e5\u83e6\u83e7\u83e8\u83e9\u83ea\u83eb\u83ec\u83ed\u83ee\u83ef\u83f0\u83f1\u83f2\u83f3\u83f4\u83f5\u83f6\u83f7\u83f8\u83f9\u83fa\u83fb\u83fc\u83fd\u83fe\u83ff\u8400\u8401\u8402\u8403\u8404\u8405\u8406\u8407\u8408\u8409\u840a\u840b\u840c\u840d\u840e\u840f\u8410\u8411\u8412\u8413\u8414\u8415\u8416\u8417\u8418\u8419\u841a\u841b\u841c\u841d\u841e\u841f\u8420\u8421\u8422\u8423\u8424\u8425\u8426\u8427\u8428\u8457\u9fbf\u44d5\u44d7\u44d8\u44d9\u44da\u44db\u44dc\u44dd\u44de\u44df\u44e0\u44e1\u44e2\u44e3\u44e4\u44e5\u44e6\u44e7\u44e8\u44e9\u44ea\u44eb\u44ec\u44ed\u83ad\u8429\u842a\u842b\u842d\u842e\u842f\u8430\u8431\u8432\u8433\u8434\u8435\u8436\u8437\u8438\u8439\u843a\u843b\u843c\u843d\u843e\u843f\u8440\u8441\u8442\u8443\u8444\u8445\u8446\u8447\u8448\u8449\u844a\u844b\u844c\u844d\u844e\u844f\u8450\u8451\u8452\u8453\u8454\u8455\u8456\u8458\u8459\u845a\u845b\u845c\u845d\u845e\u845f\u8460\u8461\u8462\u8463\u8464\u8465\u8466\u8467\u8468\u8469\u846a\u846b\u846c\u846d\u846e\u846f\u8470\u8471\u8472\u8473\u8474\u8475\u8476\u8477\u8478\u8479\u847a\u847b\u847c\u847d\u847e\u847f\u8480\u8481\u8482\u8483\u8484\u8485\u8486\u8487\u8488\u8489\u848a\u848b\u848c\u848d\u848e\u848f\u9fd3\u44ee\u44ef\u44f0\u44f1\u44f2\u44f3\u44f4\u44f5\u44f6\u44f7\u44f8\u44f9\u44fa\u44fb\u8490\u8491\u8492\u8493\u8494\u8495\u8496\u8497\u8498\u8499\u849a\u849b\u849c\u849d\u849e\u849f\u84a0\u84a1\u84a2\u84a3\u84a4\u84a5\u84a6\u84a7\u84a8\u84a9\u84aa\u84ab\u84ac\u84ad\u84ae\u84af\u84b0\u84b1\u84b2\u84b3\u84b4\u84b5\u84b6\u84b7\u84b9\u84ba\u84bb\u84bc\u84bd\u84be\u84bf\u84c0\u84c1\u84c2\u84c3\u84c4\u84c5\u84c6\u84c7\u84c8\u84c9\u84ca\u84cb\u84cc\u84cd\u84ce\u84cf\u84d0\u84d1\u84d2\u84d3\u84d4\u84d5\u84d6\u84d7\u84d8\u84d9\u84da\u84db\u84dc\u84dd\u84de\u84df\u84e0\u84e1\u84e2\u84e3\u84e4\u84e6\u44fc\u44fd\u44fe\u44ff\u4500\u4501\u4502\u4503\u4504\u4505\u4506\u4507\u4508\u4509\u450a\u450b\u450c\u450d\u84e5\u84e7\u84e8\u84e9\u84ea\u84eb\u84ec\u84ed\u84ee\u84ef\u84f0\u84f1\u84f2\u84f3\u84f4\u84f5\u84f6\u84f7\u84f8\u84f9\u84fa\u84fb\u84fc\u84fd\u84fe\u84ff\u8500\u8501\u8502\u8503\u8504\u8505\u8506\u8507\u8508\u8509\u850a\u850b\u850c\u850d\u850e\u850f\u8510\u8511\u8512\u8513\u8514\u8515\u8516\u8517\u8518\u8519\u851a\u851b\u851c\u851d\u851e\u851f\u8520\u8521\u8522\u8523\u8524\u8525\u8526\u8527\u8528\u8529\u852a\u852b\u852c\u852d\u852e\u852f\u8530\u8531\u8532\u8533\u8534\u8535\u8536\u8537\u8538\u8539\u853a\u853b\u853c\u450e\u450f\u4510\u4511\u4512\u4513\u4514\u4515\u4516\u4517\u4518\u4519\u451a\u451b\u451c\u451d\u451e\u451f\u4520\u4521\u4522\u4523\u4524\u4525\u4526\u4527\u4528\u4529\u452a\u452b\u452c\u853d\u853e\u853f\u8540\u8541\u8542\u8543\u8544\u8545\u8546\u8547\u8548\u8549\u854a\u854b\u854c\u854d\u854e\u854f\u8550\u8551\u8552\u8553\u8554\u8555\u8556\u8557\u8558\u8559\u855a\u855b\u855c\u855d\u855e\u855f\u8560\u8561\u8562\u8563\u8564\u8565\u8566\u8567\u8568\u8569\u856a\u856b\u856c\u856d\u856e\u856f\u8570\u8571\u8572\u8573\u8574\u8575\u452d\u452e\u452f\u4530\u4531\u4532\u4533\u4534\u4535\u4536\u4537\u4538\u4539\u453a\u453b\u453c\u453d\u453e\u453f\u4540\u4541\u4542\u4543\u4544\u8576\u8577\u8578\u8579\u857a\u857b\u857c\u857d\u857e\u857f\u8580\u8581\u8582\u8583\u8584\u8585\u8586\u8587\u8588\u8589\u858a\u858b\u858c\u858d\u858e\u858f\u8590\u8591\u8592\u8593\u8594\u8595\u8596\u8597\u8598\u8599\u859a\u859b\u859c\u859d\u859e\u859f\u85a0\u85a1\u85a2\u85a3\u85a4\u85a5\u85a6\u85a7\u85a8\u85aa\u85ab\u85ac\u85ae\u9fa9\ufa1f\u4545\u4546\u4547\u4548\u4549\u454a\u454b\u454c\u454d\u454e\u454f\u4550\u4551\u85a9\u85ad\u85af\u85b0\u85b1\u85b2\u85b3\u85b4\u85b5\u85b6\u85b7\u85b8\u85b9\u85ba\u85bb\u85bc\u85bd\u85be\u85bf\u85c0\u85c1\u85c2\u85c3\u85c4\u85c5\u85c6\u85c7\u85c8\u85c9\u85ca\u85cb\u85cc\u85cd\u85ce\u85cf\u85d0\u85d1\u85d2\u85d3\u8624\u4552\u4553\u4554\u4555\u4556\u4557\u4558\u4559\u455a\u455b\u455c\u455d\u85d4\u85d5\u85d6\u85d7\u85d8\u85d9\u85da\u85db\u85dc\u85dd\u85de\u85df\u85e0\u85e1\u85e2\u85e3\u85e4\u85e5\u85e6\u85e7\u85e8\u85e9\u85ea\u85eb\u85ec\u85ed\u85ef\u85f0\u85f1\u85f2\u85f3\u85f4\u85f5\u455e\u455f\u4560\u4561\u4562\u4563\u4564\u4565\u85ee\u85f6\u85f7\u85f8\u85f9\u85fa\u85fb\u85fc\u85fd\u85fe\u85ff\u8600\u8601\u8602\u8603\u8604\u8605\u8606\u8607\u8608\u8609\u860a\u860b\u860c\u860d\u860e\u860f\u8610\u8611\u8613\u8614\u8622\u4566\u4567\u4568\u4569\u456a\u456b\u456c\u456d\u456e\u456f\u4570\u4571\u4572\u8612\u8615\u8616\u8617\u8618\u8619\u861a\u861b\u861c\u861d\u861e\u861f\u8620\u8621\u8623\u8625\u8626\u8627\u8628\u8629\u862a\u862b\u862c\u862d\u862e\u862f\u8630\u4573\u4574\u4575\u4576\u4577\u8632\u8633\u8634\u8635\u8636\u8637\u9fc0\u9fe6\u4578\u4579\u457a\u8631\u8638\u8639\u863a\u863b\u863c\u863d\u863e\u863f\u8640\u8641\u457b\u457c\u457d\u8642\u8643\u8644\u8645\u457e\u8646\u8647\u8648\u8649\u457f\u4580\u4581\u864a\u4582\u4583\u4584\u4585\u4586\u864b\u864c\u4587\u864d\u864e\u864f\u4588\u5f6a\u8650\u4589\u8651\u8653\u8654\u458a\u458b\u458c\u458d\u8655\u8656\u8657\u8658\u8659\u865a\u458e\u458f\u865b\u865c\u865d\u4590\u4591\u865e\u865f\u4592\u4593\u4594\u4595\u4596\u8660\u8661\u8662\u8663\u4597\u8664\u8665\u8666\u4598\u8667\u8668\u4599\u8669\u459a\u459b\u459c\u866a\u866b\u866c\u459d\u866d\u866e\u866f\u8670\u8671\u8672\u8673\u8674\u8675\u8676\u8677\u8678\u8679\u867a\u867b\u867c\u867d\u867e\u867f\u8680\u8681\u8682\u8683\u459e\u459f\u45a0\u8684\u8685\u8686\u8687\u8689\u868a\u868b\u868c\u868d\u868e\u868f\u8690\u8691\u8692\u8693\u8694\u8695\u8696\u8697\u8698\u8699\u869a\u869b\u869c\u869d\u869e\u869f\u86a0\u86a1\u86a2\u86a3\u86a4\u86a5\u86a6\u86a7\u86a8\u86a9\u86aa\u86ac\u45a1\u45a2\u45a3\u86ab\u86ad\u86ae\u86af\u86b0\u86b1\u86b2\u86b3\u86b4\u86b5\u86b6\u86b7\u86b8\u86b9\u86ba\u86bb\u86bc\u86bd\u86be\u86bf\u86c0\u86c1\u86c2\u86c3\u86c4\u86c5\u86c6\u86c7\u86c8\u86c9\u86ca\u86cb\u86cc\u86cd\u86ce\u86cf\ufa21\u45a4\u45a5\u45a6\u45a7\u45a8\u45a9\u45aa\u45ab\u45ac\u8688\u86d0\u86d1\u86d2\u86d3\u86d4\u86d5\u86d7\u86d8\u86d9\u86da\u86db\u86dc\u86dd\u86de\u86df\u86e0\u86e1\u86e2\u86e3\u86e4\u86e5\u86e6\u86e7\u86e8\u86e9\u86ea\u86eb\u86ec\u86ed\u86ee\u86ef\u86f0\u86f1\u86f2\u86f3\u86f4\u45ad\u45ae\u45af\u45b0\u45b1\u45b2\u45b3\u45b4\u45b5\u86d6\u86f5\u86f6\u86f7\u86f8\u86f9\u86fa\u86fb\u86fc\u86fd\u86fe\u86ff\u8700\u8701\u8702\u8703\u8704\u8705\u8706\u8707\u8708\u8709\u870a\u870b\u870c\u870d\u870e\u870f\u8710\u8711\u8712\u8713\u8714\u8715\u8716\u8717\u872b\u8746\u45b6\u45b7\u45b8\u45b9\u45ba\u45bb\u45bc\u45bd\u45be\u8718\u8719\u871a\u871b\u871c\u871d\u871e\u871f\u8720\u8721\u8722\u8723\u8724\u8725\u8726\u8727\u8728\u8729\u872a\u872c\u872d\u872e\u872f\u8730\u8731\u8732\u8733\u8734\u8735\u8736\u8737\u8738\u8739\u873a\u873b\u873c\u873d\u873e\u873f\u8740\u8741\u8742\u8743\u8744\u8745\u8747\u8748\u8749\u874a\u874b\u45bf\u45c0\u45c1\u45c2\u45c3\u45c4\u45c5\u45c6\u45c7\u45c8\u45c9\u45ca\u45d5\u874c\u874d\u874e\u874f\u8750\u8751\u8752\u8753\u8754\u8755\u8756\u8757\u8758\u8759\u875a\u875b\u875c\u875d\u875e\u875f\u8760\u8761\u8762\u8763\u8764\u8765\u8766\u8767\u8768\u8769\u876a\u876b\u876c\u876d\u876e\u876f\u8770\u8771\u8772\u8773\u8774\u8775\u8776\u8777\u8778\u877a\u877b\u877c\u877d\u877e\u877f\u8780\u87e1\u45cb\u45cc\u45cd\u45ce\u45cf\u45d0\u45d1\u45d2\u45d3\u45d4\u45d6\u8779\u8781\u8782\u8783\u8784\u8785\u8786\u8787\u8788\u8789\u878a\u878b\u878c\u878d\u878e\u878f\u8790\u8791\u8792\u8793\u8794\u8795\u8796\u8797\u8798\u8799\u879a\u879b\u879c\u879d\u879e\u879f\u87a0\u87a1\u87a2\u87a3\u87a4\u87a5\u87a6\u87a7\u87a8\u87a9\u87d7\u45d7\u45d8\u45d9\u45da\u45db\u45dc\u45dd\u45de\u87aa\u87ab\u87ac\u87ad\u87ae\u87af\u87b0\u87b1\u87b2\u87b3\u87b4\u87b5\u87b6\u87b7\u87b8\u87b9\u87ba\u87bb\u87bc\u87bd\u87be\u87bf\u87c0\u87c1\u87c2\u87c3\u87c4\u87c5\u87c6\u87c7\u87c8\u87c9\u87ca\u87cb\u87cc\u87cd\u87ce\u87cf\u87d0\u87d1\u87d2\u8801\u45df\u45e0\u45e1\u45e2\u45e3\u45e4\u45e5\u45e6\u45e7\u45e8\u45e9\u45ea\u45eb\u45ec\u45ed\u45ee\u87d3\u87d4\u87d5\u87d6\u87d8\u87d9\u87da\u87db\u87dc\u87dd\u87de\u87df\u87e0\u87e2\u87e3\u87e4\u87e5\u87e6\u87e7\u87e8\u87e9\u87ea\u87eb\u87ec\u87ed\u87ee\u87ef\u87f0\u87f1\u87f2\u87f3\u87f4\u87f5\u880e\u45ef\u45f0\u45f1\u45f2\u45f3\u87f6\u87f7\u87f8\u87f9\u87fa\u87fb\u87fc\u87fd\u87fe\u87ff\u8800\u8802\u8803\u8804\u8805\u8806\u8807\u8808\u8809\u880a\u880b\u880c\u880d\u880f\u45f4\u45f5\u45f6\u45f7\u45f8\u45f9\u45fa\u45fb\u8810\u8811\u8812\u8813\u8814\u8815\u8816\u8817\u8818\u8819\u45fc\u45fd\u45fe\u45ff\u4600\u4601\u881a\u881b\u881c\u881d\u881e\u881f\u8820\u8821\u8822\u8823\u8824\u8834\u4602\u4603\u4604\u8825\u8826\u8827\u8828\u8829\u882a\u882b\u882c\u4605\u4606\u4607\u4608\u4609\u882d\u882e\u882f\u8830\u8831\u8832\u8833\u460a\u460b\u460c\u8835\u8836\u8837\u8838\u8839\u883a\u883b\u460d\u883c\u883d\u883e\u883f\u460e\u8840\u8841\u8842\u460f\u8843\u8844\u4610\u8845\u4611\u8846\u8847\u8848\u8849\u4612\u4613\u4614\u884a\u884b\u884c\u884d\u884e\u884f\u4615\u8850\u8851\u8852\u8853\u8854\u8855\u8856\u8857\u8858\u4616\u8859\u885a\u885b\u885c\u885d\u885e\u885f\u8860\u8861\u4617\u4618\u4619\u8862\u8863\u8864\u8865\u461a\u461b\u8866\u8867\u8868\u8869\u886a\u886b\u886c\u461c\u461d\u461e\u886d\u886e\u886f\u8870\u8871\u8872\u8873\u8874\u8875\u8876\u8877\u8878\u8879\u887a\u887b\u887c\u887d\u887e\u887f\u8880\u8881\u8882\u8883\u8884\u8885\u8886\u8887\u461f\u4620\u4621\u8888\u8889\u888a\u888b\u888c\u888d\u888e\u888f\u8890\u8891\u8892\u8893\u8894\u8895\u8896\u8897\u8898\u8899\u889a\u889b\u889c\u889d\u889e\u889f\u88a0\u88a1\u88a2\u88a3\u88a4\u88a5\u88a6\u88a7\u88a8\u88a9\u88aa\u88ab\u88ac\u88ad\u88ae\u88b0\u4622\u4623\u4624\u4625\u4626\u4627\u88af\u88b1\u88b2\u88b3\u88b4\u88b5\u88b6\u88b7\u88b8\u88b9\u88ba\u88bb\u88bc\u88bd\u88be\u88bf\u88c0\u88c1\u88c2\u88c3\u88c4\u88c5\u88c6\u88c7\u88c8\u88c9\u4628\u4629\u462a\u462b\u462c\u462d\u462e\u88ca\u88cb\u88cc\u88cd\u88ce\u88cf\u88d0\u88d1\u88d2\u88d3\u88d4\u88d5\u88d6\u88d7\u88d8\u88d9\u88da\u88db\u88dc\u88dd\u88de\u88df\u88e0\u88e1\u88e2\u88e3\u88e4\u88e5\u462f\u4630\u4631\u4632\u88e7\u88e8\u88e9\u88ea\u88eb\u88ec\u88ed\u88ee\u88ef\u88f0\u88f1\u88f2\u88f3\u88f4\u88f5\u88f6\u88f7\u88f8\u88f9\u88fa\u88fb\u88fc\u88fd\u88fe\u88ff\u8900\u8901\u8902\u8903\u8904\u4633\u4634\u4635\u4636\u4637\u4638\u4639\u463a\u463b\u463c\u463d\u463e\u463f\u4640\u4641\u4642\u88e6\u8905\u8906\u8907\u8908\u8909\u890a\u890b\u890c\u890d\u890e\u890f\u8910\u8911\u8912\u8913\u8914\u8915\u8916\u8917\u8918\u8919\u891a\u891b\u891c\u891d\u4643\u4644\u4645\u4646\u4647\u4648\u4649\u464a\u464b\u464c\u464d\u891e\u891f\u8920\u8921\u8922\u8923\u8924\u8925\u8926\u8927\u8928\u8929\u892a\u892b\u892c\u892d\u892e\u892f\u8930\u8931\u8932\u8934\u464e\u464f\u4650\u4651\u4652\u4653\u8933\u8935\u8936\u8937\u8938\u8939\u893a\u893b\u893c\u893d\u893e\u893f\u8940\u8941\u8942\u8943\u8944\u8945\u8954\u4654\u4655\u4656\u4657\u4658\u4659\u465a\u465b\u465c\u465d\u8946\u8947\u8948\u8949\u894a\u894b\u894c\u894d\u894e\u894f\u8950\u8951\u8952\u8953\u8955\u9fcb\u465e\u465f\u4660\u4661\u4662\u4663\u8956\u8957\u8958\u8959\u895a\u895b\u895c\u895d\u895e\u895f\u8960\u8961\u8962\u4664\u4665\u8963\u8964\u8965\u8966\u8967\u8968\u4666\u4667\u4668\u4669\u8969\u896a\u896b\u896c\u896d\u896e\u466a\u896f\u8970\u8971\u8972\u466b\u8973\u8974\u897d\u466c\u466d\u8975\u8976\u8977\u466e\u466f\u8978\u8979\u897a\u897b\u897c\u4670\u4671\u897e\u897f\u8980\u8981\u4672\u4673\u8982\u4674\u8983\u8984\u4675\u4676\u8985\u8986\u8987\u8988\u8989\u898a\u898b\u898c\u8999\u898d\u898e\u4677\u4678\u898f\u8990\u8991\u8992\u8993\u8994\u4679\u467a\u467b\u8995\u8997\u8998\u899a\u467c\u467d\u467e\u467f\u899b\u899c\u4680\u4681\u899d\u899e\u899f\u89a0\u89a1\u4682\u4683\u89a2\u89a3\u89a4\u89a5\u4684\u4685\u89a6\u89a7\u89a8\u89a9\u89aa\u4686\u4687\u4688\u4689\u89ab\u89ac\u89ad\u89ae\u89af\u468a\u468b\u468c\u89b0\u89b1\u89b2\u89b3\u468d\u468e\u89b4\u89b5\u89b6\u89b7\u89b8\u468f\u4690\u4691\u4692\u4693\u89b9\u89ba\u89bb\u89bc\u89bd\u4694\u89be\u89bf\u89c0\u4695\u4696\u89c1\u89c2\u89c3\u89c4\u89c5\u89c7\u89c8\u89c9\u89ca\u89cb\u89cc\u89cd\u89ce\u89cf\u89d0\u89d1\u89d2\u89d3\u89d4\u89d5\u89d6\u89d7\u89d8\u89d9\u4697\u89da\u89db\u89dd\u89de\u89dc\u89df\u89e0\u89e1\u89e2\u89e3\u89e4\u89e5\u89e6\u89e7\u4698\u4699\u469a\u89e8\u89e9\u89ea\u89eb\u469b\u89ec\u89ed\u89ee\u89ef\u469c\u469d\u469e\u469f\u46a0\u89f0\u89f1\u46a1\u46a2\u46a3\u46a4\u89f2\u89f3\u46a5\u46a6\u89f4\u9d64\u46a7\u89f5\u89f6\u46a8\u46a9\u46ac\u89f7\u89f8\u89f9\u46aa\u46ab\u89fa\u89fb\u89fc\u89fd\u89fe\u89ff\u46ad\u8a00\u8a01\u8a02\u8a03\u8a04\u8a05\u8a06\u8a07\u8a08\u46ae\u46af\u46b0\u8a09\u8a0a\u8a0b\u8a0c\u8a0d\u8a0e\u8a0f\u8a10\u8a11\u8a12\u8a13\u8a14\u8a15\u8a16\u8a17\u8a18\u8a19\u8a1a\u46b1\u46b2\u8a1b\u8a1c\u8a1d\u8a1e\u8a1f\u8a20\u8a21\u8a22\u8a23\u8a24\u8a25\u8a26\u8a27\u8a28\u8a29\u8a2a\u8a2b\u8a2c\u8a2d\u8a2e\u8a2f\u8a30\u8a31\u8a32\u8a33\u46b3\u46b4\u46b5\u46b6\u46b7\u46b8\u46b9\u46ba\u46bb\u46bc\u46bd\u46be\u46bf\u46c0\u46c1\u46c2\u46c3\u8a34\u8a35\u8a36\u8a37\u8a38\u8a39\u8a3a\u8a3b\u8a3c\u8a3d\u8a3e\u8a3f\u8a40\u8a41\u8a42\u8a43\u8a44\u8a45\u8a46\u8a47\u8a48\u8a49\u8a4a\u8a4b\u8a4c\u8a4d\u8a4e\u8a4f\u8a50\u8a51\u8a52\u8a53\u8a54\u8a55\u8a56\u8a57\u8a58\u8a59\u8a5a\u8a5b\u8a5c\u8a5d\u8a5e\u8a5f\u8a60\u46c4\u46c5\u46c6\u46c7\u46c8\u46c9\u46ca\u46cb\u46cc\u46cd\u46ce\u46cf\u46d0\u46d1\u46d2\u46d3\u8a61\u8a62\u8a63\u8a64\u8a65\u8a66\u8a67\u8a68\u8a69\u8a6a\u8a6b\u8a6c\u8a6d\u8a6e\u8a6f\u8a70\u8a71\u8a72\u8a73\u8a74\u8a75\u8a76\u8a77\u8a78\u8a79\u8a7a\u8a7b\u8a7c\u8a7d\u8a7e\u8a7f\u8a80\u8a81\u8a82\u8a83\u8a84\u8a85\u8a86\u8a87\u8a88\u8a89\u8a8a\u8aa0\u9fc1\u46d4\u46d5\u46d6\u46d7\u46d8\u46d9\u46da\u46db\u46dc\u8a8b\u8a8c\u8a8d\u8a8e\u8a8f\u8a90\u8a91\u8a92\u8a93\u8a94\u8a95\u8a96\u8a97\u8a98\u8a99\u8a9a\u8a9b\u8a9c\u8a9d\u8a9e\u8a9f\u8aa1\u8aa2\u8aa3\u8aa4\u8aa5\u8aa6\u8aa7\u8aa8\u8aa9\u8aaa\u8aab\u8aac\u8aad\u8aae\u46dd\u46de\u46df\u46e0\u46e1\u46e2\u46e3\u46e4\u46e5\u46e6\u46e7\u46e8\u8aaf\u8ab0\u8ab1\u8ab2\u8ab3\u8ab4\u8ab5\u8ab6\u8ab7\u8ab8\u8ab9\u8aba\u8abb\u8abc\u8abd\u8abe\u8abf\u8ac0\u8ac1\u8ac2\u8ac3\u8ac4\u8ac5\u8ac6\u8ac7\u8ac8\u8ac9\u8aca\u8acb\u8acc\u8acd\u8ace\u8acf\u8ad0\u8ad1\u8ad2\u8ad3\u8ad4\u8ad5\u8ad6\u8ad7\u8ad8\u8ad9\u8ada\u8ae9\u46e9\u46ea\u46eb\u46ec\u46ed\u46ee\u46ef\u46f0\u46f1\u46f2\u46f3\u46f4\u46f5\u46f6\u46f7\u46f8\u8adb\u8adc\u8add\u8ade\u8adf\u8ae0\u8ae1\u8ae2\u8ae3\u8ae4\u8ae5\u8ae6\u8ae7\u8ae8\u8aea\u8aeb\u8aec\u8aed\u8aee\u8aef\u8af0\u8af1\u8af2\u8af3\u8af4\u8af5\u8af6\u8af7\u8af8\u8af9\u8afa\u8afb\u8afc\u8afd\u8afe\u8aff\u8b00\u8b01\u8b02\u8b03\u46f9\u46fa\u46fb\u46fc\u46fd\u8b04\u8b05\u8b06\u8b07\u8b08\u8b09\u8b0a\u8b0b\u8b0c\u8b0d\u8b0e\u8b0f\u8b10\u8b11\u8b12\u8b13\u8b14\u8b15\u8b16\u8b17\u8b18\u8b19\u8b1a\u8b1b\u8b1c\u8b1d\u8b1e\u8b1f\u8b20\u8b21\u8b22\u46fe\u46ff\u4700\u4701\u4702\u8b23\u8b24\u8b25\u8b26\u8b27\u8b28\u8b29\u8b2a\u8b2b\u8b2c\u8b2d\u8b2e\u8b2f\u8b30\u8b31\u8b32\u8b33\u8b34\u8b35\u8b36\u8b37\u8b38\u8b39\u8b3a\u8b3b\u8b3c\u8b3d\u8b3e\u4703\u4704\u4705\u4706\u4707\u4708\u4709\u470a\u8b3f\u8b40\u8b41\u8b42\u8b43\u8b44\u8b45\u8b46\u8b47\u8b48\u8b49\u8b4a\u8b4b\u8b4c\u8b4e\u8b4f\u8b50\u8b51\u8b52\u8b53\u8b54\u8b55\u8b56\u8b57\u8b58\u8b59\u8b5a\u8b5b\u8b5c\u9fbb\u470b\u470c\u470d\u470e\u470f\u4710\u4711\u8b4d\u8b5d\u8b5e\u8b5f\u8b60\u8b61\u8b62\u8b63\u8b64\u8b65\u8b66\u8b67\u8b68\u8b69\u8b6a\u8b6b\u8b6c\u8b6d\u8b6e\u8b6f\u8b70\u8b71\u8b72\u4712\u4713\u4714\u4715\u4716\u4717\u4718\u8b73\u8b74\u8b75\u8b76\u8b77\u8b78\u8b79\u8b7a\u8b7b\u8b7c\u8b7d\u4719\u471a\u471b\u471c\u471d\u471e\u8b7e\u8b7f\u8b80\u8b81\u8b82\u8b83\u8b84\u8b85\u471f\u4720\u4721\u8b86\u8b87\u8b88\u8b89\u8b8a\u8b8b\u8b8c\u8b8d\u8b8e\u8b8f\u8b90\u4722\u8b91\u8b92\u8b93\u8b94\u8b95\u8b96\u8b97\u8b98\u8b99\u8b9a\u8b9b\u8b9c\u8b9d\u8b9e\u8b9f\u8ba0\u8ba1\u8ba2\u8ba3\u8ba4\u8ba5\u8ba6\u8ba7\u8ba8\u8ba9\u8baa\u8bab\u8bac\u8bad\u8bae\u8baf\u8bb0\u8bb1\u8bb2\u8bb3\u8bb4\u8bb5\u8bb6\u8bb7\u8bb8\u8bb9\u8bba\u8bbb\u8bbc\u8bbd\u8bbe\u8bbf\u8bc0\u4723\u8bc1\u8bc2\u8bc3\u8bc4\u8bc5\u8bc6\u8bc7\u8bc8\u8bc9\u8bca\u8bcb\u8bcc\u8bcd\u8bce\u8bcf\u8bd0\u8bd1\u8bd2\u8bd3\u8bd4\u8bd5\u8bd6\u8bd7\u8bd8\u8bd9\u8bda\u8bdb\u8bdc\u8bdd\u8bde\u8bdf\u8be0\u8be1\u8be2\u8be3\u8be4\u8be5\u8be6\u8be7\u8be8\u8be9\u4724\u8bea\u8beb\u8bec\u8bed\u8bee\u8bef\u8bf0\u8bf1\u8bf2\u8bf3\u8bf4\u8bf5\u8bf6\u8bf7\u8bf8\u8bf9\u8bfa\u8bfb\u8bfc\u8bfd\u8bfe\u8bff\u8c00\u8c01\u8c02\u8c03\u8c04\u8c05\u8c06\u8c07\u8c08\u8c09\u8c0a\u4725\u8c0b\u8c0c\u8c0d\u8c0e\u8c0f\u8c10\u8c11\u8c12\u8c13\u8c14\u8c15\u8c16\u8c17\u8c18\u8c19\u8c1a\u8c1b\u8c1c\u8c1d\u8c1e\u8c1f\u8c20\u8c21\u8c22\u8c23\u8c24\u8c25\u8c26\u8c27\u4726\u4727\u8c28\u8c29\u8c2a\u8c2b\u8c2c\u4728\u8c2d\u8c2e\u8c2f\u8c30\u8c31\u8c32\u8c33\u8c34\u8c35\u4729\u8c36\u8c37\u472a\u8c38\u472b\u8c39\u8c3a\u8c3b\u472c\u472d\u8c3c\u8c3d\u472e\u8c3e\u472f\u8c3f\u8c40\u8c41\u4730\u8c42\u4731\u8c43\u8c44\u4732\u8c45\u8c46\u4733\u8c47\u8c48\u8c49\u4734\u4735\u8c4a\u8c4b\u4736\u9ff2\u4737\u4738\u4739\u8c4c\u8c4d\u8c4e\u473a\u473b\u473c\u473d\u473e\u473f\u8c4f\u4740\u4741\u4742\u8c50\u8c51\u4743\u8c52\u4744\u8c53\u8c54\u8c55\u8c56\u8c57\u4745\u8c58\u8c59\u8c5a\u8c5b\u8c5c\u8c5d\u4746\u4747\u8c5e\u8c5f\u8c60\u8c61\u4748\u8c62\u8c63\u8c64\u8c65\u8c66\u4749\u8c67\u8c68\u8c69\u8c6a\u474a\u474b\u474c\u8c6b\u8c6c\u8c6d\u8c6e\u474d\u474e\u8c6f\u8c70\u8c71\u8c72\u8c73\u8c74\u8c75\u474f\u8c77\u4750\u4751\u8c76\u4752\u4753\u4754\u4755\u8c78\u8c79\u8c7a\u8c7b\u8c7c\u8c7d\u4756\u4757\u4758\u4759\u8c7e\u8c7f\u8c80\u8c81\u8c82\u8c83\u475a\u475b\u8c84\u8c85\u8c86\u8c87\u8c88\u8c89\u8c8a\u8c8b\u8c8c\u8c8d\u475c\u8c8e\u8c8f\u475d\u475e\u8c90\u8c91\u8c92\u8c93\u475f\u8c94\u8c95\u8c96\u4760\u8c97\u8c98\u8c99\u4761\u4762\u8c9a\u4763\u4764\u4765\u4766\u8c9b\u8c9c\u8c9d\u8c9e\u8c9f\u8ca0\u8ca1\u8ca2\u8ca3\u8ca4\u8ca5\u8ca6\u8ca7\u8ca8\u8ca9\u8caa\u8cab\u8cac\u8cad\u8cae\u4767\u4768\u8caf\u8cb0\u8cb1\u8cb2\u8cb3\u8cb4\u8cb5\u8cb6\u8cb7\u8cb8\u8cb9\u8cba\u8cbb\u8cbc\u8cbd\u8cbe\u8cbf\u8cc0\u8cc1\u4769\u476a\u476b\u476c\u476d\u476e\u476f\u8cc2\u8cc3\u8cc4\u8cc5\u8cc6\u8cc7\u8cc8\u8cc9\u8cca\u8ccb\u8ccc\u8ccd\u8cce\u4770\u4771\u4772\u8ccf\u8cd0\u8cd1\u8cd2\u8cd3\u8cd4\u8cd5\u8cd6\u8cd7\u8cd8\u3562\u4773\u4774\u4775\u8cd9\u8cda\u8cdb\u8cdc\u8cdd\u8cde\u8cdf\u8ce0\u8ce1\u8ce2\u8ce3\u8ce4\u8ce5\u8ce6\u8ce7\u8ce8\u8ce9\u8cea\u8ceb\u8cec\u4776\u4777\u4778\u4779\u477a\u477b\u477c\u477d\u477e\u477f\u8ced\u8cee\u8cef\u8cf0\u8cf1\u8cf2\u8cf3\u8cf4\u8cf5\u4780\u4781\u4782\u4783\u4784\u8cf6\u8cf7\u8cf8\u8cf9\u8cfa\u8cfb\u8cfc\u8cfd\u4785\u4786\u8cfe\u8cff\u8d00\u8d02\u8d03\u8d04\u8d05\u4787\u8d06\u8d07\u8d08\u8d09\u8d0a\u8d0b\u8d0c\u4788\u8d0d\u8d0e\u8d0f\u4789\u8d10\u8d11\u8d12\u8d13\u8d14\u8d15\u8d16\u8d17\u8d18\u478a\u8d19\u8d1a\u478b\u8d1b\u8d1c\u8d1d\u8d1e\u8d1f\u8d20\u8d21\u8d22\u8d23\u8d24\u8d25\u8d26\u8d27\u8d28\u8d29\u8d2a\u8d2b\u8d2c\u8d2d\u8d2e\u8d2f\u8d30\u8d31\u8d32\u8d33\u8d34\u8d35\u8d36\u8d37\u8d38\u8d39\u8d3a\u8d3b\u8d3c\u8d3d\u8d3e\u8d3f\u8d40\u8d41\u8d42\u8d43\u8d44\u8d45\u8d46\u478c\u8d47\u8d48\u8d49\u8d4a\u8d4b\u8d4c\u8d4d\u8d4e\u8d4f\u8d50\u8d51\u8d52\u8d53\u8d54\u8d55\u478d\u478e\u8d56\u8d57\u478f\u4790\u8d58\u8d59\u8d5a\u8d5b\u8d5c\u8d5d\u8d5e\u8d5f\u8d60\u8d61\u8d62\u8d63\u8d64\u4791\u8d65\u8d66\u8d67\u8d68\u8d69\u8d6a\u4792\u8d6b\u4793\u4794\u8d6c\u8d6d\u8d6e\u8d6f\u4795\u8d70\u8d71\u8d72\u8d73\u8d74\u8d75\u9faa\u8d76\u8d77\u8d78\u4796\u4797\u4798\u8d79\u8d7a\u8d7b\u8d7c\u8d7d\u8d7e\u8d7f\ufa23\u4799\u479a\u479b\u479c\u8d80\u8d81\u8d82\u8d83\u8d84\u8d85\u8d86\u8d87\u8d88\u8d89\u8d8a\u8d8b\u479d\u479e\u479f\u47a0\u47a1\u47a2\u47a3\u47a4\u8d8c\u8d8d\u8d8e\u8d8f\u8d90\u8d91\u8d92\u8d93\u8d94\u47a5\u47a6\u47a7\u47a8\u47a9\u47aa\u8d95\u8d96\u8d97\u8d98\u8d99\u8d9a\u47ab\u47ac\u47ad\u47ae\u47af\u47b0\u47b1\u47b2\u8d9b\u8d9c\u8d9d\u8d9e\u8d9f\u8da0\u8da1\u8da2\u8da3\u8da4\u47b3\u47b4\u47b5\u47b6\u47b7\u47b8\u8da5\u8da6\u8da7\u47b9\u47ba\u47bb\u47bc\u8da8\u47bd\u47be\u47bf\u47c0\u47c1\u47c2\u47c3\u47c4\u47c5\u47c6\u8da9\u8daa\u8dab\u8dac\u8dad\u47c7\u8dae\u47c8\u47c9\u47ca\u47cb\u8daf\u8db0\u47cc\u47cd\u47ce\u47cf\u8db1\u47d0\u47d1\u47d2\u8db2\u8db3\u8db4\u47d3\u47d4\u8db5\u8db6\u8db7\u8db8\u47d5\u47d6\u8db9\u8dba\u8dbb\u8dbd\u8dbe\u8dbf\u8dc0\u8dc1\u8dc2\u8dc3\u8dc4\u47d7\u47d8\u47d9\u47da\u47db\u47dc\u47dd\u47de\u8dc5\u8dc6\u8dc7\u8dc8\u8dc9\u8dca\u8dcb\u8dcc\u8dcd\u8dce\u8dcf\u8dd0\u8dd1\u8dd2\u8dd3\u8dd4\u8dd5\u8dd6\u8dd7\u8dd8\u8dd9\u8dda\u8ddb\u8ddc\u8ddd\u8dde\u8df5\u47df\u47e0\u47e1\u47e2\u47e3\u47e4\u47e5\u47e6\u47e7\u47e8\u47e9\u47ea\u47eb\u47ec\u47ed\u8dbc\u8ddf\u8de0\u8de1\u8de2\u8de3\u8de4\u8de5\u8de6\u8de7\u8de8\u8de9\u8dea\u8deb\u8dec\u8ded\u8dee\u8def\u8df0\u8df1\u8df2\u8df3\u8df4\u8df6\u8df7\u8df8\u8df9\u8dfa\u8dfb\u47ee\u47ef\u47f0\u47f1\u47f2\u47f3\u8dfc\u8dfd\u8dfe\u8dff\u8e00\u8e01\u8e02\u8e03\u8e04\u8e05\u8e06\u8e07\u8e08\u8e09\u8e0a\u8e0b\u8e0c\u8e0d\u8e0e\u47f4\u47f5\u47f6\u47f7\u47f8\u47f9\u47fa\u47fb\u47fd\u8e0f\u8e10\u8e11\u8e12\u8e13\u8e14\u8e15\u8e16\u8e17\u8e18\u8e19\u8e1a\u8e1b\u8e1c\u8e1d\u8e1e\u8e1f\u8e20\u8e21\u8e22\u8e23\u8e24\u8e25\u8e26\u8e27\u8e28\u8e29\u8e2a\u8e2c\u8e2d\u8e2e\u8e2f\u8e3a\u47fc\u47fe\u47ff\u4800\u4801\u4802\u4803\u4804\u4805\u4806\u4807\u4808\u4809\u480a\u480b\u480c\u8e2b\u8e30\u8e31\u8e32\u8e33\u8e34\u8e35\u8e36\u8e37\u8e38\u8e39\u8e3b\u8e3c\u8e3d\u8e3e\u8e3f\u8e40\u8e41\u8e42\u8e43\u8e44\u8e45\u480d\u480e\u480f\u4810\u4811\u4812\u4813\u4814\u4815\u4816\u8e46\u8e47\u8e48\u8e49\u8e4a\u8e4b\u8e4c\u8e4d\u8e4e\u8e4f\u8e50\u8e51\u8e52\u8e53\u4817\u4818\u4819\u481a\u481b\u481c\u481d\u8e54\u8e55\u8e56\u8e57\u8e58\u8e59\u8e5a\u8e5b\u8e5c\u8e5d\u8e5e\u8e5f\u8e60\u8e61\u8e62\u8e63\u8e64\u8e65\u8e66\u8e67\u8e6e\u8e80\u481e\u481f\u4820\u4821\u4822\u8e68\u8e69\u8e6a\u8e6b\u8e6c\u8e6d\u8e6f\u8e70\u8e71\u8e72\u8e73\u8e74\u8e75\u8e76\u8e77\u8e78\u8e79\u8e7a\u8e7b\u8e7c\u8e7d\u8e7e\u8e7f\u4823\u4824\u4825\u4826\u4827\u8e81\u8e82\u8e83\u8e84\u8e85\u8e86\u8e87\u8e88\u8e89\u4828\u4829\u8e8a\u8e8b\u8e8c\u8e8d\u8e8e\u8e8f\u482a\u482b\u8e90\u8e91\u8e92\u8e93\u8e94\u8e95\u8e96\u482c\u8e97\u8e98\u8e99\u8e9a\u8e9b\u8e9c\u482d\u482e\u8e9d\u8e9e\u8e9f\u8ea0\u482f\u8ea1\u8ea2\u8ea3\u8ea4\u8ea5\u4830\u8ea6\u8ea7\u8ea9\u8eaa\u8ea8\u4831\u8eab\u8eac\u8ead\u8eae\u8eaf\u8eb0\u4832\u4833\u4834\u4835\u4836\u8eb1\u8eb2\u4837\u4838\u4839\u483a\u8eb3\u8eb4\u8eb5\u8eb6\u8eb7\u8eb8\u8eb9\u8eba\u8ebb\u8ebc\u483b\u8ebd\u8ebe\u483c\u8ebf\u483d\u483e\u8ec0\u8ec1\u8ec2\u8ec3\u8ec4\u8ec5\u483f\u8ec6\u4840\u8ec7\u4841\u8ec8\u8ec9\u8eca\u8ecb\u8ecc\u8ecd\u4842\u4843\u4844\u8ece\u8ecf\u8ed0\u8ed1\u8ed2\u8ed3\u8ed4\u8ed5\u4845\u8ed6\u8ed7\u8ed8\u8ed9\u8eda\u8edb\u8edc\u8edd\u8ede\u8edf\u8ee0\u8ee1\u8ee2\u8ee3\u4846\u4847\u4848\u4849\u484a\u484b\u484c\u484d\u484e\u8ee4\u8ee5\u8ee6\u8ee7\u8ee8\u8ee9\u8eea\u8eeb\u8eec\u8eee\u8eef\u8ef0\u8ef1\u8ef2\u8ef3\u8ef4\u8ef5\u8ef6\u8ef7\u8ef8\u8ef9\u8efa\u8efb\u8efc\u8efd\u9fab\u484f\u4850\u4851\u4852\u8eed\u8efe\u8eff\u8f00\u8f01\u8f02\u8f03\u8f04\u8f05\u8f06\u8f07\u8f08\u8f09\u8f0a\u8f0b\u8f0c\u4853\u4854\u4855\u4856\u4857\u8f0d\u8f0e\u8f0f\u8f10\u8f11\u8f12\u8f13\u8f14\u8f15\u4858\u4859\u485a\u485b\u8f16\u8f17\u8f18\u8f19\u8f1a\u8f1b\u8f1c\u8f1d\u8f1e\u8f1f\u8f20\u8f21\u8f22\u8f23\u8f24\u8f25\u8f26\u8f27\u8f28\u8f29\u8f2a\u8f2b\u8f2c\u485c\u485d\u485e\u485f\u8f2d\u8f2e\u8f2f\u8f30\u8f31\u8f32\u8f33\u8f34\u8f35\u8f36\u8f37\u8f38\u8f39\u8f3a\u8f3b\u8f3c\u4860\u4861\u4862\u4863\u4864\u8f3d\u8f3e\u8f3f\u8f40\u8f41\u8f42\u8f43\u8f44\u8f45\u4865\u4866\u4867\u4868\u4869\u486a\u8f46\u8f47\u8f48\u8f49\u8f4a\u8f4b\u8f4c\u9fc2\u486b\u486c\u486d\u486e\u486f\u4870\u4871\u8f4d\u8f4e\u8f4f\u8f50\u8f51\u8f52\u8f53\u8f54\u4872\u4873\u4874\u4875\u8f55\u8f56\u8f57\u8f58\u8f59\u8f5a\u4876\u8f5b\u8f5c\u8f5d\u8f5e\u8f5f\u4877\u4878\u4879\u8f60\u8f61\u8f62\u487a\u487b\u8f63\u8f64\u487c\u487d\u8f65\u487e\u487f\u8f66\u8f67\u8f68\u8f69\u8f6a\u8f6b\u4880\u8f6c\u8f6d\u8f6e\u8f6f\u8f70\u4881\u8f71\u8f72\u8f73\u8f74\u8f75\u8f76\u8f77\u8f78\u8f79\u8f7a\u8f7b\u4882\u8f7c\u8f7d\u8f7e\u8f7f\u8f80\u8f81\u8f82\u8f83\u8f84\u8f85\u8f86\u8f87\u8f88\u8f89\u8f8a\u8f8b\u8f8c\u8f8d\u8f8e\u8f8f\u8f90\u8f91\u8f92\u8f93\u8f94\u8f95\u8f96\u8f97\u8f98\u8f99\u8f9a\u8f9b\u8f9c\u8f9d\u8f9e\u8f9f\u8fa0\u8fa1\u8fa2\u8fa3\u8fa4\u4883\u8fa5\u8fa6\u8fa7\u8fa8\u8fa9\u8faa\u8fab\u8fac\u8fad\u8fae\u4884\u8faf\u8fb0\u8fb1\u8fb2\u4885\u4886\u8fb3\u4887\u8fb4\u4888\u4889\u8fb5\u8fb6\u8fb7\u8fb8\u8fb9\u8fba\u8fbb\u8fbc\u8fbd\u5de1\u8fbe\u8fbf\u8fc0\u8fc1\u8fc2\u8fc3\u8fc4\u8fc5\u8fc6\u8fc7\u8fc8\u8fc9\u488a\u488b\u8fca\u8fcb\u8fcc\u8fcd\u8fce\u8fcf\u8fd0\u8fd1\u8fd2\u8fd3\u8fd4\u8fd5\u8fd6\u8fd7\u8fd8\u8fd9\u8fda\u8fdb\u8fdc\u8fdd\u8fde\u8fdf\u8fec\ufa24\u488c\u488d\u488e\u488f\u8fe0\u8fe1\u8fe2\u8fe3\u8fe4\u8fe5\u8fe6\u8fe7\u8fe8\u8fe9\u8fea\u8feb\u8fed\u8fee\u8fef\u8ff0\u8ff1\u8ff2\u8ff3\u4890\u4891\u8ff4\u8ff5\u8ff6\u8ff7\u8ff8\u8ff9\u8ffa\u8ffb\u8ffc\u8ffd\u8ffe\u8fff\u9000\u9001\u9002\u9003\u9004\u9005\u9006\u9007\u9008\u9009\u900a\u4892\u4893\u4894\u4895\u4896\u4897\u4898\u900b\u900c\u900d\u900e\u900f\u9010\u9011\u9012\u9013\u9014\u9015\u9016\u9017\u9018\u9019\u901a\u901b\u901c\u901d\u901e\u901f\u9020\u9021\u9022\u9023\u9024\u9025\u9026\u9027\u4899\u489a\u489b\u9028\u9029\u902a\u902b\u902c\u902d\u902e\u902f\u9030\u9031\u9032\u9033\u9034\u9035\u9036\u9037\u9038\u9039\u903a\u903b\u489c\u489d\u489e\u489f\u48a0\u903c\u903d\u903e\u903f\u9040\u9041\u9042\u9043\u9044\u9045\u9046\u9047\u9048\u9049\u904a\u904b\u904c\u904d\u904e\u904f\u9050\u9051\u9052\u9053\u9054\u9055\u9056\u9057\u48a1\u9058\u9059\u905a\u905b\u905c\u905d\u905e\u905f\u9060\u9061\u9062\u9063\u9064\u9065\u48a2\u48a3\u48a4\u48a5\u9066\u9067\u9068\u9069\u906a\u906b\u906c\u906d\u906e\u906f\u9070\u9071\u9073\u48a6\u48a7\u48a8\u48a9\u9072\u9074\u9075\u9076\u9077\u9078\u9079\u907a\u907b\u907c\u9086\u48aa\u48ab\u48ac\u48ad\u907d\u907e\u907f\u9080\u9081\u9082\u9083\u9084\u9085\u9089\u48ae\u9087\u9088\u48af\u48b0\u908a\u908b\u908c\u48b1\u908d\u908e\u908f\u9090\u48b2\u9091\u9092\u9093\u48b3\u9094\u9095\u9096\u9097\u9098\u9099\u909a\u909b\u909c\u909d\u48b4\u909e\u909f\u90a0\u90a1\u90a2\u90a3\u90a4\u90a5\u90a6\u90a7\u90a8\u90a9\u90aa\u90ab\u90ac\u48b5\u48b6\u48b7\u90ad\u90ae\u90af\u90b0\u90b1\u90b2\u90b3\u90b4\u90b5\u90b6\u90b7\u90b8\u90b9\u90ba\u90bb\u48b8\u48b9\u48ba\u90bc\u90bd\u90be\u90bf\u90c0\u90c1\u90c2\u90c3\u90c4\u90c5\u90c6\u90c7\u90c8\u90c9\u90ca\u90cb\u90cc\u90cd\u90ce\u90cf\u90d0\u90d1\u90d3\u48bb\u48bc\u48bd\u48be\u48bf\u48c0\u48c1\u48c2\u90d2\u90d4\u90d5\u90d6\u90d7\u90d8\u90d9\u90da\u90db\u90dc\u90dd\u90de\u90df\u90e0\u90e1\u90e2\u90e3\u90e4\u90e5\u90e6\u90e7\u48c3\u48c4\u48c5\u48c6\u48c7\u48c8\u48c9\u90e8\u90e9\u90ea\u90eb\u90ec\u90ed\u90ee\u90ef\u90f0\u90f1\u90f2\u90f3\u90f4\u90f5\u90f6\u90f7\u90f8\u48ca\u48cb\u48cc\u48cd\u48ce\u48cf\u90f9\u90fa\u90fb\u90fc\u90fd\u90fe\u90ff\u9100\u9101\u9102\u9103\u9104\u9105\u9106\u9107\u9108\u9109\u910a\u48d0\u48d1\u48d2\u910b\u910c\u910d\u910e\u910f\u9110\u9111\u9112\u9113\u9114\u9115\u9116\u9117\u48d3\u48d4\u48d5\u48d6\u48d7\u9118\u9119\u911a\u911b\u911c\u911d\u911e\u911f\u9120\u9121\u9122\u9123\u9124\u9125\u48d8\u48d9\u48da\u48db\u48dc\u9126\u9127\u9128\u9129\u912a\u912b\u912c\u912d\u912e\u912f\u9130\u9131\u9132\u48dd\u48de\u48df\u48e0\u9133\u9134\u9135\u9136\u9137\u48e1\u9138\u9139\u48e2\u913a\u913b\u913c\u913d\u913e\u913f\u9140\u9142\u9141\u9143\u9144\u9145\u9146\u9147\u9148\u48e3\u48e4\u9149\u914a\u914b\u48e5\u48e6\u914c\u914d\u914e\u914f\u9150\u9151\u9152\u48e7\u48e8\u9153\u9154\u9155\u9156\u9157\u9158\u9159\u915a\u915b\u915c\u915d\u915e\u48e9\u48ea\u48eb\u48ec\u48ed\u915f\u9160\u9161\u9162\u9163\u9164\u9165\u48ee\u48ef\u48f0\u48f1\u48f2\u48f3\u9166\u9167\u9168\u9169\u916a\u916b\u916c\u916d\u916e\u916f\u9170\u9171\u48f4\u48f5\u48f6\u48f7\u48f8\u48f9\u9172\u9173\u9174\u9175\u9176\u9177\u9178\u9179\u917a\u917b\u917c\u917d\u917e\u917f\u48fa\u48fb\u9180\u9181\u9182\u9183\u9184\u9185\u9186\u9187\u9188\u9189\u918a\u918b\u918c\u48fc\u48fd\u48fe\u48ff\u918d\u918e\u918f\u9190\u9191\u9192\u9193\u9194\u9195\u9196\u9197\u4900\u4901\u4902\u4903\u4904\u4905\u4906\u4907\u4908\u9198\u9199\u919a\u919b\u919c\u919d\u919e\u919f\u91a0\u91a1\u91a2\u91a3\u91a4\u4909\u490a\u490b\u490c\u91a5\u91a6\u91a7\u91a8\u91a9\u91aa\u91ab\u91ac\u490d\u91ad\u91ae\u91af\u91b0\u91b1\u490e\u490f\u4910\u4911\u4912\u91b2\u91b3\u91b4\u91b5\u91b6\u91b7\u91b8\u91b9\u91ba\u91bb\u4913\u4914\u4915\u4916\u91bc\u91bd\u91be\u91bf\u91c0\u4917\u4918\u91c1\u91c2\u91c3\u91c4\u91c5\u4919\u91c6\u91c7\u91c8\u91c9\u91ca\u91cb\u91cc\u91cd\u91ce\u491a\u91cf\u91d0\u91d1\u91d2\u91d3\u91d4\u91d5\u91d6\u91d7\u91d8\u91d9\u91da\u91db\u91dc\u91dd\u91de\u91df\u91e0\u91e1\u91e2\u491b\u91e3\u91e4\u91e5\u91e6\u91e7\u91e8\u91e9\u91ea\u91eb\u91ec\u91ed\u91ee\u91ef\u91f0\u91f1\u91f2\u91f3\u91f4\u91f5\u91f6\u91f7\u91f8\u91f9\u91fa\u91fb\u91fc\u491c\u91fd\u91fe\u91ff\u9200\u9201\u9202\u9203\u9204\u9205\u9206\u9207\u9208\u9209\u920a\u920b\u920c\u920d\u920e\u920f\u9210\u9211\u9212\u9213\u9214\u9215\u9216\u9217\u9218\u9219\u921a\u921b\u921c\u921d\u921e\u921f\u9220\u9221\u9222\u9223\u9224\u9225\u9226\u9227\u9228\u9229\u922a\u922b\u922c\u491d\u491e\u491f\u4920\u922d\u922e\u922f\u9230\u9231\u9232\u9233\u9234\u9235\u9236\u9237\u9238\u9239\u923a\u923b\u923c\u923d\u923e\u923f\u9240\u9241\u9242\u9243\u9244\u9245\u9246\u9247\u9248\u9249\u924a\u924b\u924c\u924d\u924e\u924f\u9250\u9251\u9252\u9253\u9254\u9255\u9256\u9257\u9258\u9259\u925a\u925b\u925c\u925d\u925e\u925f\u9260\u9261\u9262\u9263\u9264\u9265\u9266\u9267\u9268\u9269\u926a\u926b\u926c\u926d\u926e\u926f\u9270\u9271\u9272\u9273\u9274\u928f\u9faf\u4921\u4922\u4923\u9275\u9276\u9277\u9278\u9279\u927a\u927b\u927d\u927e\u927f\u9280\u9281\u9282\u9283\u9284\u9285\u9286\u9287\u9288\u9289\u928a\u928b\u928c\u928d\u928e\u9290\u9291\u9292\u9293\u9294\u9295\u9296\u9297\u9298\u9299\u929a\u929b\u929c\u929d\u929e\u929f\u92a0\u92a1\u92a2\u92a3\u92a4\u92a5\u92a6\u92a7\u92a8\u92a9\u92aa\u92ab\u92ac\u92ad\u92ae\u92af\u92b0\u92b1\u4924\u4925\u4926\u4927\u4928\u4929\u492a\u92b2\u92b3\u92b4\u92b5\u92b6\u92b7\u92b8\u92b9\u92ba\u92bb\u92bc\u92bd\u92be\u92bf\u92c0\u92c1\u92c2\u92c3\u92c4\u92c5\u92c6\u92c7\u92c8\u92c9\u92ca\u92cb\u92cc\u92cd\u92ce\u92cf\u92d0\u92d1\u92d2\u92d3\u92d4\u92d5\u92d6\u92d7\u92d8\u92d9\u92da\u92db\u92dc\u92dd\u92de\u92df\u92e0\u92e1\u92e2\u92e3\u92e4\u92e5\u92e6\u92e7\u92e8\u92e9\u92ea\u92eb\u92ec\u92ed\u92ee\u92ef\u92f0\u92f1\u92f2\u92f3\u92f4\u92f5\u92f6\ufa27\u492b\u492c\u492d\u492e\u492f\u4930\u4931\u4932\u927c\u92f7\u92f8\u92f9\u92fa\u92fb\u92fc\u92fd\u92fe\u92ff\u9300\u9301\u9302\u9303\u9304\u9305\u9306\u9307\u9308\u9309\u930a\u930b\u930c\u930d\u930e\u930f\u9310\u9311\u9312\u9313\u9314\u9315\u9316\u9317\u9318\u9319\u931a\u931b\u931c\u931d\u931e\u931f\u9320\u9321\u9322\u9323\u9324\u9325\u9326\u9327\u9329\u932a\u932b\u932c\u932d\u932e\u932f\u9330\u9331\u9332\u9333\u9334\u9335\u9336\u9337\u9338\u9339\u933a\u933b\u933c\u933d\u933e\u933f\u9340\u9341\u9342\u9343\u9344\u9345\u9346\u9348\u9fac\ufa28\u4933\u4934\u4935\u4936\u9328\u9347\u9349\u934a\u934b\u934c\u934d\u934e\u934f\u9350\u9351\u9352\u9353\u9354\u9355\u9356\u9357\u9358\u9359\u935a\u935b\u935c\u935d\u935e\u935f\u9360\u9361\u9362\u9363\u9364\u9365\u9366\u9367\u9368\u9369\u936a\u936b\u936c\u936d\u936e\u936f\u9370\u9371\u9372\u9373\u9374\u9375\u9376\u9377\u9378\u9379\u937a\u937b\u937c\u937d\u937e\u937f\u9380\u9381\u9382\u9383\u9384\u9385\u9386\u9387\u4937\u4938\u4939\u493a\u493b\u493c\u9388\u9389\u938a\u938b\u938c\u938d\u938e\u938f\u9390\u9391\u9392\u9393\u9394\u9395\u9396\u9397\u9398\u9399\u939a\u939b\u939c\u939d\u939e\u939f\u93a0\u93a1\u93a2\u93a3\u93a4\u93a5\u93a6\u93a7\u93a8\u93aa\u93ab\u93ac\u93ad\u93ae\u93af\u93b0\u93b1\u93b2\u93b3\u93b4\u93b5\u93b6\u93b7\u93b8\u93b9\u93ba\u93bb\u93bc\u93bd\u93be\u93bf\u9fb2\u493d\u493e\u493f\u4940\u4941\u4942\u4943\u4944\u4945\u4946\u4947\u93a9\u93c0\u93c1\u93c2\u93c3\u93c4\u93c5\u93c6\u93c7\u93c8\u93c9\u93ca\u93cb\u93cc\u93cd\u93ce\u93cf\u93d0\u93d1\u93d2\u93d3\u93d4\u93d5\u93d6\u93d7\u93d8\u93d9\u93da\u93db\u93dc\u93dd\u93de\u93df\u93e0\u93e1\u93e2\u93e3\u93e4\u93e5\u93e6\u93e7\u93e8\u93e9\u93ea\u93eb\u93ec\u93ed\u93ee\u93ef\u93f0\u93f1\u93f2\u93f9\u4948\u4949\u494a\u494b\u494c\u494d\u494e\u494f\u4950\u4951\u4952\u4953\u93f3\u93f5\u93f6\u93f7\u93f8\u93fa\u93fb\u93fc\u93fd\u93fe\u93ff\u9400\u9401\u9402\u9403\u9404\u9405\u9406\u9407\u9408\u9409\u940a\u940b\u940c\u940d\u940e\u940f\u9410\u9411\u9412\u9413\u9414\u9415\u9416\u9417\u9418\u9419\u941a\u941b\u941c\u941d\u941e\u941f\u9420\u9421\u9422\u9423\u9424\u9425\u9426\u9427\u9428\u4954\u4955\u4956\u4957\u4958\u4959\u495a\u495b\u495c\u93f4\u9429\u942a\u942b\u942c\u942d\u942e\u942f\u9430\u9431\u9432\u9433\u9434\u9435\u9436\u9437\u9438\u9439\u943a\u943b\u943c\u943d\u943e\u943f\u9440\u9441\u495d\u495e\u495f\u4960\u4961\u4962\u4963\u4964\u4965\u4966\u9442\u9443\u9444\u9445\u9446\u9447\u9448\u9449\u944a\u944b\u944c\u944d\u944e\u944f\u9450\u9451\u9452\u9453\u9454\u9467\u4967\u4968\u4969\u496a\u496b\u496c\u496d\u496e\u9455\u9456\u9457\u9458\u9459\u945a\u945b\u945c\u945d\u945e\u945f\u9460\u9461\u9462\u9463\u9464\u9465\u9466\u496f\u4970\u4971\u4972\u4973\u4974\u9468\u9469\u946a\u946b\u946c\u4975\u4976\u4977\u946d\u946e\u946f\u9470\u9471\u9472\u9473\u4978\u9474\u9475\u9476\u9477\u9478\u9479\u947a\u947b\u947c\u947d\u947e\u947f\u9480\u9481\u9482\u9483\u9484\u4979\u9485\u9486\u9487\u9488\u9489\u948a\u948b\u948c\u948d\u948e\u948f\u9490\u9491\u9492\u9493\u9494\u9495\u9496\u9497\u9498\u9499\u949a\u949b\u949c\u949d\u949e\u949f\u94a0\u94a1\u94a2\u94a3\u94a4\u94a5\u94a6\u94a7\u94a8\u94a9\u94aa\u94ab\u94ac\u94ad\u94ae\u94af\u497a\u497b\u497c\u94b0\u94b1\u94b2\u94b3\u94b4\u94b5\u94b6\u94b7\u94b8\u94b9\u94ba\u94bb\u94bc\u94bd\u94be\u94bf\u94c0\u94c1\u94c2\u94c3\u94c4\u94c5\u94c6\u94c7\u94c8\u94c9\u94ca\u94cb\u94cc\u94cd\u94ce\u9fed\u497d\u497e\u497f\u94cf\u94d0\u94d1\u94d2\u94d3\u94d4\u94d5\u94d6\u94d7\u94d8\u94d9\u94da\u94db\u94dc\u94dd\u94de\u94df\u94e0\u94e1\u94e2\u94e3\u94e4\u94e5\u94e6\u94e7\u94e8\u94e9\u94ea\u94eb\u94ec\u94ed\u94ee\u94ef\u94f0\u94f1\u94f2\u94f3\u94f4\u94f5\u94f6\u94f7\u4980\u94f8\u94f9\u94fa\u94fb\u94fc\u94fd\u94fe\u94ff\u9500\u9501\u9502\u9503\u9504\u9505\u9506\u9507\u9508\u9509\u950a\u950b\u950c\u950d\u950e\u950f\u9510\u9511\u9512\u9513\u9514\u9515\u9fcf\u4981\u9516\u9517\u9518\u9519\u951a\u951b\u951c\u951d\u951e\u951f\u9520\u9521\u9522\u9523\u9524\u9525\u9526\u9527\u9528\u9529\u952a\u952b\u952c\u952d\u952e\u952f\u9530\u9531\u9532\u9533\u9534\u9535\u9536\u9537\u9538\u9539\u953a\u953b\u953c\u953d\u953e\u953f\u9540\u9541\u9542\u9543\u9544\u9545\u9546\u9547\u9548\u9549\u954a\u954b\u954c\u954d\u954e\u954f\u9550\u9551\u9552\u9553\u9554\u9555\u9fd4\u4982\u9556\u9557\u9558\u9559\u955a\u955b\u955c\u955d\u955e\u955f\u9560\u9561\u9562\u9563\u9564\u9565\u9566\u9567\u9568\u9569\u956a\u956b\u4983\u4984\u4985\u956c\u956d\u956e\u956f\u9570\u9571\u9572\u9573\u9574\u9575\u9576\u4986\u9577\u9578\u9579\u4987\u957a\u957b\u4988\u4989\u498a\u957c\u498b\u957d\u957e\u957f\u9580\u9581\u9582\u9583\u9584\u9585\u9586\u9587\u9588\u9589\u958a\u498c\u498d\u958b\u958c\u958d\u958e\u958f\u9590\u9591\u9592\u9593\u9594\u9595\u9596\u9597\u498e\u498f\u4990\u4991\u9598\u9599\u959a\u959b\u959c\u959d\u959e\u959f\u95a0\u4992\u4993\u4994\u95a1\u95a2\u95a3\u95a4\u95a5\u95a6\u95a7\u95a8\u95a9\u95aa\u4995\u4996\u4997\u4998\u4999\u499a\u499b\u95ab\u95ac\u95ad\u95ae\u95af\u95b0\u95b1\u95b2\u95b3\u95b4\u499c\u499d\u499e\u499f\u95b5\u95b6\u95b8\u95b9\u95ba\u95bb\u95bc\u95bd\u95be\u95bf\u95c0\u95c1\u95c2\u49a0\u49a1\u49a2\u49a3\u49a4\u49a5\u49a6\u49a7\u49a8\u95b7\u95c3\u95c4\u95c5\u95c6\u95c7\u95c8\u95c9\u95ca\u95cb\u95cc\u95cd\u95ce\u95cf\u49a9\u49aa\u49ab\u49ac\u49ad\u49ae\u49af\u95d0\u95d1\u95d2\u95d3\u95d4\u95d5\u95d6\u95d7\u95d8\u95d9\u95da\u95db\u95dc\u95dd\u49b0\u95de\u95df\u95e0\u95e1\u49b1\u95e2\u95e3\u95e4\u95e5\u95e6\u49b2\u49b3\u49b4\u95e7\u49b5\u95e8\u95e9\u95ea\u95eb\u95ec\u95ed\u95ee\u95ef\u95f0\u95f1\u95f2\u95f3\u95f4\u95f5\u95f6\u95f7\u95f8\u95f9\u95fa\u95fb\u95fc\u95fd\u95fe\u95ff\u9600\u9601\u9602\u49b6\u9603\u9604\u9605\u9606\u49b7\u9607\u9608\u9609\u960a\u960b\u960c\u960d\u960e\u960f\u9610\u9611\u9612\u9613\u9614\u9615\u49b8\u9616\u9617\u9618\u9619\u961a\u961b\u961c\u961d\u961e\u961f\u49b9\u49ba\u9620\u9621\u9622\u9623\u9624\u49bb\u9625\u9626\u9627\u9628\u9629\u962a\u962b\u962c\u962d\u962e\u962f\u9630\u9631\u9632\u9633\u9634\u9635\u9636\u49bc\u49bd\u49be\u49bf\u49c0\u9637\u9638\u9639\u963a\u963b\u963c\u963d\u963e\u963f\u9640\u9641\u9642\u9643\u9644\u9645\u9646\u9647\u9648\u9649\u49c1\u49c2\u49c3\u964a\u964b\u964c\u964d\u964e\u964f\u9650\u9651\u9652\u9653\u9654\u9655\u49c4\u49c5\u49c6\u49c7\u49c8\u9656\u9657\u9658\u9659\u965b\u965c\u965d\u965e\u965f\u9660\u9661\u9662\u9663\u9664\u9665\u9666\u9667\u9668\u9669\u49c9\u49ca\u49cb\u49cc\u49cd\u49ce\u49cf\u965a\u966a\u966b\u966c\u966d\u966e\u966f\u9670\u9671\u9672\u9673\u9674\u9675\u9676\u9677\u9678\u9679\u967a\u49d0\u49d1\u49d2\u49d3\u49d4\u49d5\u49d6\u967b\u967c\u967d\u967e\u967f\u9680\u9681\u9682\u9683\u9684\u9685\u9686\u9687\u9688\u9689\u968a\u968b\u968c\u968d\u968e\u968f\u9690\u49d7\u49d8\u49d9\u9691\u9692\u9693\u9694\u9695\u9696\u9697\u9698\u9699\ufa29\u49da\u49db\u49dc\u49dd\u49de\u49df\u969a\u969b\u969c\u969d\u969e\u969f\u96a0\u96a1\u49e0\u49e1\u49e2\u49e3\u96a2\u96a3\u96a4\u96a5\u49e4\u49e5\u49e6\u49e9\u96a6\u96a7\u96a8\u96a9\u96aa\u96ab\u49e7\u49e8\u49ea\u96ac\u96ad\u96ae\u96af\u96b0\u96b1\u96b2\u49eb\u49ec\u49ed\u96b3\u96b4\u49ee\u96b5\u49ef\u49f0\u9fe7\u96b6\u96b7\u96b8\u96b9\u96ba\u96bb\u96bc\u96bd\u96be\u49f1\u96bf\u96c0\u49f2\u49f3\u96c1\u96c2\u96c3\u96c4\u96c5\u96c6\u96c7\u96c8\u49f4\u49f5\u49f6\u96c9\u96ca\u96cb\u96cc\u96cd\u96ce\u96cf\u49f7\u49f8\u49f9\u49fa\u96d0\u96d1\u96d2\u49fb\u96d3\u49fc\u49fd\u96d4\u96d5\u49fe\u49ff\u96d6\u4a01\u4a02\u96d7\u96d8\u96d9\u96da\u96db\u96dc\u96dd\u96de\u96df\u96e0\u4a03\u96e1\u96e2\u96e3\u4a04\u4a05\u4a06\u4a07\u96e4\u4a08\u96e5\u96e6\u4a09\u96e7\u4a0a\u96e8\u96e9\u96ea\u96eb\u4a0b\u96ec\u96ed\u96ee\u96ef\u96f0\u96f1\u96f2\u96f3\u4a0c\u4a0d\u96f4\u96f5\u96f6\u96f7\u96f8\u96f9\u96fa\u96fb\u96fc\u96fd\u96fe\u4a0e\u96ff\u9700\u9701\u4a0f\u4a10\u4a11\u4a12\u4a13\u4a14\u4a15\u4a16\u9702\u9703\u9704\u9705\u9706\u9707\u9708\u9709\u970a\u4a17\u4a18\u4a19\u970b\u970c\u970d\u970e\u970f\u9710\u9711\u9712\u9713\u9714\u9715\u9716\u9717\u4a1a\u4a1b\u4a1c\u4a1d\u9718\u9719\u971a\u971b\u971c\u971d\u971e\u971f\u9720\u4a1e\u4a1f\u4a20\u4a21\u4a22\u4a23\u4a24\u9721\u9722\u9723\u9724\u9725\u4a25\u4a26\u4a27\u4a28\u4a29\u4a2a\u9726\u9727\u9728\u9729\u972a\u972b\u972c\u972d\u4a2b\u4a2c\u4a2d\u4a2e\u4a2f\u972e\u972f\u9730\u9731\u9732\u9733\u9734\u4a30\u4a31\u9735\u9736\u9737\u9738\u9739\u973a\u973b\u973c\u973d\u973e\u973f\u9740\u4a32\u4a33\u4a34\u9741\u4a35\u4a36\u9742\u9743\u9744\u9745\u9746\u9747\u9748\u4a37\u9749\u4a38\u974a\u974b\u974c\u974d\u974e\u9fe8\u4a39\u974f\u4a3a\u9750\u4a3b\u9751\u9752\u9753\u9754\u9755\u9756\u9757\u9758\u9759\u975a\u975b\u975c\u975d\u4a3c\u975e\u4a3d\u4a3e\u975f\u4a3f\u9760\u4a40\u9761\u4a41\u9762\u9763\u4a42\u4a43\u4a44\u9764\u4a45\u4a46\u4a47\u9765\u9766\u4a48\u4a49\u4a4a\u4a4b\u9767\u4a4c\u4a4d\u4a4e\u9768\u4a4f\u9769\u976a\u976b\u976c\u976d\u976e\u976f\u9770\u9771\u4a50\u4a51\u4a52\u9772\u9773\u9774\u9775\u9776\u9777\u9778\u9779\u4a53\u4a54\u4a55\u4a56\u4a57\u4a58\u977a\u977b\u977c\u977d\u977e\u977f\u9780\u9781\u9782\u9783\u9784\u9785\u9786\u4a59\u4a5a\u4a5b\u4a5c\u4a5d\u4a5e\u9787\u9788\u9789\u978a\u978b\u978c\u978d\u978e\u978f\u9790\u9791\u9792\u4a5f\u9793\u9794\u9795\u9796\u9797\u9798\u9799\u4a60\u4a61\u4a62\u4a63\u4a64\u4a65\u4a66\u4a67\u979a\u979b\u979c\u979d\u979e\u979f\u97a0\u97a1\u4a68\u4a69\u4a6a\u4a6b\u4a6c\u4a6d\u4a6e\u97a2\u97a3\u97a4\u97a5\u97a6\u97a7\u97a8\u97a9\u97aa\u97ab\u97ac\u97ad\u97ae\u97af\u97b0\u4a6f\u4a70\u4a71\u4a72\u4a73\u4a74\u4a75\u97b1\u97b2\u97b3\u97b4\u97b5\u97b6\u97b7\u4a76\u4a77\u4a78\u4a79\u4a7a\u4a7b\u97b8\u97b9\u97ba\u97bb\u4a7c\u4a7d\u4a7e\u97bc\u97bd\u97be\u97bf\u4a7f\u4a80\u4a81\u4a82\u4a83\u4a84\u97c0\u97c1\u97c2\u97c3\u4a85\u4a86\u97c4\u97c5\u4a87\u4a88\u97c6\u97c7\u97c8\u4a89\u4a8a\u4a8b\u97c9\u4a8c\u4a8d\u4a8e\u97ca\u97cb\u97cc\u4a8f\u97cd\u97ce\u4a90\u4a91\u4a92\u4a93\u97cf\u97d0\u97d1\u97d2\u4a94\u97d3\u97d4\u97d5\u4a95\u97d6\u97d7\u97d8\u97d9\u97da\u4a96\u4a97\u4a98\u97dc\u97dd\u97de\u97df\u4a99\u4a9a\u97db\u97e0\u97e1\u97e2\u4a9b\u97e3\u4a9c\u4a9d\u97e4\u97e5\u97e6\u97e7\u97e8\u97e9\u97ea\u97eb\u97ec\u97ed\u97ee\u4a9e\u97ef\u4a9f\u97f0\u97f1\u4aa0\u97f2\u4aa1\u4aa2\u4aa3\u4aa4\u4aa5\u97f3\u7adf\u7ae0\u4aa6\u4aa7\u4aa8\u97f4\u97f5\u4aa9\u97f6\u97f7\u4aaa\u97f8\u4aab\u4aac\u97f9\u97fa\u4aad\u97fb\u97fc\u4aae\u4aaf\u97fd\u97fe\u97ff\u4ab0\u9800\u9801\u9802\u9803\u9804\u9805\u9806\u9807\u9808\u9809\u4ab1\u4ab2\u980a\u980b\u980c\u980d\u980e\u980f\u9810\u9811\u9812\u9813\u9819\u4ab3\u4ab4\u4ab5\u9814\u9815\u9816\u9817\u9818\u981a\u4ab6\u4ab7\u4ab8\u4ab9\u4aba\u4abb\u4abc\u4abd\u4abe\u981b\u981c\u981d\u981e\u981f\u9820\u9821\u9822\u9823\u9826\u9827\u9828\u9829\u982a\u982b\u982c\u4abf\u4ac0\u4ac1\u4ac2\u9824\u9825\u982d\u982e\u982f\u9830\u9831\u9832\u9833\u9834\u9835\u9836\u9837\u9838\u9839\u983a\u983b\u983c\u983d\u4ac3\u4ac4\u4ac5\u4ac6\u4ac7\u4ac8\u4ac9\u4aca\u983f\u9840\u9841\u9842\u9843\u9844\u9845\u9846\u9847\u9848\u9849\u984a\u4acb\u4acc\u4acd\u4ace\u4acf\u4ad0\u4ad1\u4ad2\u4ad3\u983e\u984b\u984c\u984d\u984e\u984f\u9850\u9851\u9852\u9853\u9854\u9855\u4ad4\u4ad5\u4ad6\u4ad7\u4ad8\u4ad9\u4ada\u4adb\u4adc\u4add\u9856\u9857\u9858\u9859\u985a\u985b\u985c\u985d\u985e\u4ade\u4adf\u4ae0\u4ae1\u4ae2\u4ae3\u4ae4\u4ae5\u4ae6\u4ae7\u985f\u9860\u9861\u9862\u9863\u4ae8\u4ae9\u4aea\u4aeb\u9864\u9865\u9866\u9867\u9868\u4aec\u4aed\u4aee\u4aef\u4af0\u4af1\u9869\u986a\u986b\u4af2\u4af3\u4af4\u986c\u986d\u986e\u986f\u9870\u4af5\u4af6\u9871\u9872\u4af7\u9873\u9874\u9875\u9876\u9877\u9878\u9879\u987a\u987b\u987c\u987d\u987e\u987f\u9880\u9881\u9882\u9883\u9884\u9885\u9886\u9887\u9888\u9889\u988a\u988b\u988c\u988d\u988e\u988f\u9890\u9891\u9892\u9893\u9894\u9895\u9896\u9897\u9898\u9899\u989a\u989b\u989c\u989d\u989e\u989f\u98a0\u98a1\u98a2\u98a3\u98a4\u98a5\u98a6\u98a7\u98a8\u4af8\u98a9\u98aa\u4af9\u98ab\u98ac\u4afa\u4afb\u4afc\u4afd\u98ad\u98ae\u98af\u98b0\u98b1\u4afe\u4aff\u4b00\u4b01\u4b02\u4b03\u98b2\u98b3\u4b04\u4b05\u98b4\u98b5\u4b06\u4b07\u4b08\u4b09\u4b0a\u98b6\u98b7\u4b0b\u4b0c\u4b0d\u4b0e\u4b0f\u4b10\u98b8\u98b9\u98ba\u4b11\u4b12\u4b13\u4b14\u4b15\u4b16\u4b17\u98bb\u98bc\u98bd\u98be\u98bf\u98c0\u4b18\u4b19\u4b1a\u98c1\u98c2\u98c3\u98c4\u4b1b\u4b1c\u98c5\u98c6\u98c7\u98c8\u98c9\u98ca\u4b1d\u98cb\u4b1e\u4b1f\u98cc\u98cd\u98ce\u98cf\u98d0\u98d1\u98d2\u98d3\u98d4\u98d6\u98d5\u98d7\u98d8\u98d9\u98da\u98db\u4b20\u4b21\u98dc\u98dd\u98de\u98df\u98e0\u98e1\u98e2\u98e3\u98e4\u4b22\u4dbf\u98e5\u98e6\u98e7\u98e8\u4b23\u4b24\u4b25\u98e9\u98ea\u98eb\u98ec\u98ed\u98ee\u98ef\u98f0\u98f1\u98f2\u4b26\u4b27\u4b28\u4b29\u4b2a\u98f3\u98f4\u98f5\u98f6\u98f7\u98f8\u98f9\u98fb\u98fc\u98fd\u98fe\u98ff\u4b2b\u4b2c\u4b2d\u4b2e\u4b2f\u4b30\u4b31\u4b32\u4b33\u4b34\u98fa\u9900\u9901\u9902\u9903\u9904\u9905\u9906\u9907\u9908\u9909\u990a\u990b\u990c\u990d\u990e\u990f\u4b35\u4b36\u4b37\u4b38\u4b39\u4b3a\u4b3b\u9910\u9911\u9912\u9913\u9914\u9915\u9916\u9917\u9918\u9919\u991d\u4b3c\u4b3d\u4b3e\u4b3f\u4b40\u4b41\u4b42\u991a\u991b\u991c\u991e\u991f\u9920\u9921\u9922\u9923\u9924\u9925\u9926\u9927\u9928\u9929\u4b43\u4b44\u4b45\u4b46\u4b47\u992a\u992b\u992c\u992d\u992e\u992f\u9930\u9931\u9932\u9933\u9934\u9935\u9937\u4b48\u4b49\u4b4a\u4b4b\u4b4c\u4b4d\u4b4e\u4b4f\u9936\u9938\u9939\u993a\u993b\u993c\u993d\u993e\u993f\u9940\u9941\u9942\u9943\u4b50\u4b51\u4b52\u4b53\u4b54\u9944\u9945\u9946\u9947\u9948\u9949\u4b55\u4b56\u4b57\u994a\u994b\u994c\u994d\u994e\u994f\u9950\u9951\u9952\u9953\u4b58\u4b59\u4b5a\u4b5b\u4b5c\u9954\u9955\u9956\u9957\u9958\u9959\u4b5d\u4b5e\u4b5f\u4b60\u995a\u995b\u995c\u4275\u4b61\u4b62\u4b63\u4b64\u4b65\u995d\u995e\u995f\u4b66\u4b67\u4b68\u9960\u9961\u4b69\u9962\u9963\u9964\u9965\u9966\u9967\u9968\u9969\u996a\u996b\u996c\u996d\u996e\u996f\u9970\u9971\u9972\u9973\u9974\u9975\u9976\u9977\u9978\u9979\u997a\u997b\u997c\u997d\u997e\u997f\u9980\u9981\u9982\u9983\u9984\u9985\u9986\u9987\u9988\u998a\u998b\u9989\u998c\u998d\u998e\u998f\u9990\u9991\u9992\u9993\u9994\u4b6a\u9995\u9996\u9997\u4b6b\u4b6c\u9998\u4b6d\u4b6e\u9999\u999a\u999b\u999c\u999d\u4b6f\u999e\u999f\u99a0\u99a1\u99a2\u99a3\u4b70\u4b71\u4b72\u99a4\u99a5\u99a6\u99a7\u99a8\u99a9\u99aa\u99ab\u4b73\u99ac\u99ad\u99ae\u4b74\u99af\u99b0\u99b1\u99b2\u99b3\u99b4\u99b5\u4b75\u4b76\u99b6\u99b7\u99b8\u99b9\u99ba\u99bb\u99bc\u99bd\u99be\u99bf\u99c0\u99c1\u99c2\u99c3\u99c4\u99c5\u99c6\u99c7\u4b77\u4b78\u4b79\u4b7a\u4b7b\u4b7c\u4b7d\u4b7e\u99c8\u99c9\u99ca\u99cb\u99cc\u99cd\u99ce\u99cf\u99d0\u99d1\u99d2\u99d3\u99d4\u99d5\u99d6\u99d7\u99d8\u99d9\u99da\u99db\u99dc\u99dd\u99de\u99df\u99e0\u4b7f\u4b80\u4b81\u4b82\u4b83\u4b84\u4b85\u99e1\u99e2\u99e3\u99e4\u99e5\u99e6\u99e7\u99e8\u99e9\u99ea\u99eb\u99ec\u99ed\u99ee\u99ef\u99f0\u99f1\u99f2\u4b86\u4b87\u4b88\u4b89\u4b8a\u4b8b\u4b8c\u4b8d\u99f4\u99f5\u99f6\u99f7\u99f8\u99f9\u99fa\u99fb\u99fc\u99fd\u99fe\u99ff\u9a00\u9a01\u9a02\u9a03\u4b8e\u4b8f\u4b90\u4b91\u4b92\u99f3\u9a04\u9a05\u9a06\u9a07\u9a08\u9a09\u9a0a\u9a0b\u9a0c\u9a0d\u9a0e\u9a0f\u9a10\u9a11\u9a12\u9a13\u4b93\u4b94\u4b95\u4b96\u4b97\u4b98\u4b99\u4b9a\u4b9b\u9a14\u9a15\u9a16\u9a17\u9a18\u9a19\u9a1a\u9a1b\u9a1c\u9a1d\u9a1e\u9a1f\u9a20\u9a21\u9a22\u9a23\u9a24\u9a25\u9a26\u9a27\u9a28\u4b9c\u4b9d\u4b9e\u4b9f\u4ba0\u4ba1\u4ba2\u9a29\u9a2a\u9a2b\u9a2c\u9a2d\u9a2e\u9a2f\u9a30\u9a31\u9a32\u9a33\u9a34\u9a35\u9a36\u9a37\u9a38\u4ba3\u4ba4\u4ba5\u4ba6\u4ba7\u4ba8\u4ba9\u9a39\u9a3a\u9a3b\u9a3c\u9a3d\u9a3e\u9a3f\u9a40\u9a41\u9a42\u9a43\u9a44\u9a45\u9a46\u9a47\u9fad\u4baa\u4bab\u4bac\u4bad\u4bae\u4baf\u4bb0\u4bb1\u9a48\u9a49\u9a4a\u9a4b\u9a4c\u9a4d\u9a4e\u9a4f\u9a50\u9a51\u9a52\u9a53\u9a54\u9a55\u4bb2\u4bb3\u4bb4\u4bb5\u4bb6\u9a56\u9a57\u9a58\u9a59\u9a5a\u9a5b\u9a5c\u4bb7\u4bb8\u4bb9\u9a5d\u9a5e\u9a5f\u4bba\u4bbb\u4bbc\u4bbd\u9a60\u9a61\u9a62\u9a63\u4bbe\u9a64\u9a65\u9a66\u9a67\u9fae\u4bbf\u9a68\u9a69\u4bc0\u9a6a\u4bc1\u9a6b\u4bc2\u9a6c\u9a6d\u9a6e\u9a6f\u9a70\u9a71\u9a72\u9a73\u9a74\u9a75\u9a76\u9a77\u9a78\u9a79\u9a7a\u9a7b\u9a7c\u9a7d\u9a7e\u9a7f\u9a80\u9a81\u9a82\u9a83\u9a84\u9a85\u9a86\u9a87\u9a88\u9a89\u4bc3\u9a8a\u9a8b\u9a8c\u9a8d\u9a8e\u9a8f\u4bc4\u9a90\u9a91\u9a92\u9a93\u9a94\u9a95\u9a96\u9a97\u9a98\u9a99\u9a9a\u9a9b\u9a9c\u9a9d\u9a9e\u9a9f\u4bc5\u9aa0\u9aa1\u9aa2\u9aa3\u9aa4\u9aa5\u9aa6\u9aa7\u9aa8\u4bc6\u9aa9\u4bc7\u9aaa\u9aab\u9aac\u9aad\u9aae\u9aaf\u9ab0\u9ab1\u4bc8\u4bc9\u9ab2\u9ab3\u9ab4\u9ab5\u9ab6\u9ab7\u4bca\u4bcb\u4bcc\u4bcd\u4bce\u9ab8\u9ab9\u9aba\u9abb\u9abc\u4bcf\u4bd0\u4bd1\u4bd2\u4bd3\u4bd4\u9abd\u9abe\u4bd5\u4bd6\u4bd7\u4bd8\u4bd9\u4bda\u9abf\u9ac0\u9ac1\u4bdb\u4bdc\u9ac2\u9ac3\u9ac4\u9ac5\u4bdd\u4bde\u4bdf\u4be0\u9ac6\u9ac7\u9ac8\u9ac9\u9aca\u9acb\u9acc\u4be1\u9acd\u9ace\u9acf\u4be2\u9ad0\u4be3\u9ad1\u9ad2\u9ad3\u9ad4\u4be4\u9ad5\u4be5\u9ad6\u4be6\u9ad7\u9ad8\u9ad9\u4be7\u4be8\u9ada\u4be9\u9adb\u9adc\u4bea\u9add\u4beb\u9ade\u4bec\u9adf\u9ae0\u4bed\u4bee\u9ae1\u9ae2\u9ae3\u9ae4\u9ae5\u9ae6\u9ae7\u9ae8\u9ae9\u9aea\u4bef\u4bf0\u4bf1\u4bf2\u4bf3\u4bf4\u9aeb\u9aec\u9aed\u9aee\u9aef\u9af0\u9af1\u9af2\u9af3\u9af4\u4bf5\u4bf6\u9af5\u9af6\u9af7\u9af8\u9af9\u9afa\u9afb\u9b07\u4bf7\u4bf8\u9afc\u9afd\u9afe\u9aff\u9b00\u9b01\u9b02\u4bf9\u4bfa\u4bfb\u4bfc\u9b03\u9b04\u9b05\u9b06\u9b08\u4bfd\u4bfe\u4bff\u4c00\u4c01\u4c02\u4c03\u9b09\u9b0a\u9b0b\u9b0c\u9b0d\u9b0e\u9b0f\u4c04\u4c05\u4c06\u4c07\u9b10\u9b11\u9b12\u9b13\u4c08\u4c09\u4c0a\u4c0b\u9b14\u9b15\u9b16\u9b17\u9b18\u9b1d\u4c0c\u4c0d\u9b19\u9b1a\u9b1b\u9b1c\u4c0e\u9b1e\u9b1f\u9b20\u9b21\u9b22\u4c0f\u4c10\u4c11\u4c12\u9b23\u4c13\u4c14\u4c15\u9b24\u4c16\u9b25\u9b26\u9b27\u9b28\u9b29\u9b2a\u4c17\u4c18\u9b2b\u9b2c\u9b2d\u9b2e\u9b2f\u9b30\u9b31\u9b32\u4c19\u4c1a\u4c1b\u9b33\u4c1c\u9b34\u9b35\u9b36\u9b37\u9b38\u9b39\u9b3a\u9b3b\u4c1d\u4c1e\u9b3c\u9b3d\u9b3e\u9b3f\u9b40\u9b41\u9b42\u4c1f\u9b43\u9b44\u9b45\u9b46\u4c20\u4c21\u9b47\u4c22\u4c23\u9b48\u9b49\u9b4a\u9b4b\u9b4c\u9b4d\u9b4e\u9b4f\u4c24\u4c25\u4c26\u4c27\u4c28\u4c29\u9b50\u4c2a\u9b51\u9b52\u9b53\u9b54\u9b55\u9b56\u4c2b\u4c2c\u4c2d\u4c2e\u9b57\u9b58\u9b59\u4c2f\u4c30\u4c31\u9b5a\u4c32\u9b5b\u9b5c\u9b5d\u9b5e\u4c33\u9b5f\u9b60\u9b61\u9b62\u4c34\u4c35\u4c36\u9b63\u9b64\u9b65\u9b66\u9b67\u9b68\u9b69\u9b6a\u9b6b\u9b6c\u9b6d\u9b6e\u9b6f\u9b70\u9b71\u9b72\u9b73\u9b74\u9b75\u9b76\u9b77\u9b78\u9b79\u4c37\u4c38\u4c39\u4c3a\u4c3b\u4c3c\u4c3d\u4c3e\u9b7a\u9b7b\u9b7c\u9b7d\u9b7e\u9b7f\u9b80\u9b81\u9b82\u9b83\u9b84\u9b85\u9b86\u9b87\u9b88\u9b89\u9b8a\u9b8b\u9b8c\u9b8d\u9b8e\u9b8f\u9b90\u9b91\u9b92\u9b93\u9b94\u9b95\u9b96\u9b97\u9b98\u9ba3\u4c3f\u4c40\u4c41\u4c42\u4c43\u4c44\u4c45\u4c46\u4c47\u4c48\u4c49\u9b99\u9b9a\u9b9b\u9b9c\u9b9d\u9b9e\u9b9f\u9ba0\u9ba1\u9ba2\u9ba4\u9ba5\u9ba6\u9ba7\u9ba8\u9ba9\u9baa\u9bab\u9bac\u9bad\u9bae\u9baf\u9bb0\u9bb1\u9bb2\u9bb3\u9bb4\u9bba\u4c4a\u4c4b\u4c4c\u4c4d\u4c4e\u9bb5\u9bb6\u9bb7\u9bb8\u9bb9\u9bbb\u9bbc\u9bbd\u9bbe\u9bbf\u9bc0\u9bc1\u9bc2\u9bc3\u9bc4\u9bc5\u9bc6\u9bc7\u9bc8\u9bc9\u9bca\u9bcb\u9bcc\u9bcd\u9bce\u9bcf\u9bd0\u9bd1\u9bd2\u9bd3\u9bfd\u4c4f\u4c50\u4c51\u4c52\u4c53\u4c54\u4c55\u4c56\u4c57\u4c58\u9bd4\u9bd5\u9bd6\u9bd7\u9bd8\u9bd9\u9bda\u9bdb\u9bdc\u9bdd\u9bde\u9bdf\u9be0\u9be1\u9be2\u9be3\u9be4\u9be5\u9be6\u9be7\u9be8\u9be9\u9bea\u9beb\u9bec\u9bed\u9bee\u9bef\u9bf0\u9bf1\u9bf2\u9bf3\u9bf4\u9bf5\u9bfb\u4c59\u4c5a\u4c5b\u4c5c\u4c5d\u4c5e\u4c5f\u4c60\u4c61\u4c62\u4c63\u4c64\u4c65\u4c66\u4c67\u4c68\u4c69\u4c6a\u9bf6\u9bf7\u9bf8\u9bf9\u9bfa\u9bfc\u9bfe\u9bff\u9c00\u9c01\u9c02\u9c03\u9c04\u9c05\u9c06\u9c07\u9c08\u9c09\u9c0a\u9c0b\u9c0c\u9c0d\u9c0e\u9c0f\u9c10\u9c11\u9c12\u9c13\u9c14\u9c15\u9c16\u9c17\u9c18\u9c19\u9c1a\u9c1b\u9c20\u4c6b\u4c6c\u4c6d\u4c6e\u4c6f\u4c70\u4c71\u4c72\u4c73\u4c74\u9c1c\u9c1d\u9c1e\u9c1f\u9c21\u9c22\u9c23\u9c24\u9c25\u9c26\u9c27\u9c28\u9c29\u9c2a\u9c2b\u9c2c\u9c2d\u9c2e\u9c2f\u9c30\u9fd0\u4c75\u4c76\u4c77\u4c78\u4c79\u4c7a\u4c7b\u4c7c\u4c7d\u9c31\u9c32\u9c33\u9c34\u9c35\u9c36\u9c37\u9c38\u9c39\u9c3a\u9c3b\u9c3c\u9c3d\u9c3e\u9c3f\u9c40\u9c41\u9c42\u9c43\u9c44\u9c45\u9c46\u9c47\u9c48\u9de0\u9ff3\u4c7e\u4c7f\u4c80\u4c81\u4c82\u4c83\u4c84\u4c85\u4c86\u4c87\u4c88\u9c49\u9c4a\u9c4b\u9c4c\u9c4d\u9c4e\u9c4f\u9c50\u9c51\u9c52\u9c53\u9c54\u9c55\u9c56\u9c57\u9c58\u9c59\u9c5a\u9c5b\u4c89\u4c8a\u4c8b\u4c8c\u4c8d\u4c8e\u4c8f\u9c5c\u9c5d\u9c5e\u9c5f\u9c60\u9c61\u9c62\u9c63\u9c64\u9c65\u9c66\u9c67\u9c69\u9c6a\u9c6b\u4c90\u4c91\u4c92\u4c93\u4c94\u4c95\u9c68\u9c6c\u9c6d\u9c6e\u9c6f\u9c70\u4c96\u4c97\u4c98\u9c71\u9c72\u9c73\u9c74\u9c75\u9c76\u4c99\u9c77\u9c78\u4c9a\u4c9b\u9c79\u9fe9\u9c7a\u9c7b\u4c9c\u9c7c\u9c7d\u9c7e\u9c7f\u9c80\u9c81\u9c82\u9c83\u9fd5\u4c9d\u9c84\u9c85\u9c86\u9c87\u9c88\u9c89\u9c8a\u9c8b\u9c8c\u9c8d\u9c8e\u9c8f\u9c90\u9ff4\u4c9e\u4c9f\u9c91\u9c92\u9c93\u9c94\u9c95\u9c96\u9c97\u9c98\u9c99\u9c9a\u9c9b\u9c9c\u9c9d\u9c9e\u9c9f\u9ca0\u9ca1\u9ca2\u9ca3\u9ca4\u9ca5\u9ca6\u9ca7\u9ca8\u9ca9\u9caa\u9cab\u9cac\u9ff5\u9ff6\u9cad\u9cae\u9caf\u9cb0\u9cb1\u9cb2\u9cb3\u9cb4\u9cb5\u9cb6\u9cb7\u9cb8\u9cb9\u9cba\u9cbb\u9cbc\u9cbd\u9cbf\u9cc0\u9cc1\u9cc2\u9cc3\u9cc4\u9cc5\u9cc6\u9cc7\u9cc8\u9cc9\u9cca\u9ccb\u9ff7\u4ca0\u4ca1\u9cbe\u9ccc\u9ccd\u9cce\u9ccf\u9cd0\u9cd1\u9cd2\u4ca2\u4ca3\u4ca4\u9cd3\u9cd4\u9cd5\u9cd6\u9cd7\u9cd8\u9cd9\u9cda\u9cdb\u9ff8\u9ff9\u9cdc\u9cdd\u9cde\u9cdf\u9ce0\u9ce1\u9ce2\u9ce3\u9ce4\u9ce5\u9ce6\u9ce7\u9ce8\u9ce9\u9cea\u9ceb\u9cec\u9ced\u9cee\u9cef\u9cf0\u4ca5\u9cf1\u9cf2\u9cf3\u9cf4\u9cf5\u9cf6\u4ca6\u4ca7\u4ca8\u4ca9\u4caa\u4cab\u9cf7\u9cf8\u9cf9\u9cfa\u9cfb\u9cfc\u9cfd\u9cfe\u9cff\u9d00\u9d01\u9d02\u9d03\u9d04\u9d05\u9d06\u9d07\u9d08\u9d09\u9d0b\u9d0c\u9d0d\u9d0e\u4cac\u4cad\u4cae\u4caf\u4cb0\u4cb1\u4cb2\u4cb3\u4cb4\u4cb5\u4cb6\u4cb7\u4cb8\u9d0a\u9d0f\u9d10\u9d11\u9d12\u9d13\u9d14\u9d15\u9d16\u9d17\u9d18\u9d19\u9d1a\u9d1b\u9d1c\u9d1d\u9d1e\u9d1f\u9d20\u9d21\u9d22\u9d23\u9d24\u9d25\u9d26\u9d27\u9d28\u9d29\u9d2a\u9d2b\u9d2c\u4cb9\u4cba\u4cbb\u4cbc\u4cbd\u4cbe\u4cbf\u4cc0\u4cc1\u4cc2\u4cc3\u4cc4\u4cc5\u4cc6\u4cc7\u4cc8\u4cc9\u4cca\u9d2d\u9d2e\u9d2f\u9d30\u9d31\u9d32\u9d33\u9d34\u9d35\u9d36\u9d37\u9d38\u9d39\u9d3a\u9d3b\u9d3c\u9d3d\u9d3e\u9d3f\u9d40\u9d41\u9d42\u9d43\u9d44\u9d45\u9d46\u9d47\u9d48\u9d49\u4ccb\u4ccc\u4ccd\u4cce\u4ccf\u4cd0\u4cd1\u4cd2\u4cd3\u4cd4\u9d4a\u9d4b\u9d4c\u9d4d\u9d4e\u9d4f\u9d50\u9d51\u9d52\u9d53\u9d54\u9d55\u9d56\u9d57\u9d58\u9d59\u9d5a\u9d5b\u9d5c\u9d5d\u9d5e\u9d5f\u9d60\u9d61\u9d62\u9d63\u9d65\u4cd5\u4cd6\u4cd7\u4cd8\u4cd9\u4cda\u4cdb\u4cdc\u9d66\u9d67\u9d68\u9d69\u9d6a\u9d6b\u9d6c\u9d6d\u9d6e\u9d6f\u9d70\u9d71\u9d72\u9d73\u9d74\u9d75\u9d76\u9d77\u9d78\u9d79\u9d7a\u9d7b\u9d7c\u9d7d\u9d7e\u9d7f\u9d80\u9d81\u9d82\u9d83\u9d84\u9d85\u9d86\u9d87\u9d88\u9d89\u9d8a\u9d8b\u9d8c\u9d8d\u9d8e\u9d8f\u9d91\u4cdd\u4cde\u4cdf\u4ce0\u4ce1\u4ce2\u4ce3\u4ce4\u4ce5\u9d90\u9d92\u9d93\u9d94\u9d95\u9d96\u9d97\u9d98\u9d99\u9d9a\u9d9b\u9d9c\u9d9d\u9d9e\u9d9f\u9da0\u9da1\u9da2\u9da3\u9da4\u9da5\u9da6\u9da7\u9da8\u9da9\u9daa\u9dab\u4ce6\u4ce7\u4ce8\u4ce9\u4cea\u4ceb\u4cec\u4ced\u4cee\u4cef\u4cf0\u9dac\u9dad\u9dae\u9daf\u9db0\u9db1\u9db2\u9db3\u9db4\u9db5\u9db6\u9db7\u9db8\u9db9\u9dba\u9dbb\u9dbc\u9dbd\u9dbe\u9dbf\u9dc0\u9dc1\u9dc2\u9dc3\u9dc4\u9dc5\u9dc6\u9dc7\u9dc8\u9dc9\u9dca\u9dcc\u9dcd\u9dce\u9dcf\u4cf1\u4cf2\u4cf3\u4cf4\u4cf5\u4cf6\u9dcb\u9dd0\u9dd1\u9dd2\u9dd3\u9dd4\u9dd5\u9dd6\u9dd7\u9dd8\u9dd9\u9dda\u9ddb\u9ddc\u9ddd\u9dde\u9ddf\u4cf7\u4cf8\u4cf9\u4cfa\u4cfb\u4cfc\u4cfd\u9de1\u9de2\u9de3\u9de4\u9de5\u9de6\u9de7\u9de8\u9de9\u9dea\u9deb\u9dec\u9ded\u9dee\u9def\u9df0\u9df1\u9df2\u9df3\u9df4\u9df5\u9df6\u9df7\u9df8\u9dfa\u9dfb\u9dfc\u4cfe\u4cff\u4d00\u4d01\u4d02\u4d03\u4d04\u4d05\u4d06\u9df9\u9dfd\u9dfe\u9dff\u9e00\u9e01\u9e02\u9e03\u9e04\u9e05\u9e06\u9e07\u9e08\u9e09\u9e0a\u4d07\u4d08\u4d09\u4d0a\u4d0b\u9e0b\u9e0c\u9e0d\u9e0e\u9e0f\u9e10\u9e11\u9e12\u4d0c\u4d0d\u9e13\u9e14\u4d0e\u9e15\u9e16\u9e17\u4d0f\u9e18\u9e19\u9e1a\u9e1b\u9e1c\u9e1d\u9e1e\u4d10\u4d11\u4d12\u9e1f\u9e20\u9e21\u9e22\u9e23\u9e24\u9e25\u9e26\u9e27\u9e28\u9e29\u4d13\u9e2a\u9e2b\u9e2c\u9e2d\u9e2e\u9e2f\u9e30\u9e31\u9e32\u9e33\u9e34\u9e35\u9e36\u9e37\u9e38\u9e39\u9e3a\u9e3b\u9e3c\u9e3d\u9e3e\u9e3f\u4d14\u4d15\u9e40\u9e41\u9e42\u9e43\u9e44\u9e45\u9e46\u9e47\u9e48\u9ffa\u9e49\u9e4a\u9e4b\u9e4c\u9e4d\u9e4e\u9e4f\u9e50\u9e51\u9e52\u9e53\u9e54\u4d16\u9e55\u9e56\u9e57\u9e59\u9e5a\u9e5b\u9e5c\u4d17\u9e58\u9e5d\u9e5e\u9e5f\u9e60\u9e61\u9e62\u9e63\u9e64\u4d18\u9e65\u9e66\u9e67\u9e68\u9e69\u9e6a\u9e6b\u9e6c\u9e6d\u9e6e\u9e6f\u9e70\u4d19\u9e71\u9e72\u9e73\u9e74\u9e75\u9e76\u4d1a\u9e77\u4d1b\u9e78\u9e79\u9e7a\u9e7b\u4d1c\u4d1d\u9e7c\u9e7d\u4d1e\u9e7e\u9e7f\u9e80\u9e81\u9e82\u4d1f\u9e83\u9e84\u4d20\u4d21\u4d22\u9e85\u9e86\u9e87\u9e88\u4d23\u4d24\u4d25\u9e89\u9e8a\u9e8b\u9e8c\u9e8d\u9e8e\u9e8f\u9e90\u4d26\u9e91\u9e92\u9e93\u9e94\u9e95\u9e96\u9e97\u4d27\u9e98\u9e99\u9e9a\u9e9b\u9e9c\u9e9d\u4d28\u9e9e\u4d29\u9e9f\u9ea0\u4d2a\u4d2b\u9ea1\u9ea2\u9ea3\u9ea4\u9ea5\u9ea7\u4d2c\u4d2d\u4d2e\u9ea8\u9ea9\u9eaa\u9eab\u4d2f\u4d30\u9eac\u9ead\u9eae\u4d31\u4d32\u4d33\u4d34\u9eaf\u9eb0\u4d35\u9eb1\u9eb2\u4d36\u4d37\u4d38\u9eb3\u9eb4\u4d39\u4d3a\u4d3b\u4d3c\u4d3d\u9eb5\u4d3e\u4d3f\u4d40\u9eb6\u4d41\u4d42\u4d45\u4d43\u4d44\u4d46\u9eb7\u9ea6\u9eb8\u9eb9\u9eba\u9ebb\u9ebc\u9ebd\u9ebe\u4d47\u9ebf\u9ec0\u9ec1\u4d48\u4d49\u9ec2\u9ec3\u9ec4\u9ec5\u9ec6\u4d4a\u9ec7\u9ec8\u9ec9\u9eca\u9ecb\u4d4b\u4d4c\u4d4d\u4d4e\u4d4f\u4d50\u9ecc\u9ecd\u9ece\u4d51\u4d52\u4d53\u9ecf\u4d54\u4d55\u4d56\u4d57\u4d58\u4d59\u9ed0\u4d5a\u4d5b\u4d5c\u9ed1\u9ed2\u4d5d\u4d5e\u58a8\u9ed3\u4d5f\u4d60\u9ed4\u9ed5\u9ed6\u9ed7\u9ed8\u4d61\u9eda\u9edb\u9edc\u9edd\u9ede\u4d62\u4d63\u9edf\u9ee0\u9ee1\u4d64\u4d65\u4d66\u4d67\u9ee2\u9ee3\u4d68\u4d69\u9ee4\u9ee5\u9ee6\u9ee7\u9ee8\u9ee9\u9eea\u4d6a\u4d6b\u4d6c\u9eeb\u9eec\u9eed\u9eee\u9eef\u4d6d\u4d6e\u4d6f\u9ef0\u9ef1\u9ef2\u9ef3\u9ef4\u4d70\u4d71\u9ef5\u4d72\u4d73\u4d74\u9ef6\u4d75\u9ef7\u9ef8\u9ef9\u9efa\u9efb\u9efc\u9efd\u9eff\u9f00\u9f01\u9f02\u4d76\u9f03\u9f04\u4d77\u9f05\u4d78\u9f06\u9f07\u4d79\u9f08\u9f09\u9f0a\u9efe\u9f0b\u9f0c\u9f0d\u9f0e\u9f0f\u9f10\u9f11\u9f12\u4d7a\u4d7b\u4d7c\u9f13\u9f14\u9f15\u9f16\u4d7d\u4d7e\u4d7f\u9f17\u4d80\u9f18\u9f19\u9f1a\u9f1b\u4d81\u9f1c\u9f1d\u9f1e\u9f1f\u9f20\u9f21\u4d82\u9f22\u9f23\u9f24\u4d83\u9f25\u9f26\u9f27\u9f28\u9f29\u9f2a\u9f2b\u9f2c\u9ffb\u9ffc\u4d84\u9f2d\u4d85\u9f2e\u9f2f\u9f30\u9f31\u4d86\u9f32\u9f33\u9f34\u9f35\u4d87\u9f36\u9f37\u9f38\u9f39\u4d88\u4d89\u9f3a\u9f3b\u9f3c\u9f3d\u9f3e\u9f3f\u4d8a\u4d8b\u9f40\u9f41\u4d8c\u4d8d\u4d8e\u4d8f\u9f42\u9f43\u9f44\u9f45\u9f46\u9f47\u9f48\u4d90\u4d91\u9f49\u9f4a\u9f4b\u4d92\u4d93\u9f4c\u9f4d\u9f4e\u9f4f\u9f50\u9f51\u9f52\u9f53\u9f54\u9f55\u4d94\u9f56\u9f57\u9f58\u4d95\u4d96\u9f59\u9f5a\u9f5b\u9f5c\u9f5d\u9f5e\u9f5f\u9f60\u9f61\u9f62\u9f63\u4d97\u4d98\u4d99\u9f64\u9f65\u9f66\u9f67\u9f68\u9f69\u4d9a\u4d9b\u9f6a\u9f6b\u9f6c\u4d9c\u4d9d\u9f6d\u9f6e\u9f6f\u9f70\u9f71\u4d9e\u4d9f\u9f72\u9f73\u9f74\u9f75\u9f76\u9f77\u4da0\u4da1\u4da2\u9f78\u9f79\u9f7a\u9f7b\u4da3\u4da4\u4da5\u4da6\u4da7\u9f7c\u9f7d\u4da8\u4da9\u4daa\u9f7e\u4dab\u9f7f\u9f80\u9f81\u9f82\u9f83\u9f84\u9f85\u9f86\u9f87\u9f88\u9f89\u9f8a\u9f8b\u9f8c\u9f8d\u9f8e\u9f8f\u9f91\u9f92\u9f93\u9f94\u9f95\u4dac\u9f96\u9f97\u9f98\u9f99\u4dad\u4dae\u9f9a\u9f9b\u9f9c\u4daf\u4db0\u9f9d\u4db1\u4db2\u9f9e\u9f9f\u9fa0\u9fa1\u4db3\u9fa2\u9fa3\u4db4\u9fa4\u9fa5\u4db5\u2f00\u3280\u3192\u319c\u3286\u3282\u3194\u32a4\u3196\u32a6\u3198\uf967\u319b\ufa70\u2f01\u2ea6\u32a5\u3197\uf905\u2f02\u2e80\uf95e\u2f03\u2f04\u319a\u2e84\u2e83\u2e82\u3288\uf91b\u2f05\uf9ba\u2f06\u3281\u3193\u3284\u2f07\uf977\u2f08\u319f\u2e85\uf9fd\uf9a8\u32ff\u32ad\u32a1\ufa73\uf92d\uf9b5\ufa30\uf965\uf9d4\uf9bb\ufa31\u329d\u2f09\ufa0c\ufa74\ufa32\u2f0a\ufa72\uf978\u2f0b\u3287\uf9d1\u3285\ufa75\u2f0c\u2e86\u2f0d\u32a2\u2f0e\ufa71\uf92e\uf979\uf955\uf954\ufa15\u2f0f\u2e87\u2f10\u2f11\u2e88\u2e89\ufa00\uf99c\uf9dd\uf9ff\uf9c7\uf98a\u2f12\uf99d\u3298\ufa76\ufa33\uf952\uf92f\ufa34\uf97f\u2f13\ufa77\u2f14\uf963\u2f15\u2f16\u32a9\uf9eb\u2f17\u3038\u3289\u3039\u303a\ufa35\u32af\u2f18\u2e8a\u2f19\u2e8b\u329e\uf91c\u2f1a\u2e81\u2f1b\uf96b\u2f1c\u2f1d\uf906\u32a8\u3294\uf9de\uf9ed\uf980\uf99e\u3244\ufa79\uf90b\ufa7a\ufa36\ufa78\ufa0d\ufa7b\ufa37\ufa38\u2f1e\u3283\u3195\uf9a9\u2f1f\u328f\u319e\ufa39\ufa10\ufa7c\uf96c\ufa3a\ufa7d\uf94a\uf942\u2f20\u2f21\u2f22\u2f23\u32b0\u2f24\u337d\u319d\ufa7e\uf90c\uf909\ufa7f\uf981\u2f25\u329b\ufa80\ufa81\u2f26\u32ab\u2f27\ufa04\u32aa\uf95f\uf9aa\uf9bc\u2f28\u2f29\u2e8c\u2e8d\u2e90\u2f2a\u2e8e\u2e8f\u2e91\u2f2b\uf9bd\uf94b\ufa3b\uf9df\ufa3c\u2f2c\u2f2d\uf9d5\uf921\uf9ab\u2f2e\u2f2f\u32a7\u2f30\u2e92\u2f31\u2f32\u337b\uf98e\u2e93\u2f33\u3245\u2f34\ufa01\uf9a2\uf928\ufa82\ufa0b\ufa83\uf982\u2f35\u2f36\uf943\u2f37\u2f38\u2f39\u2e95\u2e94\u2f3a\ufa84\u2f3b\uf9d8\uf966\ufa85\u2f3c\u2e97\u2e96\uf9a3\uf960\uf9ac\ufa6b\ufa3d\ufa86\uf9b9\ufa88\uf9d9\ufa87\ufa8a\ufa3e\ufa3f\ufa89\uf98f\ufa40\ufa8b\uf90d\uf990\u2f3d\uf9d2\ufa8c\u2f3e\u2f3f\u2e98\uf925\uf95b\ufa02\uf973\uf9a4\uf975\ufa8d\ufa8e\ufa8f\uf991\uf930\u2f40\u2f41\u2e99\ufa41\ufa90\uf969\u2f42\u3246\u2f43\uf9be\u2f44\u2f45\uf983\u2f46\u2e9b\ufa42\u2f47\u3290\u2e9c\u337e\uf9e0\u337c\ufa12\ufa91\uf9c5\ufa43\ufa06\uf98b\u2f48\uf901\u2f49\u328a\u2e9d\u3292\uf929\ufa92\ufa93\u2f4a\u328d\uf9e1\ufa94\uf9c8\uf9f4\uf9c9\uf9da\u3291\u337f\uf97a\ufa44\uf9e2\uf914\uf95c\uf9bf\uf94c\uf931\uf91d\u2f4b\u2f4c\u32a3\uf98c\ufa95\u2f4d\u2e9e\uf9a5\u2f4e\uf970\ufa96\u2f4f\u2e9f\u2f50\u2f51\u2f52\u2ea0\u2f53\u2f54\u328c\u2ea1\u2ea2\uf972\uf968\uf9e3\u329f\uf915\ufa05\uf9ca\ufa97\uf92a\ufa45\uf9f5\uf94d\uf9d6\ufa46\uf9cb\uf9ec\ufa99\uf904\ufa98\uf94e\ufa47\ufa9a\uf992\uf922\uf984\ufa9b\u2f55\u328b\u2ea3\uf9fb\uf99f\uf916\uf993\ufa48\ufa9c\uf9c0\uf9ee\uf932\uf91e\u2f56\ufa49\u2ea4\u2ea5\ufa9e\u2f57\u2f58\u2f59\u2f5a\u2f5b\u2f5c\u2ea7\uf946\u3295\u2f5d\u2ea8\ufa9f\uf9fa\uf92b\ufa16\ufaa0\uf9a7\u2f5e\uf961\uf9db\u2f5f\u2ea9\uf9ad\uf917\uf9e4\uf9cc\ufa4a\uf9ae\ufaa1\uf994\uf9ef\u2f60\u2f61\ufaa2\u2f62\u2f63\u2f64\u2f65\u3199\u329a\ufaa3\uf9cd\uf976\uf962\u2f66\u2eaa\u2f67\uf9e5\ufaa4\ufaa5\uf9c1\uf90e\u2f68\u2f69\u2f6a\u2f6b\ufa17\ufaa6\ufaa7\u32ac\uf933\u2f6c\u2eab\ufaa8\uf96d\ufaaa\ufaa9\ufa9d\u2f6d\u2f6e\u2f6f\uf9ce\uf93b\ufa4b\uf947\ufaab\uf964\uf985\u2f70\u2eac\u2ead\ufa18\ufa4c\u3293\ufa4e\ufa4d\ufa4f\ufa50\ufa51\u3297\ufa19\ufa1a\uf93c\ufa52\ufa53\ufa1b\uf9b6\u2f71\u2f72\uf995\u3299\uf956\ufa54\u2f73\ufa55\ufaac\uf9f7\u2f74\u2f75\u2eae\uf9f8\u3247\ufa56\ufaad\uf9a6\uf944\u2f76\ufaae\uf9f9\ufa1d\ufa03\uf97b\u2f77\u2eaf\uf9cf\uf96a\uf94f\ufaaf\uf93d\uf957\uf996\ufa57\ufab0\ufa58\uf950\ufa59\u2eb0\u2f78\ufab1\u2f79\u2eb2\u2eb5\u2eb1\u2eb3\u2eb4\ufa5a\uf9e6\uf90f\u2f7a\u2eb6\u2eb7\u2eb8\uf9af\ufa1e\u2f7b\uf934\u2f7c\u2eb9\ufa5b\ufab2\u2f7d\u2f7e\u2f7f\uf9b0\uf997\uf945\u2f80\u2ebb\u2eba\u2f81\u2ebc\uf953\uf926\u2f82\uf9f6\u2f83\ufa5c\u2f84\u2f85\u2ebd\u2f86\ufa6d\u2f87\u2f88\u2f89\uf97c\u2f8a\u2f8b\ufa5d\ufa5e\u2ebe\u2ebf\u2ec0\uf974\uf9fe\ufab3\uf93e\ufab4\uf958\uf918\uf96e\ufa5f\uf999\uf9c2\uf923\uf9f0\uf935\ufa20\uf91f\uf910\u2f8c\u2ec1\uf936\u2f8d\ufab5\uf911\uf927\u2f8e\ufa08\u2f8f\u2f90\u2ec2\uf9a0\uf9e7\uf9e8\uf912\ufa60\ufab6\uf924\u2f91\u2ec4\u2ec3\ufab7\ufa0a\u2f92\ufa61\ufab8\u2ec5\u2ec6\u2f93\u2ec7\u2f94\uf96f\uf9a1\ufab9\ufabb\uf97d\uf941\ufabe\ufa22\ufaba\uf95d\ufabd\ufa62\ufabc\ufa63\ufabf\uf9fc\uf95a\ufac0\u2ec8\u2f95\u2f96\uf900\u2f97\u2f98\u2f99\u3296\uf948\u32ae\uf903\ufa64\ufa65\ufac1\u2ec9\u2f9a\u2f9b\u2f9c\u2eca\uf937\u2f9d\uf902\u2f9e\uf998\uf9d7\ufac2\ufa07\uf98d\u2ecb\u2f9f\uf971\u2fa0\u2fa1\ufa66\u2ecc\u2ecd\u2ece\uf99a\ufa25\ufa67\u329c\ufac3\uf9c3\uf913\u2fa2\u2ecf\uf92c\ufa2e\ufa26\u2fa3\uf919\ufac4\uf9b7\u2fa4\uf9e9\u2fa5\uf97e\uf90a\u2fa6\u328e\uf9b1\ufac5\uf93f\uf99b\u2ed0\u2ed1\u2fa7\u2ed2\u2ed3\u2fa8\uf986\u2ed4\u2fa9\u2ed5\u2ed6\uf9c6\uf951\ufa09\uf959\uf9d3\ufac6\uf9dc\uf9f1\u2faa\ufa2f\uf9b8\u2fab\uf9ea\ufa68\ufac7\u2fac\u2ed7\uf9b2\uf949\uf938\uf9b3\u2fad\u2ed8\ufa1c\ufac8\u2fae\u2faf\u2fb0\u2fb1\ufac9\u2ed9\u2fb2\u2fb3\ufa69\ufaca\u2fb4\u32a0\ufacb\uf9b4\ufa6a\ufacc\uf9d0\u2eda\u2fb5\u2edb\u2fb6\u2edc\u2edd\u2fb7\u2edf\u2ede\ufa2a\ufa2b\ufa2c\u2ee0\u2fb8\u2ee1\u2fb9\u2fba\uf91a\uf987\u2ee2\u2fbb\u2ee3\u2fbc\u2fbd\ufacd\u2fbe\u2fbf\u2fc0\u2fc1\u2ee4\u2fc2\uf939\uf9f2\u2ee5\u2fc3\ufa2d\uf93a\uf920\u2ee6\u2fc4\u2ee7\uf940\u2fc5\uf988\uf9f3\u2fc6\u2ee8\u2fc7\u2fc8\u2ee9\u2fc9\uf989\u2fca\u2fcb\u2fcc\u2eea\u2fcd\u2fce\u2fcf\u2fd0\ufad8\u2fd1\u2eeb\u2eec\u2fd2\u2eed\u2eee\uf9c4\u2fd3\u2eef\ufad9\u2ef0\uf907\uf908\uface\u2fd4\u2ef1\u2ef2\u2ef3\u2fd5\ufad2\ufad3\ufad4\ufad0\ufacf\ufad1\ufa6c\ufad5\ufad6\ufad7\ufffd'; +const String _ducetRanks = + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u01d4\u01d5\u01d6\u01d7\u01d8\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u01dc\u0266\u02ef\u0423\u106d\u0426\u041e\u02e7\u02fb\u0372\u0411\u0676\u0216\u01fa\u0284\u0418\u10a0\u10cf\u1149\u119d\u11e3\u1223\u125b\u1291\u12c7\u12fc\u023b\u0231\u067f\u0683\u068b\u0270\u040e\u1334\u13b2\u13d5\u1408\u144b\u14ad\u14ce\u1503\u153e\u158a\u15a1\u15d8\u1625\u1658\u1699\u171d\u1748\u175b\u17a9\u17ea\u1820\u1890\u18b7\u18d7\u18f1\u1916\u0378\u041a\u037b\u04c7\u01f2\u04c0\u1330\u13ae\u13d0\u1402\u1445\u14a9\u14c9\u14fe\u1537\u1586\u159d\u15d2\u1620\u1654\u1694\u1719\u1745\u1756\u17a5\u17e6\u181c\u188b\u18b2\u18d2\u18ee\u1912\u037e\u0691\u0382\u0695\u0000' + '\u0000\u0000\u0000\u0000\u0000\u01d9\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u01ea\u026c\u106b\u1070\u106a\u1072\u0693\u0408\u04cd\u05d6\u1337\u02f9\u068f\u0000\u05d7\u04c9\u0548\u067c\u1179\u11cd\u04c3\u1a4d\u040a\u029f\u04d4\u1100\u169c\u02fa\u1107\u1105\u11d0\u0276\u133e\u133c\u1342\u134e\u134b\u1346\u137c\u13e6\u1455\u1453\u1459\u145d\u154a\u1548\u154e\u1552\u141f\u1666\u16a3\u16a1\u16a7\u16b2\u16ad\u067e\u16b6\u1829\u1827\u182d\u1835\u18f6\u1947\u17c9\u133d\u133b\u1341\u134d\u1348\u1345\u137a\u13e4\u1454\u1452\u1458\u145c\u1549\u1547\u154d\u1551\u141d\u1665\u16a2\u16a0\u16a6\u16b1\u16aa\u067d\u16b5\u1828\u1826\u182c\u1832\u18f5\u1946\u18fc' + '\u1354\u1353\u1340\u133f\u1352\u1351\u13dd\u13dc\u13df\u13de\u13e3\u13e2\u13e1\u13e0\u1410\u140f\u1416\u1415\u1467\u1466\u1457\u1456\u1461\u1460\u1465\u1464\u145b\u145a\u14d8\u14d7\u14d6\u14d5\u14dc\u14db\u14de\u14dd\u150d\u150c\u1518\u1516\u1554\u1553\u1559\u1558\u154c\u154b\u1557\u1556\u1555\u1572\u156b\u156a\u1591\u1590\u15ad\u15ac\u1755\u15e1\u15e0\u15e5\u15e4\u15e3\u15e2\u15ef\u15ee\u15e7\u15e6\u1660\u165f\u166a\u1669\u1664\u1663\u196e\u1691\u1690\u16ba\u16b9\u16a5\u16a4\u16b0\u16af\u16ed\u16ec\u1765\u1764\u176b\u176a\u1767\u1766\u17af\u17ae\u17b1\u17b0\u17b7\u17b6\u17b3\u17b2\u17f6\u17f5\u17f1\u17f0\u180e\u180d\u183a\u1839\u183e\u183d\u182b\u182a\u1831\u1830\u1838\u1837\u183c\u183b\u18c1\u18c0\u18fa\u18f9\u18fd\u191d\u191c\u1923\u1922\u1921\u1920\u17be' + '\u13c1\u13ca\u13cc\u13cb\u1968\u1967\u16ff\u13fb\u13fa\u143c\u143e\u1441\u1440\u1928\u148f\u1494\u1499\u14c5\u14c4\u14f4\u14fa\u1525\u1583\u157b\u15c7\u15c6\u1606\u161e\u1881\u1684\u1686\u170e\u16c3\u16c2\u14fd\u14fc\u173c\u173b\u1781\u1964\u1963\u17de\u17e2\u1812\u1815\u1814\u1817\u1847\u1846\u1888\u18a9\u190c\u190b\u192b\u192a\u193c\u1942\u1941\u1944\u195c\u1966\u1965\u1806\u194c\u1982\u1983\u1984\u1985\u1431\u1430\u142f\u15f4\u15f3\u15f2\u1677\u1676\u1675\u1344\u1343\u1550\u154f\u16a9\u16a8\u182f\u182e\u1857\u1856\u1851\u1850\u1855\u1854\u1853\u1852\u148e\u1373\u1372\u1375\u1374\u1381\u1380\u14f1\u14f0\u14da\u14d9\u15ab\u15aa\u16b8\u16b7\u16db\u16da\u193f\u193e\u1592\u142e\u142d\u142b\u14d4\u14d3\u1526\u194d\u1662\u1661\u1371\u1370\u137f\u137e\u16d9\u16d8' + '\u1358\u1357\u135a\u1359\u146b\u146a\u146d\u146c\u155d\u155c\u155f\u155e\u16bf\u16be\u16c1\u16c0\u176f\u176e\u1771\u1770\u1843\u1842\u1845\u1844\u17bd\u17bc\u17fa\u17f9\u1911\u1910\u150f\u150e\u1687\u1442\u1716\u1715\u1930\u192f\u1350\u134f\u1463\u1462\u16cf\u16ce\u16d5\u16d4\u16b4\u16b3\u16d7\u16d6\u1903\u1902\u1619\u168d\u1818\u1593\u1425\u174c\u1399\u13f5\u13f4\u1607\u1810\u17d8\u1935\u196b\u196a\u13c2\u1870\u18b0\u148a\u1489\u1596\u1595\u1754\u1753\u1788\u1787\u190a\u1909\u13a1\u13a4\u13aa\u13c9\u16fe\u13fc\u143b\u143d\u149d\u1492\u149e\u1498\u149f\u14a5\u14a6\u159a\u14f3\u14ea\u14ee\u14f9\u14a8\u187b\u1528\u1534\u157a\u1582\u1573\u160a\u1610\u1616\u161b\u1880\u1885\u164d\u1683\u168b\u167d\u170d\u16f5\u1712\u1742\u178a\u178d\u178f\u1792\u1793\u1796\u1798' + '\u177f\u179e\u17d5\u17dc\u159c\u17e3\u17e5\u181a\u1816\u186f\u1887\u18a8\u18af\u18cf\u161f\u1908\u1931\u1933\u193b\u1945\u1969\u1976\u1981\u1986\u1987\u13c0\u14a7\u14f5\u1524\u1597\u15d0\u15fe\u1752\u197f\u1980\u142c\u1434\u1433\u1807\u1809\u1802\u14bd\u15fa\u15fd\u1988\u1989\u187e\u187f\u1509\u152a\u158d\u1761\u178b\u1790\u179f\u18ba\u18f4\u04e2\u04e5\u1535\u196d\u1536\u1970\u1978\u196c\u1979\u04e6\u04e7\u04e8\u04e9\u04ea\u04eb\u04ec\u04ed\u04ee\u04ef\u04f0\u04f1\u04f2\u04f3\u1050\u1051\u04f4\u04f5\u04f6\u04f7\u04fa\u04fb\u04cb\u04cc\u04d2\u04d5\u04c6\u04d3\u04fc\u04fd\u14fb\u15dd\u17ac\u18db\u1977\u04fe\u04ff\u0500\u0501\u0502\u0503\u0504\u0505\u0506\u196f\u0507\u0508\u0509\u050a\u050b\u050c\u050d\u050e\u050f\u0510\u0511\u0512\u0513\u0514\u0515\u0516\u0517' + '\u000c\u0009\u0010\u0016\u001b\u00a9\u000f\u0017\u0014\u00aa\u0012\u0015\u0011\u001c\u001d\u00ab\u00ac\u00ad\u001e\u0002\u0006\u001f\u005b\\\u005d\u005e\u0020\u00ae\u005f\u0060\u0061\u0062\u0063\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u0019\u001a\u0064\u0065\u0066\u0067\u00b5\u00b6\u0068\u00b7\u00b8\u0001\u0069\u00b9\u00a8\u0094\u0095\u0018\u00ba\u006a\u006b\u006c\u0021\u0022\u0023\u000d\u000a\u0013\u0003\u01ca\u00bb\$\u006d\u006e\u006f\u0025\u0026\'\u0070\u0071\u0000\u0028\u0029\u002a\u0072\u0073\u0074\u0075\u002b\u00bc\u0076\u0077\u002c\u0078\u002d\u002e\u0079\u00bd\u00c0\u007a\u1332\u1447\u1539\u1696\u181e\u13d2\u1404\u1500\u1622\u1758\u17e8\u188d\u18d4\u19e9\u19e8\u1af2\u1af1\u04e3\u04e4\u19e3\u19e2\u0000\u0000\u1a1f\u1a8b\u1a89\u1a8d\u0232\u1a43' + '\u0000\u0000\u0000\u0000\u04c4\u04ce\u1992\u02a0\u19d4\u19f2\u1a27\u0000\u1a63\u0000\u1a99\u1ac8\u1a3e\u198b\u19be\u19c3\u19c9\u19cd\u19e7\u19eb\u1a1a\u1a20\u1a46\u1a4a\u1a4e\u1a58\u1a5a\u1a5c\u1a72\u1a7d\u0000\u1a86\u1a90\u1a92\u1ab5\u1ab9\u1abd\u1ac0\u1a2f\u1aa2\u1990\u19d2\u19f0\u1a25\u1aaf\u198a\u19bc\u19c1\u19c8\u19cb\u19e6\u19ea\u1a18\u1a1d\u1a44\u1a49\u1a4c\u1a57\u1a59\u1a5b\u1a6f\u1a7b\u1a88\u1a84\u1a8f\u1a91\u1ab3\u1ab8\u1abc\u1abf\u1a2e\u1aa1\u1a61\u1a97\u1ac6\u1a48\u19bd\u1a19\u1a93\u1a9b\u1aa3\u1ab4\u1a70\u1a47\u1a7a\u1a79\u19e5\u19e4\u19e1\u19e0\u1a78\u1a77\u1af0\u1aef\u1b35\u1b34\u1b3f\u1b3e\u1b41\u1b40\u1b47\u1b46\u1b55\u1b54\u1b5b\u1b5a\u1b63\u1b62\u1a45\u1a7c\u1a85\u1a42\u1a1b\u19cc\u0670\u1af4\u1af3\u1a87\u1a76\u1a75\u1a83\u1a8c\u1a8a\u1a8e' + '\u1ba5\u1ba9\u1b9a\u1b86\u1bac\u1bc8\u1bdf\u1be2\u1be8\u1c0c\u1c2b\u1c6a\u1bf0\u1bd7\u1c6f\u1cbe\u1b70\u1b7d\u1b81\u1b84\u1b94\u1ba3\u1baf\u1bbc\u1bd5\u1be6\u1bee\u1c01\u1c15\u1c1c\u1c37\u1c45\u1c4e\u1c56\u1c60\u1c6d\u1c82\u1c85\u1c9f\u1caa\u1cc1\u1cc6\u1cce\u1cd4\u1cd9\u1ce4\u1ce9\u1cf0\u1b6e\u1b7b\u1b7e\u1b82\u1b91\u1ba1\u1bad\u1bba\u1bd3\u1be5\u1bec\u1bff\u1c13\u1c1a\u1c2e\u1c43\u1c4c\u1c53\u1c5c\u1c6b\u1c80\u1c83\u1c9d\u1ca8\u1cbf\u1cc4\u1ccb\u1cd2\u1cd7\u1ce3\u1ce7\u1cef\u1ba4\u1ba8\u1b99\u1b85\u1baa\u1bc7\u1bde\u1be0\u1be7\u1c0b\u1c2a\u1c69\u1bef\u1bd6\u1c6e\u1cbd\u1c94\u1c92\u1ce0\u1cdd\u1cf5\u1cf3\u1cf8\u1cf6\u1d01\u1d00\u1cfd\u1cfb\u1d06\u1d04\u1d08\u1d07\u1d0a\u1d09\u1d0d\u1d0b\u1d0f\u1d0e\u1d11\u1d10\u1c7f\u1c7e\u1c9c\u1c9b\u1c9a\u1c99\u1c96\u1c95' + '\u1c4b\u1c4a\u054b\u00c2\u002f\u0007\u0004\u0030\u0000\u0000\u1bdd\u1bdc\u1cdc\u1cdb\u1c50\u1c4f\u1b88\u1b87\u1b8a\u1b89\u1b8e\u1b8d\u1bb9\u1bb8\u1ba0\u1b9f\u1bf2\u1bf1\u1bfa\u1bf9\u1bf8\u1bf7\u1bf6\u1bf5\u1c23\u1c22\u1c29\u1c28\u1c49\u1c48\u1d15\u1d14\u1c5b\u1c5a\u1c66\u1c65\u1c77\u1c76\u1c79\u1c78\u1c8b\u1c8a\u1ca5\u1ca4\u1cb2\u1cb1\u1cb6\u1cb5\u1c8d\u1c8c\u1cba\u1cb9\u1cbc\u1cbb\u1d19\u1bb1\u1bb0\u1bf4\u1bf3\u1c04\u1c03\u1c25\u1c24\u1c21\u1c20\u1cb4\u1cb3\u1c17\u1c16\u1d18\u1b72\u1b71\u1b74\u1b73\u1b7a\u1b79\u1ba7\u1ba6\u1b76\u1b75\u1b78\u1b77\u1bb3\u1bb2\u1bbe\u1bbd\u1bcc\u1bcb\u1bdb\u1bda\u1bd9\u1bd8\u1c3e\u1c3d\u1c40\u1c3f\u1c42\u1c41\u1ce6\u1ce5\u1c75\u1c74\u1c71\u1c70\u1c73\u1c72\u1cac\u1cab\u1b90\u1b8f\u1cd6\u1cd5\u1b8c\u1b8b\u1c87\u1c86\u1c89\u1c88' + '\u1b96\u1b95\u1b9e\u1b9d\u1bc2\u1bc1\u1bd0\u1bcf\u1c10\u1c0f\u1c2d\u1c2c\u1c59\u1c58\u1c64\u1c63\u1bc4\u1bc3\u1c08\u1c07\u1c12\u1c11\u1c52\u1c51\u1cf2\u1cf1\u1bfe\u1bfd\u1d17\u1d16\u1bfc\u1bfb\u1c0a\u1c09\u1c27\u1c26\u1c47\u1c46\u1c8f\u1c8e\u1c1f\u1c1e\u1bb5\u1bb4\u1cae\u1cad\u1c06\u1c05\u0000\u1e26\u1e29\u1e2b\u1e2d\u1e2f\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e54\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u0000\u0000\u1e79\u0464\u0465\u026d\u0220\u0278\u0466\u1e27\u1e25\u1e28\u1e2a\u1e2c\u1e2e\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e53\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e69' + '\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e30\u1e55\u0240\u01fd\u0000\u0000\u054c\u054d\u1074\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00cf\u00d0\u00d1\u00d4\u0000\u0467\u00d5\u0468\u00d3\u00d2\u0469\u0000\u0000\u046a\u00ce\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u1e7a\u1e81\u1e85\u1e88\u1e8c\u1e8f\u1e94\u1e96\u1e97\u1e99\u1ea1\u1e9f\u1ea5\u1eaa\u1ea8\u1ead\u1eac\u1eaf\u1eb1\u1eb4\u1eb3\u1eb9\u1eb8\u1ebb\u1ebd\u1ec0\u1ec6\u0000\u0000\u0000\u0000\u1e9c\u1e92\u1e93\u1e9d\u046b\u046c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u06a5\u06a7\u054e\u042b\u042d\u1075\u0221\u0222\u054f\u0550\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0236\u0000\u0000\u0241\u0279\u228b\u1ee3\u1ee7\u1eea\u1ef1\u1ef4\u1efa\u1f26\u1f30\u1f65\u1f68\u1f8e\u1fb4\u1fe1\u1ff1\u2008\u200b\u2024\u202a\u2042\u2065\u2093\u20ac\u20c7\u20d9\u20e3\u20f7\u218c\u218d\u2288\u2289\u228a\u0000\u210e\u2135\u214c\u2191\u21c2\u21e3\u2215\u2234\u2255\u225c\u00eb\u00f0\u00f4\u00f8\u00fe\u0103\u0108\u010c\u0110\u0112\u0113\u0115\u0116\u0117\u0119\u011a\u011b\u011c\u011d\u011e\u0114\u10a1\u10d0\u114a\u119e\u11e4\u1224\u125c\u1292\u12c8\u12fd\u0429\u0223\u0224\u0416\u1f2f\u2134\u0127\u1eee\u1eed\u1ef7\u1ee4\u1f2c\u2238\u2244\u2262\u1fa0\u1fa5\u1f4a\u1faa\u1fab\u1f4f\u1fac' + '\u1f54\u1fff\u2000\u1fc8\u1fcd\u2001\u1fd2\u1fd8\u200f\u2012\u2013\u2014\u2015\u2018\u201c\u201f\u2020\u202d\u2030\u2031\u2032\u2033\u2034\u2035\u2036\u2039\u208a\u208b\u208c\u20c3\u20c5\u20e1\u2107\u2122\u2123\u2125\u2126\u212c\u212d\u2147\u2149\u2168\u216d\u216e\u216f\u2171\u2176\u2178\u217e\u217f\u2184\u2185\u218a\u21bb\u21bc\u21bd\u21be\u2211\u2206\u220a\u220f\u2210\u2223\u1fd7\u2231\u2228\u222d\u222e\u223a\u223b\u223e\u2241\u2246\u2249\u224c\u224d\u227b\u2280\u2281\u2251\u2282\u2287\u2290\u2293\u028d\u2230\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0551\u0000\u0000\u0000\u0000\u0000\u0000\u2235\u225d\u0000\u0000\u0552\u0000\u0000\u0000\u0000\u2021\u203a\u10a2\u10d1\u114b\u119f\u11e5\u1225\u125d\u1293\u12c9\u12fe\u208d\u20c6\u2109\u1ee6\u21c7\u222f' + '\u02c1\u028e\u028f\u0242\u0243\u0244\u0245\u0246\u0247\u027a\u046d\u046e\u046f\u0470\u0000\u0000\u2298\u0128\u2299\u229b\u229c\u229f\u229e\u22a1\u22a2\u22a3\u22a5\u22a6\u22a7\u22a8\u22a9\u22aa\u22ac\u22ad\u22ae\u22af\u22b0\u22b1\u22b2\u22b3\u22b5\u22b6\u22b7\u22b8\u22b9\u229a\u229d\u22a0\u0129\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0132\u0133\u0134\u0135\u0136\u0137\u0138\u0000\u0031\u007b\u0000\u0000\u0032\u007c\u0000\u0000\u0000\u0000\u0000\u0000\u22a4\u22ab\u22b4\u1f59\u1f5a\u1f5b\u1f5c\u1f5d\u1f5e\u1f60\u2002\u2003\u2022\u2023\u203b\u208e\u210a\u210b\u210c\u2132\u2133\u218b\u218e\u218f\u21e0\u21e1\u2212\u2213\u2214\u21bf\u203c\u203d\u208f\u2004\u2005\u2090\u203e\u2006\u1ef8\u1ef9\u228c\u228d\u228e\u2252\u2253\u2296\u2297\u2007\u2091\u2092\u2170' + '\u22de\u22e1\u22e2\u22e3\u22e5\u22e6\u22e7\u22e8\u22eb\u22ed\u22ee\u22ef\u22f1\u22f5\u22f6\u22f8\u22f9\u22fd\u22fe\u22ff\u2300\u2301\u2302\u2303\u22f2\u22df\u22e0\u22f0\u22e4\u22fa\u22fb\u22fc\u22f3\u22f4\u22e9\u22ea\u22f7\u22ec\u2305\u2306\u2307\u2308\u2309\u230a\u230b\u230c\u230d\u230e\u230f\u2304\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u10a3\u10d2\u114c\u11a0\u11e6\u1226\u125e\u1294\u12ca\u12ff\u2310\u2311\u2312\u2313\u2314\u2315\u2316\u2317\u2318\u2319\u231a\u231b\u231c\u231e\u2320\u2321\u2323\u2324\u2325\u2326\u2327\u2328\u2329\u232a\u232b\u232c\u232d\u232e\u232f\u2330\u231d\u231f\u2322\u0139\u013a\u013b\u013c\u013d\u013e\u013f\u0140\u0141\u2331\u2332\u0564\u02c2\u0225\u026e\u0000\u0000\u0000\u007d\u1076\u1077' + '\u1ec9\u1eca\u1ecb\u1ecc\u1ecd\u1ece\u1ecf\u1ed0\u1ed1\u1ed2\u1ed3\u1ed4\u1ed5\u1ed6\u1ed7\u1ed8\u1ed9\u1eda\u1edb\u1edc\u1edd\u1ede\u1edf\u1ee0\u00e8\u00e9\u1ee1\u1ee2\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00ea\u0000\u0000\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0000\u22c5\u22c6\u22c7\u22c8\u22c9\u22ca\u22cb\u22cc\u22cd\u22ce\u22cf\u22d0\u22d1\u22d2\u22d3\u22d4\u22d5\u22d6\u22d7\u22d8\u22d9\u22da\u22db\u22dc\u22dd\u007e\u007f\u0080\u0000\u0000\u0471\u0000\u22ba\u22bb\u22bc\u22bd\u22be\u22bf\u22c0\u22c1\u22c2\u22c3\u22c4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u1f5f\u1f62\u1fdd\u20e2\u212b\u214b\u21c0\u21e2\u1f23\u1f24\u203f\u2254\u1f25\u1f27\u201b\u20c4\u217d\u2250\u2040\u210d\u2177\u0000\u1f63\u1f64\u1fb1\u2041\u228f\u2124\u2148\u2209\u1f61\u1fb2\u1fb3\u1fde\u2190\u2108\u214a\u1fdf\u1fe0\u21c1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u011f\u00fb\u0101\u0106\u00ef\u00f3\u00f7\u0000\u0000\u0000\u0000\u0000\u0000\u00ee\u00f2\u00f6\u0000\u00fc\u00fd\u0107\u0120\u0121\u0125\u0126\u0123\u0124\u0122\u0102\u0118' + '\u0154\u0155\u0163\u0179\u2534\u2535\u2536\u253c\u253d\u253e\u253f\u2540\u2542\u2544\u2545\u2546\u2547\u2549\u254a\u254b\u254c\u254d\u254f\u2551\u2554\u2555\u2556\u2557\u2558\u255c\u255d\u255e\u255f\u2561\u2564\u2566\u2567\u2568\u2569\u256a\u256b\u256c\u256d\u256e\u2570\u2572\u2573\u2574\u2577\u2578\u2579\u257a\u257b\u257c\u257d\u257e\u257f\u2580\u2596\u2597\u0147\u2581\u2595\u259b\u259c\u259d\u259e\u259f\u25a0\u25a3\u25a5\u25a6\u25a8\u25aa\u25ab\u25ac\u25ad\u25ae\u25a7\u2598\u2531\u0000\u0000\u000e\u000b\u25a4\u2599\u259a\u254e\u2550\u2552\u2559\u2562\u2565\u256f\u2575\u2541\u2543\u25a1\u25a2\u02a3\u02a4\u10a4\u10d3\u114d\u11a1\u11e7\u1227\u125f\u1295\u12cb\u1300\u0473\u1052\u2533\u2537\u2538\u2539\u253a\u253b\u2560\u255a\u2576\u2553\u255b\u2582\u2563\u2571' + '\u25af\u0156\u0164\u017a\u0000\u25b0\u25b1\u25b2\u25b3\u25b4\u25b5\u25b6\u25b8\u0000\u0000\u25ba\u25bb\u0000\u0000\u25bc\u25bd\u25be\u25bf\u25c0\u25c1\u25c2\u25c3\u25c4\u25c5\u25c6\u25c7\u25c8\u25c9\u25ca\u25cc\u25ce\u25cf\u25d1\u25d2\u25d3\u25d4\u0000\u25d5\u25d6\u25d7\u25d8\u25d9\u25da\u25dc\u0000\u25de\u0000\u0000\u0000\u25e0\u25e1\u25e2\u25e3\u0000\u0000\u0148\u25e4\u25e5\u25e6\u25e7\u25e8\u25e9\u25ea\u25eb\u0000\u0000\u25ee\u25ef\u0000\u0000\u25f0\u25f1\u25f2\u25d0\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u25f3\u0000\u0000\u0000\u0000\u25cb\u25cd\u0000\u25db\u25b7\u25b9\u25ec\u25ed\u0000\u0000\u10a5\u10d4\u114e\u11a2\u11e8\u1228\u1260\u1296\u12cc\u1301\u25dd\u25df\u1078\u1079\u1019\u101a\u101b\u101c\u101d\u101e\u0565\u107a\u25f4\u0478\u018b\u0000' + '\u0000\u0157\u0165\u017b\u0000\u25fa\u25fb\u25ff\u2600\u25f7\u25f8\u0000\u0000\u0000\u0000\u2601\u25fc\u0000\u0000\u25f9\u25fd\u2606\u2607\u2609\u260b\u260c\u260d\u260e\u260f\u2611\u2612\u2613\u2614\u2615\u2616\u2617\u2618\u2619\u261a\u261b\u261c\u0000\u261d\u261e\u2620\u2621\u2622\u2623\u2625\u0000\u2626\u2627\u0000\u2628\u2603\u0000\u2602\u2604\u0000\u0000\u0149\u0000\u262a\u262b\u262c\u262d\u262e\u0000\u0000\u0000\u0000\u262f\u2630\u0000\u0000\u2631\u2632\u2633\u0000\u0000\u0000\u2605\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2608\u260a\u2610\u2629\u0000\u261f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u10a6\u10d5\u114f\u11a3\u11e9\u1229\u1261\u1297\u12cd\u1302\u018c\u018d\u25fe\u25f6\u25f5\u2624\u0479\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0158\u0166\u017c\u0000\u2635\u2636\u2637\u2638\u2639\u263a\u263b\u263d\u263f\u0000\u2640\u2641\u2642\u0000\u2643\u2644\u2645\u2646\u2647\u2648\u2649\u264a\u264b\u264c\u264e\u264f\u2650\u2651\u2652\u2653\u2654\u2655\u2656\u2657\u2658\u2659\u0000\u265a\u265b\u265c\u265d\u265e\u265f\u2660\u0000\u2661\u2667\u0000\u2662\u2663\u2664\u2665\u2666\u0000\u0000\u014a\u2668\u2669\u266a\u266b\u266c\u266d\u266e\u266f\u2672\u0000\u2673\u2674\u2675\u0000\u2676\u2677\u2678\u0000\u0000\u2634\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u263c\u263e\u2670\u2671\u0000\u0000\u10a7\u10d6\u1150\u11a4\u11ea\u122a\u1262\u1298\u12ce\u1303\u047a\u107b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u264d\u010d\u0109\u0111\u014b\u014c\u014d' + '\u0000\u0159\u0167\u017d\u0000\u2679\u267a\u267b\u267c\u267d\u267e\u267f\u2681\u0000\u0000\u2683\u2684\u0000\u0000\u2685\u2686\u2687\u2688\u2689\u268a\u268b\u268c\u268d\u268e\u268f\u2690\u2691\u2692\u2693\u2695\u2697\u2698\u2699\u269a\u269b\u269c\u0000\u269d\u269e\u269f\u26a0\u26a1\u26a2\u26a4\u0000\u26a5\u26a6\u0000\u26a7\u26a9\u26aa\u26ab\u26ac\u0000\u0000\u014e\u26ad\u26ae\u26af\u26b0\u26b1\u26b2\u26b3\u26b4\u0000\u0000\u26b7\u26b8\u0000\u0000\u26b9\u26ba\u26bb\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0033\u26bc\u26bd\u0000\u0000\u0000\u0000\u2694\u2696\u0000\u26a3\u2680\u2682\u26b5\u26b6\u0000\u0000\u10a8\u10d7\u1151\u11a5\u11eb\u122b\u1263\u1299\u12cf\u1304\u0566\u26a8\u101f\u1020\u1021\u1022\u1023\u1024\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0168\u26cb\u0000\u26bf\u26c0\u26c1\u26c2\u26c3\u26c4\u0000\u0000\u0000\u26c5\u26c6\u26c7\u0000\u26c8\u26c9\u26ca\u26cc\u0000\u0000\u0000\u26cd\u26ce\u0000\u26de\u0000\u26cf\u26d0\u0000\u0000\u0000\u26d1\u26d2\u0000\u0000\u0000\u26d3\u26dd\u26d4\u0000\u0000\u0000\u26d5\u26d6\u26d7\u26dc\u26d8\u26db\u26da\u26d9\u26df\u26e0\u26e1\u26e2\u0000\u0000\u0000\u0000\u26e3\u26e4\u26e5\u26e6\u26e7\u0000\u0000\u0000\u26e8\u26e9\u26ea\u0000\u26eb\u26ec\u26ed\u26ee\u0000\u0000\u26be\u0000\u0000\u0000\u0000\u0000\u0000\u26ef\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u10a9\u10d8\u1152\u11a6\u11ec\u122c\u1264\u129a\u12d0\u1305\u102b\u102c\u102d\u0567\u0568\u0569\u056a\u056b\u056c\u107d\u056d\u0000\u0000\u0000\u0000\u0000' + '\u015a\u015b\u0169\u017e\u016a\u26f0\u26f1\u26f2\u26f3\u26f4\u26f5\u26f6\u26f8\u0000\u26fa\u26fb\u26fc\u0000\u26fd\u26fe\u26ff\u2700\u2701\u2702\u2703\u2704\u2705\u2707\u2708\u270a\u270b\u270c\u270d\u270e\u270f\u2710\u2711\u2712\u2713\u2714\u2715\u0000\u2716\u2717\u2718\u2719\u271a\u271b\u271c\u271d\u271e\u2724\u2725\u271f\u2720\u2721\u2722\u2723\u0000\u0000\u0000\u2727\u2728\u2729\u272a\u272b\u272c\u272d\u272e\u0000\u2731\u2732\u2733\u0000\u2734\u2735\u2736\u2737\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2738\u2739\u0000\u2706\u2709\u2726\u0000\u0000\u0000\u0000\u0000\u26f7\u26f9\u272f\u2730\u0000\u0000\u10aa\u10d9\u1153\u11a7\u11ed\u122d\u1265\u129b\u12d1\u1306\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u047b\u10ab\u10da\u1154\u11a8\u10db\u1155\u11a9\u056e' + '\u2771\u015c\u016b\u017f\u047c\u273a\u273b\u273c\u273d\u273e\u273f\u2740\u2742\u0000\u2744\u2745\u2746\u0000\u2747\u2748\u2749\u274a\u274b\u274c\u274d\u274e\u274f\u2750\u2751\u2752\u2753\u2754\u2755\u2756\u2757\u2758\u2759\u275a\u275b\u275c\u275d\u0000\u275e\u275f\u2760\u2761\u2762\u2763\u2764\u2765\u2766\u276c\u0000\u2767\u2768\u2769\u276a\u276b\u0000\u0000\u014f\u276e\u2772\u2773\u2774\u2775\u2776\u2777\u2778\u0000\u277b\u277c\u277d\u0000\u277e\u277f\u2780\u2781\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2782\u2783\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u276d\u0000\u2741\u2743\u2779\u277a\u0000\u0000\u10ac\u10dc\u1156\u11aa\u11ee\u122e\u1266\u129c\u12d2\u1307\u0000\u276f\u2770\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u016c\u015d\u016d\u0180\u27c6\u2784\u2785\u2786\u2787\u2789\u278a\u278b\u278d\u0000\u278f\u2790\u2791\u0000\u2792\u2793\u2794\u2795\u2797\u2798\u2799\u279a\u279b\u279c\u279d\u279e\u279f\u27a0\u27a1\u27a2\u27a3\u27a4\u27a6\u27a7\u27a8\u27a9\u27aa\u27ac\u27ad\u27ae\u27af\u27b0\u27b1\u27b3\u27b5\u27c3\u27b8\u27bf\u27c1\u27ba\u27bb\u27bc\u27bd\u27be\u27c4\u27d8\u27d9\u27c5\u27c7\u27c8\u27c9\u27ca\u27cb\u27cc\u27cd\u0000\u27d0\u27d1\u27d2\u0000\u27d3\u27d4\u27d5\u27d7\u27b6\u056f\u0000\u0000\u0000\u0000\u27b2\u27b4\u27c2\u27d6\u102e\u102f\u1030\u1031\u1032\u1033\u1034\u2788\u278c\u278e\u27ce\u27cf\u0000\u0000\u10ad\u10dd\u1157\u11ab\u11ef\u122f\u1267\u129d\u12d3\u1308\u1035\u1036\u1037\u1038\u1039\u103a\u103b\u103c\u103d\u0570\u27a5\u27ab\u27b7\u27b9\u27c0\u2796' + '\u0000\u015e\u016e\u0181\u0000\u27da\u27db\u27dc\u27dd\u27de\u27df\u27e0\u27e1\u27e2\u27e3\u27e4\u27e5\u27e6\u27e7\u27e8\u27e9\u27ea\u27eb\u0000\u0000\u0000\u27ec\u27ed\u27ee\u27ef\u27f0\u27f1\u27f2\u27f3\u27f4\u27f5\u27f6\u27f7\u27f8\u27f9\u27fa\u27fb\u27fc\u27fd\u27fe\u27ff\u2800\u2801\u2802\u2803\u0000\u2804\u2805\u2806\u2807\u2808\u2809\u280a\u280b\u280c\u0000\u280d\u0000\u0000\u280e\u280f\u2810\u2811\u2812\u2813\u2814\u0000\u0000\u0000\u2826\u0000\u0000\u0000\u0000\u2815\u2816\u2817\u2818\u2819\u281a\u0000\u281b\u0000\u281c\u2820\u2821\u2822\u2823\u2824\u2825\u281e\u0000\u0000\u0000\u0000\u0000\u0000\u10ae\u10de\u1158\u11ac\u11f0\u1230\u1268\u129e\u12d4\u1309\u0000\u0000\u281d\u281f\u047d\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u2904\u2905\u2906\u2907\u2908\u2909\u290a\u290b\u290c\u290d\u290e\u290f\u2910\u2911\u2912\u2913\u2914\u2915\u2916\u2917\u2918\u2919\u291a\u291b\u291c\u291d\u291e\u291f\u2920\u2921\u2922\u2923\u2924\u2925\u2926\u2927\u2928\u2929\u292a\u292b\u292c\u292d\u292e\u292f\u2930\u2931\u2932\u2933\u2934\u2935\u2936\u2937\u2938\u2939\u293a\u293b\u293c\u293d\u0000\u0000\u0000\u0000\u107e\u293e\u293f\u2940\u2941\u2942\u2943\u1053\u0193\u0194\u0195\u0196\u0197\u0198\u0199\u0192\u047e\u10af\u10df\u1159\u11ad\u11f1\u1231\u1269\u129f\u12d5\u130a\u047f\u0480\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u2945\u2946\u0000\u2947\u0000\u2948\u2949\u294a\u294b\u294d\u0000\u294e\u2951\u294f\u2952\u2953\u2954\u2955\u2956\u2957\u2958\u2959\u295a\u295b\u295c\u295d\u295e\u295f\u2960\u2961\u2962\u2963\u2964\u2965\u2966\u0000\u2967\u0000\u2968\u2969\u296a\u294c\u296b\u296e\u296f\u2970\u2971\u2972\u2973\u2974\u2975\u2976\u2977\u2978\u2979\u297a\u297b\u297c\u297d\u297e\u297f\u0000\u0000\u2980\u2981\u2982\u2983\u2984\u0000\u1054\u0000\u019a\u019b\u019c\u019d\u019e\u019f\u0000\u0000\u10b0\u10e0\u115a\u11ae\u11f2\u1232\u126a\u12a0\u12d6\u130b\u0000\u0000\u296c\u296d\u2944\u2950\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u2a1f\u0578\u0579\u057a\u0483\u0484\u0485\u0486\u0487\u0488\u0489\u048c\u048d\u048e\u048f\u0490\u0491\u0492\u0493\u057b\u025e\u057c\u057d\u057e\u0000\u0000\u057f\u0580\u0581\u0582\u0583\u0584\u10b1\u10e1\u115b\u11af\u11f3\u1233\u126b\u12a1\u12d7\u130c\u10fa\u1173\u11c7\u120b\u124b\u1284\u12b9\u12ef\u1324\u10c8\u0585\u0000\u0586\u0000\u0587\u01a2\u0386\u0387\u0388\u0389\u0000\u0000\u29c8\u29cd\u29cf\u29d0\u29d3\u29d5\u29d7\u29d9\u0000\u29db\u29dd\u29df\u29e1\u29e2\u29e5\u29e7\u29e9\u29eb\u29ec\u29ef\u29f1\u29f3\u29f5\u29f6\u29f9\u29fb\u29fd\u29ff\u2a00\u2a03\u2a06\u2a08\u2a0a\u2a0c\u2a0f\u2a14\u2a16\u2a18\u2a1a\u2a1c\u2a1e\u29c9\u2a10\u29cc\u2a13\u0000\u0000\u0000\u0000\u2a29\u2a2a\u2a2b\u2a2e\u2a2f\u2a30\u2a31\u2a32\u2a33\u2a34\u2a35\u2a36\u2a37\u016f\u0182' + '\u2a2c\u2a2d\u0000\u0000\u2a38\u0494\u0000\u0000\u2a21\u2a23\u2a27\u2a28\u2a25\u2a22\u2a24\u2a26\u29ca\u29ce\u29d1\u29d2\u29d4\u29d6\u29d8\u29da\u0000\u29dc\u29de\u29e0\u29e3\u29e4\u29e6\u29e8\u29ea\u29ed\u29ee\u29f0\u29f2\u29f4\u29f7\u29f8\u29fa\u29fc\u29fe\u2a01\u2a02\u2a04\u2a07\u2a09\u2a0b\u2a0d\u2a11\u2a15\u2a17\u2a19\u2a1b\u2a1d\u2a20\u29cb\u2a05\u2a0e\u2a12\u0000\u0588\u0589\u058a\u058b\u058c\u058d\u058e\u058f\u0000\u0590\u0591\u0592\u0593\u0594\u0595\u0000\u0596\u0597\u048a\u048b\u0495\u0496\u0497\u0598\u0599\u059a\u059b\u0498\u0499\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u2bbe\u2bc0\u2bc2\u2bc6\u2bc9\u2bcb\u2bce\u2bd2\u2bd7\u2bde\u2be2\u2be3\u2be5\u2be7\u2bea\u2bed\u2bf1\u2bf2\u2bf3\u2bf6\u2bf9\u2bfd\u2bfe\u2c04\u2c07\u2c0a\u2c0c\u2c0e\u2c12\u2c14\u2c1b\u2c1e\u2c24\u2c2b\u2c2c\u2c2d\u2c2e\u2c2f\u2c30\u2c35\u2c36\u2c37\u2c38\u2c3a\u2c39\u2c3e\u2c40\u2c42\u2c45\u2c4a\u2c4e\u2c41\u2c50\u2c4c\u0170\u01a6\u0183\u2c56\u2c57\u2c0d\u2c11\u2c15\u2c21\u2c1c\u10b2\u10e2\u115c\u11b0\u11f4\u1234\u126c\u12a2\u12d8\u130d\u02ae\u02af\u049d\u049e\u049f\u04a0\u2c18\u2c19\u2c31\u2c32\u2c33\u2c34\u2c46\u2c47\u2c48\u2c49\u2bca\u2bd8\u2c26\u2c27\u2bfc\u2c0b\u2c13\u2bdc\u2c51\u2c58\u2c59\u2c1a\u2c2a\u2c52\u2c53\u2c5a\u2c5b\u2c5c\u2c5d\u2c5e\u2bee\u2c28\u2c29\u2c3f\u2c3c\u2c43\u2c44\u2bbf\u2bc1\u2bc3\u2bcc\u2bd5\u2bdf\u2bf4\u2bfa\u2bff\u2c00\u2c05' + '\u2c17\u2c1f\u2c16\u2c3b\u2c4b\u2c4d\u2c55\u2c5f\u2c61\u2c64\u2c65\u2c60\u2c62\u2c63\u2c02\u2c66\u10b3\u10e3\u115d\u11b1\u11f5\u1235\u126d\u12a3\u12d9\u130e\u2c67\u2c68\u2c3d\u2c4f\u059e\u059f\u1d7b\u1d7f\u1d83\u1d87\u1d8b\u1d8f\u1d93\u1d9b\u1d9f\u1da3\u1da7\u1dab\u1db0\u1db8\u1dbc\u1dc0\u1dc4\u1dc8\u1dcc\u1dd4\u1dd8\u1ddc\u1de0\u1de4\u1de8\u1dec\u1df0\u1df4\u1df8\u1dfc\u1e00\u1e08\u1e0c\u1d97\u1db4\u1dd0\u1e04\u1e10\u0000\u1e16\u0000\u0000\u0000\u0000\u0000\u1e20\u0000\u0000\u1d78\u1d7c\u1d80\u1d84\u1d88\u1d8c\u1d90\u1d98\u1d9c\u1da0\u1da4\u1da8\u1dac\u1db5\u1db9\u1dbd\u1dc1\u1dc5\u1dc9\u1dd1\u1dd5\u1dd9\u1ddd\u1de1\u1de5\u1de9\u1ded\u1df1\u1df5\u1df9\u1dfd\u1e05\u1e09\u1d94\u1db1\u1dcd\u1e01\u1e0d\u1e11\u1e13\u1e17\u1e19\u1e1b\u02c3\u1dae\u1e1d\u1e21\u1e23' + '\u3430\u3435\u3438\u343d\u3442\u3445\u344a\u344f\u3454\u3457\u345c\u345f\u3465\u346b\u346e\u3474\u3479\u347e\u3483\u3488\u3489\u348b\u348d\u348e\u348f\u3490\u3491\u3494\u3495\u3497\u3499\u349b\u349c\u349e\u34a1\u34a3\u34a5\u34a6\u34a7\u34a8\u34aa\u34ab\u34ad\u34ae\u34b0\u34b2\u34b4\u34b6\u34b8\u34b9\u34ba\u34bc\u34bd\u34be\u34bf\u34c1\u34c2\u34c3\u34c4\u34c5\u34c6\u34c7\u34c8\u34c9\u34ca\u34cc\u34cd\u34ce\u34cf\u34d0\u34d1\u34d2\u34d4\u34d5\u34d6\u34d7\u34d8\u34da\u34db\u34dc\u34dd\u34de\u34df\u34e0\u34e1\u34e2\u34e3\u34e4\u34e6\u34e8\u34ea\u34eb\u34ec\u34ed\u34ee\u350c\u350d\u3510\u3513\u3516\u3519\u351c\u351f\u3522\u3525\u3528\u352b\u352e\u3531\u3534\u3537\u353a\u353d\u3540\u3543\u3546\u3549\u354c\u354f\u3550\u3551\u3552\u3553\u3554\u3555\u3556\u3557\u3558' + '\u3559\u355a\u355b\u355c\u355d\u355f\u3561\u3562\u3563\u3565\u3566\u3567\u3568\u3569\u356a\u356b\u356c\u356d\u356f\u3571\u3572\u3574\u3575\u3576\u3577\u3578\u3579\u357a\u357b\u357c\u357d\u357f\u3580\u3581\u3583\u3584\u3585\u3586\u3587\u3588\u35a0\u35a1\u35a2\u35a5\u35a6\u35a9\u35ac\u35ad\u35ae\u35b1\u35b4\u35b7\u35ba\u35bd\u35c0\u35c1\u35c2\u35c3\u35c4\u35c5\u35c6\u35c7\u35c8\u35c9\u35ca\u35cb\u35cc\u35cd\u35ce\u35cf\u35d0\u35d1\u35d3\u35d5\u35d6\u35d7\u35d8\u35da\u35db\u35dd\u35de\u35df\u35e0\u35e1\u35e3\u35e4\u35e5\u35e6\u35e8\u35e9\u35eb\u35ec\u35ed\u35ee\u35f0\u35f1\u35f3\u35f4\u35f5\u35f6\u35f7\u35f8\u35f9\u35fa\u35fb\u35fc\u35fd\u35fe\u35ff\u3600\u3601\u3602\u3603\u3604\u3606\u3608\u3609\u360a\u360b\u360c\u360d\u360e\u360f\u3610\u3611\u3612\u3613\u3614' + '\u236c\u236d\u236e\u236f\u2370\u2371\u2372\u2373\u2374\u2375\u2376\u2377\u2378\u2379\u237a\u237b\u237d\u237e\u237f\u2380\u2381\u2382\u2383\u2384\u2385\u2386\u2387\u2388\u2389\u238a\u238b\u238c\u2392\u2393\u2394\u2395\u2396\u2397\u2398\u2399\u239a\u239b\u239c\u239d\u239e\u239f\u23a0\u23a1\u23a3\u23a4\u23a5\u23a6\u23a7\u23a8\u23a9\u23aa\u23b2\u23b3\u23b4\u23b5\u23b6\u23b7\u23b8\u23b9\u23bb\u23bc\u23bd\u23be\u23bf\u23c0\u23c1\u23c2\u23c3\u0000\u23c4\u23c5\u23c6\u23c7\u0000\u0000\u23c8\u23c9\u23ca\u23cb\u23cc\u23cd\u23ce\u0000\u23cf\u0000\u23d0\u23d1\u23d2\u23d3\u0000\u0000\u23d4\u23d5\u23d6\u23d7\u23d8\u23d9\u23da\u23db\u23e1\u23e2\u23e3\u23e4\u23e5\u23e6\u23e7\u23e8\u23e9\u23ea\u23eb\u23ec\u23ed\u23ee\u23ef\u23f0\u23f2\u23f3\u23f4\u23f5\u23f6\u23f7\u23f8\u23f9' + '\u23fb\u23fc\u23fd\u23fe\u23ff\u2400\u2401\u2402\u2403\u0000\u2404\u2405\u2406\u2407\u0000\u0000\u2408\u2409\u240a\u240b\u240c\u240d\u240e\u240f\u2411\u2412\u2413\u2414\u2415\u2416\u2417\u2418\u241a\u241b\u241c\u241d\u241e\u241f\u2420\u2421\u2423\u2424\u2425\u2426\u2427\u2428\u2429\u242a\u242b\u0000\u242c\u242d\u242e\u242f\u0000\u0000\u2430\u2431\u2432\u2433\u2434\u2435\u2436\u0000\u2437\u0000\u2438\u2439\u243a\u243b\u0000\u0000\u243c\u243d\u243e\u243f\u2440\u2441\u2442\u2443\u2444\u2445\u2446\u2447\u2448\u2449\u244a\u0000\u244b\u244c\u244d\u244e\u244f\u2450\u2451\u2452\u245a\u245b\u245c\u245d\u245e\u245f\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2479\u247a\u247b\u247c\u247d\u247e\u247f\u2480' + '\u2482\u2483\u2484\u2485\u2486\u2487\u2488\u2489\u248b\u248c\u248d\u248e\u248f\u2490\u2491\u2492\u2493\u0000\u2494\u2495\u2496\u2497\u0000\u0000\u2498\u2499\u249a\u249b\u249c\u249d\u249e\u249f\u24a4\u24a5\u24a6\u24a7\u24a8\u24a9\u24aa\u24ab\u24ad\u24ae\u24af\u24b0\u24b1\u24b2\u24b3\u24b4\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c6\u24c7\u24c8\u24c9\u24ca\u24cb\u24cc\u24cd\u24d5\u24d6\u24d7\u24d8\u24d9\u24da\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e9\u24ea\u24eb\u24ec\u24ed\u24ee\u24ef\u24f0\u24f6\u24f7\u24f8\u0000\u0000\u0144\u0143\u0142\u02c4\u0257\u0290\u0258\u0259\u025a\u025b\u027b\u02c5\u10e4\u115e\u11b2\u11f6\u1236\u126e\u12a4\u12da\u130f\u103e\u103f\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u0000\u0000\u0000' + '\u238d\u238e\u238f\u2390\u23dc\u23dd\u23de\u23df\u24e5\u24e6\u24e7\u24e8\u24f1\u24f2\u24f3\u24f4\u0518\u0519\u051a\u051b\u051c\u051d\u051e\u051f\u0520\u0521\u0000\u0000\u0000\u0000\u0000\u0000\u2ee3\u2ee5\u2ee7\u2ee9\u2eeb\u2eed\u2eef\u2ef1\u2ef3\u2ef5\u2ef7\u2ef9\u2efb\u2efd\u2eff\u2f01\u2f03\u2f05\u2f07\u2f09\u2f0b\u2f0d\u2f0f\u2f11\u2f13\u2f15\u2f17\u2f19\u2f1b\u2f1d\u2f1f\u2f21\u2f23\u2f25\u2f27\u2f29\u2f2b\u2f2d\u2f2f\u2f31\u2f33\u2f35\u2f37\u2f39\u2f3b\u2f3d\u2f3f\u2f41\u2f43\u2f45\u2f47\u2f49\u2f4b\u2f4d\u2f4f\u2f51\u2f53\u2f55\u2f57\u2f59\u2f5b\u2f5d\u2f5f\u2f61\u2f63\u2f65\u2f67\u2f69\u2f6b\u2f6d\u2f6f\u2f71\u2f73\u2f75\u2f77\u2f79\u2f7b\u2f7d\u2f7f\u2f81\u2f83\u2f85\u2f87\u2f89\u2f8b\u2f8d\u0000\u0000\u2f82\u2f84\u2f86\u2f88\u2f8a\u2f8c\u0000\u0000' + '\u01fe\u2f8e\u2f8f\u2f90\u2f91\u2f92\u2f93\u2f94\u2f95\u2f96\u2f97\u2f98\u2f99\u2f9a\u2f9b\u2f9c\u2f9d\u2f9e\u2f9f\u2fa0\u2fa1\u2fa2\u2fa3\u2fa4\u2fa5\u2fa6\u2fa7\u2fa8\u2fa9\u2faa\u2fab\u2fac\u2fad\u2fae\u2faf\u2fb0\u2fb1\u2fb2\u2fb3\u2fb4\u2fb5\u2fb6\u2fb7\u2fb8\u2fb9\u2fba\u2fbb\u2fbc\u2fbd\u2fbe\u2fbf\u2fc0\u2fc1\u2fc2\u2fc3\u2fc4\u2fc5\u2fc6\u2fc7\u2fc8\u2fc9\u2fca\u2fcb\u2fcc\u2fcd\u2fce\u2fcf\u2fd0\u2fd1\u2fd2\u2fd3\u2fd4\u2fd5\u2fd6\u2fd7\u2fd8\u2fd9\u2fda\u2fdb\u2fdc\u2fdd\u2fde\u2fdf\u2fe0\u2fe1\u2fe2\u2fe3\u2fe4\u2fe5\u2fe6\u2fe7\u2fe8\u2fe9\u2fea\u2feb\u2fec\u2fed\u2fee\u2fef\u2ff0\u2ff1\u2ff2\u2ff3\u2ff4\u2ff5\u2ff6\u2ff7\u2ff8\u2ff9\u2ffa\u2ffb\u2ffc\u2ffd\u2ffe\u2fff\u3000\u3001\u3002\u3003\u3004\u3005\u3006\u3007\u3008\u3009\u300a\u300b\u300c' + '\u300d\u300e\u300f\u3010\u3011\u3012\u3013\u3014\u3015\u3016\u3017\u3018\u3019\u301a\u301b\u301c\u301d\u301e\u301f\u3020\u3021\u3022\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u302a\u302b\u302c\u302d\u302e\u302f\u3030\u3031\u3032\u3033\u3034\u3035\u3036\u3037\u3038\u3039\u303a\u303b\u303c\u303d\u303e\u303f\u3040\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304a\u304b\u304c\u304d\u304e\u304f\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305a\u305b\u305c\u305d\u305e\u305f\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306a\u306b\u306c\u306d\u306e\u306f\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307a\u307b\u307c\u307d\u307e\u307f\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308a\u308b\u308c' + '\u308d\u308e\u308f\u3090\u3091\u3092\u3093\u3094\u3095\u3096\u3097\u3098\u3099\u309a\u309b\u309c\u309d\u309e\u309f\u30a0\u30a1\u30a2\u30a3\u30a4\u30a5\u30a6\u30a7\u30a8\u30a9\u30aa\u30ab\u30ac\u30ad\u30ae\u30af\u30b0\u30b1\u30b2\u30b3\u30b4\u30b5\u30b6\u30b7\u30b8\u30b9\u30ba\u30bb\u30bc\u30bd\u30be\u30bf\u30c0\u30c1\u30c2\u30c3\u30c4\u30c5\u30c6\u30c7\u30c8\u30c9\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d0\u30d1\u30d2\u30d3\u30d4\u30d5\u30d6\u30d7\u30d8\u30d9\u30da\u30db\u30dc\u30dd\u30de\u30df\u30e0\u30e1\u30e2\u30e3\u30e4\u30e5\u30e6\u30e7\u30e8\u30e9\u30ea\u30eb\u30ec\u30ed\u30ee\u30ef\u30f0\u30f1\u30f2\u30f3\u30f4\u30f5\u30f6\u30f7\u30f8\u30f9\u30fa\u30fb\u30fc\u30fd\u30fe\u30ff\u3100\u3101\u3102\u3103\u3104\u3105\u3106\u3107\u3108\u313b\u3109\u310b\u310c' + '\u310d\u310e\u310f\u3110\u3111\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119\u311a\u311c\u311d\u311e\u311f\u3120\u3121\u3122\u3123\u312a\u312b\u312c\u312d\u312e\u312f\u3130\u3131\u3132\u3133\u3134\u3135\u3136\u3137\u3138\u3139\u313a\u313c\u313d\u313e\u313f\u3140\u3141\u3142\u3143\u3144\u3145\u3146\u3147\u3148\u3149\u314a\u314b\u314c\u314d\u314e\u314f\u3150\u3151\u3152\u3153\u3154\u3155\u3156\u3157\u3158\u3159\u315a\u315b\u315c\u315d\u315e\u315f\u3160\u3161\u3162\u3163\u3164\u3165\u3166\u3167\u3168\u3169\u316a\u316b\u316c\u316d\u316e\u316f\u3170\u3171\u3172\u3173\u3174\u3175\u3176\u3177\u3178\u3179\u317a\u317b\u317c\u317d\u317e\u317f\u3180\u3181\u3182\u3183\u3184\u3185\u3186\u3187\u3188\u3189\u318a\u318b\u318c\u318d\u318e\u318f\u3190\u3191\u3192\u3193\u3194' + '\u3195\u3196\u3197\u3198\u3199\u319a\u319b\u319c\u319d\u319e\u319f\u31a0\u31a1\u31a2\u31a3\u31a4\u31a5\u31a6\u31a7\u31a8\u31a9\u31aa\u31ab\u31ac\u31ad\u31ae\u31af\u31b0\u31b1\u31b2\u31b3\u31b4\u31b5\u31b6\u31b7\u31b8\u31b9\u31ba\u31bb\u31bc\u31bd\u31be\u31bf\u31c0\u31c1\u31c2\u31c3\u31c4\u31c5\u31c6\u31c7\u31c8\u31c9\u31ca\u31cb\u31cc\u31cd\u31ce\u31cf\u31d0\u31d1\u31d2\u31d3\u31d4\u31d5\u31d6\u31d7\u31d8\u31d9\u31da\u31db\u31dc\u31dd\u31de\u31df\u31e0\u31e1\u31e2\u31e3\u31e4\u31e5\u31e6\u31e7\u31e8\u31e9\u31ea\u31eb\u31ec\u31ed\u31ee\u31ef\u31f0\u31f1\u31f2\u31f3\u31f4\u31f5\u31f6\u31f7\u31f8\u31f9\u31fa\u31fb\u31fc\u31fd\u31fe\u31ff\u3200\u3201\u059c\u0293\u310a\u311b\u3124\u3125\u3126\u3127\u3128\u3129\u3202\u3203\u3204\u3205\u3206\u3207\u3208\u3209\u320a' + '\u01de\u3251\u3252\u3253\u3254\u3255\u3256\u3257\u3258\u3259\u325a\u325b\u325c\u325d\u325e\u325f\u3260\u3261\u3262\u3263\u3264\u3265\u3266\u3267\u3268\u3269\u326a\u038a\u038b\u0000\u0000\u0000\u326b\u326c\u326d\u32b6\u326e\u326f\u3270\u3271\u3273\u3274\u32b2\u32b4\u3275\u3276\u3277\u3279\u327a\u327b\u327c\u327d\u327e\u327f\u3280\u3282\u32b9\u3283\u3285\u3286\u3287\u3288\u3289\u328a\u328b\u328c\u328d\u328f\u3290\u3291\u3292\u3294\u3295\u3297\u3298\u3299\u329b\u329c\u329d\u329f\u32a0\u32a1\u32a2\u32a3\u32a4\u3296\u32a5\u32a7\u32a8\u32a9\u32ab\u32ac\u32ad\u32ae\u32af\u32b0\u32b7\u32bb\u32bc\u32b8\u32ba\u32bd\u32be\u32bf\u32c0\u3284\u329a\u0262\u0263\u0264\u3293\u32aa\u3272\u3281\u329e\u32b1\u3278\u328e\u32a6\u32b3\u32b5\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u2adb\u2adc\u2add\u2ade\u2adf\u2ae0\u2ae1\u2ae2\u2ae3\u2ae4\u2ae5\u2ae6\u2ae7\u0000\u2ae8\u2ae9\u2aea\u2aeb\u2aec\u2aed\u2aee\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2aef\u2af0\u2af1\u2af2\u2af3\u2af4\u2af5\u2af6\u2af7\u2af8\u2af9\u2afa\u2afb\u2afc\u2afd\u2afe\u2aff\u2b00\u2b01\u2b02\u2b03\u02ab\u02ac\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2b04\u2b05\u2b06\u2b07\u2b08\u2b09\u2b0a\u2b0b\u2b0c\u2b0d\u2b0e\u2b0f\u2b10\u2b11\u2b12\u2b13\u2b14\u2b15\u2b16\u2b17\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2b18\u2b19\u2b1a\u2b1b\u2b1c\u2b1d\u2b1e\u2b1f\u2b20\u2b21\u2b22\u2b23\u2b24\u0000\u2b25\u2b26\u2b27\u0000\u2b28\u2b29\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u2c6f\u2c70\u2c71\u2c72\u2c73\u2c74\u2c75\u2c76\u2c77\u2c78\u2c79\u2c7a\u2c7b\u2c7c\u2c7d\u2c7e\u2c7f\u2c80\u2c81\u2c82\u2c83\u2c84\u2c85\u2c86\u2c87\u2c88\u2c89\u2c8a\u2c8b\u2c8c\u2c8d\u2c8e\u2c8f\u2c90\u2c91\u2c93\u2c94\u2c95\u2c96\u2c97\u2c98\u2c99\u2c9a\u2c9b\u2c9c\u2c9d\u2c9e\u2c9f\u2ca0\u2ca1\u2ca2\u2ca3\u0000\u0000\u2ca4\u2ca5\u2ca6\u2ca7\u2ca8\u2ca9\u2caa\u2cab\u2cac\u2cad\u2cae\u2caf\u2cb0\u2cb1\u2cb2\u2cb3\u0171\u0184\u01a7\u01a8\u01a9\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u2cb4\u0000\u02b0\u02b1\u025f\u1055\u04a1\u04a2\u04a3\u107f\u2c92\u003b\u0000\u0000\u10b4\u10e5\u115f\u11b3\u11f7\u1237\u126f\u12a5\u12db\u1310\u0000\u0000\u0000\u0000\u0000\u0000\u10b5\u10e6\u1160\u11b4\u11f8\u1238\u1270\u12a6\u12dc\u1311\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0472\u028c\u0226\u0291\u025c\u025d\u0200\u0201\u0227\u0292\u0000\u0000\u0000\u0000\u0000\u0000\u10b6\u10e7\u1161\u11b5\u11f9\u1239\u1271\u12a7\u12dd\u1312\u0000\u0000\u0000\u0000\u0000\u0000\u2e42\u2e44\u2e47\u2e4d\u2e4f\u2e52\u2e54\u2e57\u2e58\u2e59\u2e5e\u2e60\u2e63\u2e65\u2e6a\u2e6c\u2e6d\u2e6e\u2e75\u2e78\u2e7b\u2e81\u2e85\u2e88\u2e8a\u2e8c\u2e8f\u2e94\u2e95\u2e98\u2e9c\u2e9f\u2ea0\u2ea1\u2ea2\u2e41\u2e45\u2e48\u2e4e\u2e50\u2e53\u2e55\u2e5a\u2e5f\u2e61\u2e64\u2e66\u2e6b\u2e76\u2e79\u2e7c\u2e82\u2e96\u2e86\u2e8b\u2e90\u2e9a\u2e9d\u2ea3\u2ea4\u2e7f\u2e46\u2e49\u2e4c\u2e56\u2e51\u2e5b\u2e91\u2e67\u2e69\u2e62\u2e6f\u2e77\u2e7a\u2e83\u2e8d\u2e9b\u2e9e\u2e97\u2e99\u2ea5\u2e7d\u2e87\u2e4a\u2e92\u2e89\u2e8e\u2e84\u2e7e\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u2e3a\u2e3b\u2e3c\u2e3d\u2e3e\u2e3f\u2e40\u2e43\u2e4b\u2e93\u2e5c\u2e80\u2ea6\u2ea8\u2ea9\u2eab\u2eac\u2eaf\u2eb1\u2eb2\u2eb4\u2eb6\u2eb8\u2eb9\u2ead\u2eb7\u2e68\u2e5d\u2e70\u2e71\u2ea7\u2eaa\u2eae\u2eb0\u2e72\u2eb5\u2e73\u2e74\u2eba\u2ebb\u2eb3\u2ebd\u2ebc\u0000\u0000\u0000\u0000\u0000\u320b\u320c\u320d\u320e\u320f\u3210\u3211\u3212\u3213\u3214\u3215\u3216\u3217\u3218\u3219\u321a\u321b\u321c\u321d\u321e\u321f\u3220\u3221\u3222\u3223\u3224\u3225\u3226\u3227\u3228\u3229\u322a\u322b\u322c\u322d\u322e\u322f\u3230\u3231\u3232\u3233\u3234\u3235\u3236\u3237\u3238\u3239\u323a\u323b\u323c\u323d\u323e\u323f\u3240\u3241\u3242\u3243\u3244\u3245\u3246\u3247\u3248\u3249\u324a\u324b\u324c\u324d\u324e\u324f\u3250\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u2aa7\u2aa8\u2aa9\u2aaa\u2aab\u2aac\u2aad\u2aae\u2aaf\u2ab1\u2ab2\u2ab3\u2ab5\u2ab6\u2ab7\u2ab8\u2ab9\u2aba\u2abb\u2abc\u2abd\u2abe\u2abf\u2ac0\u2ac1\u2ac2\u2ac3\u2ac4\u2ac5\u2ab0\u2ab4\u0000\u2ac6\u2ac7\u2ac8\u2ac9\u2aca\u2acb\u2acc\u2acd\u2ace\u2acf\u2ad0\u2ad1\u0000\u0000\u0000\u0000\u2ad2\u2ad3\u2ad4\u2ad5\u2ad6\u2ad7\u2ad8\u2ad9\u2ada\u01b2\u01b3\u01b4\u0000\u0000\u0000\u0000\u059d\u0000\u0000\u0000\u026f\u027c\u10b7\u10e8\u1162\u11b6\u11fa\u123a\u1272\u12a8\u12de\u1313\u2cb5\u2cb6\u2cb7\u2cb8\u2cb9\u2cba\u2cbb\u2cbc\u2cbd\u2cbe\u2cbf\u2cc0\u2cc1\u2cc2\u2cc3\u2cc4\u2cc5\u2cc6\u2cc7\u2cc8\u2cc9\u2cca\u2ccb\u2ccc\u2ccd\u2cce\u2ccf\u2cd0\u2cd1\u2cd2\u0000\u0000\u2cd3\u2cd4\u2cd5\u2cd6\u2cd7\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u2cd8\u2cd9\u2cda\u2cdb\u2cdc\u2cdd\u2cde\u2cdf\u2ce0\u2ce1\u2ce2\u2ce3\u2ce4\u2ce5\u2ce6\u2ce7\u2ce8\u2ce9\u2cea\u2ceb\u2cec\u2ced\u2cee\u2cef\u2cf0\u2cf1\u2cf2\u2cf3\u2cf4\u2cf7\u2cf8\u2cf9\u2cfa\u2cfb\u2cfc\u2cfd\u2cfe\u2cff\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u0000\u0000\u0000\u0000\u2d06\u2d07\u2d08\u2d09\u2d0a\u2d0b\u2d0c\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d13\u2d14\u2d15\u2d16\u2d17\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d1f\u0000\u0000\u0000\u0000\u0000\u0000\u10b8\u10e9\u1163\u11b7\u11fb\u123b\u1273\u12a9\u12df\u1314\u10ea\u0000\u0000\u0000\u2cf5\u2cf6\u05a3\u05a4\u05a5\u05a6\u05a7\u05a8\u05a9\u05aa\u05ab\u05ac\u05ad\u05ae\u05af\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9\u05ba\u05bb\u05bc\u05bd\u05be\u05bf\u05c0\u05c1\u05c2' + '\u2b2a\u2b2b\u2b2c\u2b2d\u2b2e\u2b2f\u2b30\u2b31\u2b32\u2b33\u2b34\u2b35\u2b36\u2b37\u2b38\u2b39\u2b3a\u2b3b\u2b3c\u2b3d\u2b3e\u2b3f\u2b40\u2b41\u2b42\u2b43\u2b44\u2b45\u0000\u0000\u02c6\u02c7\u2d20\u2d21\u2d22\u2d23\u2d24\u2d25\u2d26\u2d29\u2d2a\u2d2b\u2d2c\u2d2d\u2d2e\u2d2f\u2d30\u2d31\u2d32\u2d33\u2d34\u2d35\u2d36\u2d37\u2d38\u2d39\u2d3a\u2d3b\u2d3c\u2d3d\u2d40\u2d41\u2d42\u2d43\u2d44\u2d45\u2d46\u2d47\u2d48\u2d49\u2d4a\u2d4c\u2d4d\u2d4e\u2d4f\u2d50\u2d51\u2d5a\u2d5b\u2d5c\u2d5d\u2d5e\u2d5f\u2d52\u2d4b\u2d54\u2d55\u2d56\u2d27\u2d28\u2d3e\u2d3f\u2d57\u2d58\u2d59\u0000\u2d72\u2d60\u2d62\u2d63\u2d64\u2d65\u2d66\u2d67\u2d68\u2d69\u2d6a\u2d53\u2d61\u2d71\u2d6b\u2d6c\u2d6e\u2d6f\u2d70\u2d6d\u0172\u01aa\u01ab\u01ac\u01ad\u01ae\u01af\u01b0\u01b1\u0000\u0000\u0000' + '\u10b9\u10eb\u1164\u11b8\u11fc\u123c\u1274\u12aa\u12e0\u1315\u0000\u0000\u0000\u0000\u0000\u0000\u10ba\u10ec\u1165\u11b9\u11fd\u123d\u1275\u12ab\u12e1\u1316\u0000\u0000\u0000\u0000\u0000\u0000\u04a4\u04a5\u04a6\u04a7\u04a8\u04a9\u04aa\u1056\u02b2\u02b3\u02b4\u02b5\u04ab\u04ac\u0000\u0000\u003c\u003d\u003e\u003f\u0040\u0081\u0082\u0083\u0084\u0085\u0086\u0041\u0042\u0087\u009c\u18b4\u18d0\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u015f\u0160\u0173\u018e\u0185\u2db8\u2db9\u2dba\u2dbb\u2dbc\u2dbd\u2dbe\u2dbf\u2dc0\u2dc1\u2dc2\u2dc3\u2dc4\u2dc5\u2dc6\u2dc9\u2dca\u2dcb\u2dcc\u2dcd\u2dce\u2dcf\u2dd0\u2dd1\u2dd2\u2dd3\u2dd4\u2dd5\u2dd6\u2dd7\u2dd9\u2dda\u2ddb\u2ddc\u2ddd\u2ddf\u2de0\u2de1\u2de2\u2de3\u2de4\u2de5\u2de6\u2de8\u2de9\u2dea\u2ded\u0150\u2dee\u2def\u2df0\u2df1\u2df2\u2df3\u2df4\u2df5\u2df6\u2df7\u2df8\u2df9\u2dfa\u2dfb\u2dfc\u2dfd\u2dc7\u2dc8\u2dd8\u2dde\u2de7\u2deb\u2dec\u0000\u0000\u0000\u0000\u10bb\u10ed\u1166\u11ba\u11fe\u123e\u1276\u12ac\u12e2\u1317\u02c8\u02c9\u0294\u0260\u02b6\u02b7\u01ff\u05c3\u05c4\u05c5\u05c6\u05c7\u05c8\u05c9\u05ca\u05cb\u05cc\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u05cd\u05ce\u05cf\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u0000\u0000\u0000' + '\u0174\u0190\u0186\u28d1\u28d3\u28d4\u28d5\u28d6\u28d7\u28d8\u28d9\u28dc\u28dd\u28de\u28df\u28e0\u28e1\u28e2\u28e3\u28e4\u28e5\u28e6\u28e7\u28e8\u28e9\u28eb\u28ee\u28f0\u28f3\u28f6\u28f8\u28f9\u28fb\u28ef\u28f1\u28f4\u28fc\u28fd\u28fe\u28ff\u2900\u2901\u2902\u2903\u28ed\u28f7\u28db\u28fa\u10bc\u10ee\u1167\u11bb\u11ff\u123f\u1277\u12ad\u12e3\u1318\u28d2\u28f2\u28f5\u28ea\u28da\u28ec\u2b46\u2b47\u2b48\u2b49\u2b4a\u2b4b\u2b4c\u2b4d\u2b4e\u2b4f\u2b50\u2b51\u2b52\u2b53\u2b54\u2b55\u2b56\u2b57\u2b58\u2b59\u2b5a\u2b5b\u2b5c\u2b5d\u2b5e\u2b5f\u2b60\u2b61\u2b62\u2b63\u2b64\u2b65\u2b66\u2b67\u2b68\u2b69\u2b6a\u2b6b\u0151\u2b6c\u2b6d\u2b6e\u2b6f\u2b70\u2b71\u2b72\u2b73\u2b74\u2b75\u2b76\u2b77\u2b78\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u04b8\u04b9\u04ba\u04bb' + '\u2a39\u2a3a\u2a3b\u2a3c\u2a3d\u2a3e\u2a3f\u2a40\u2a41\u2a42\u2a46\u2a47\u2a48\u2a49\u2a4a\u2a4b\u2a4c\u2a4d\u2a4e\u2a4f\u2a50\u2a51\u2a52\u2a53\u2a54\u2a55\u2a56\u2a58\u2a5a\u2a5b\u2a5c\u2a5d\u2a5e\u2a5f\u2a60\u2a61\u2a57\u2a59\u2a63\u2a64\u2a65\u2a66\u2a67\u2a68\u2a69\u2a6a\u2a6b\u2a6c\u2a6d\u2a6e\u2a6f\u2a70\u2a71\u2a72\u2a62\u0152\u0000\u0000\u0000\u02a7\u02a8\u049a\u049b\u049c\u10bd\u10ef\u1168\u11bc\u1200\u1240\u1278\u12ae\u12e4\u1319\u0000\u0000\u0000\u2a43\u2a44\u2a45\u10be\u10f0\u1169\u11bd\u1201\u1241\u1279\u12af\u12e5\u131a\u2ebe\u2ebf\u2ec0\u2ec1\u2ec2\u2ec3\u2ec4\u2ec5\u2ec6\u2ec7\u2ec8\u2ec9\u2eca\u2ecb\u2ecc\u2ecd\u2ece\u2ecf\u2ed0\u2ed1\u2ed2\u2ed3\u2ed4\u2ed5\u2ed6\u2ed7\u2ed8\u2ed9\u2eda\u2edb\u2edc\u2edd\u2ede\u2edf\u2ee0\u2ee1\u02bf\u02c0' + '\u1b7f\u1b92\u1c2f\u1c54\u1c5d\u1c5e\u1ccc\u1cde\u1c7b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u1d79\u1d7d\u1d81\u1d85\u1d89\u1d8d\u1d91\u1d99\u1d9d\u1da1\u1da5\u1da9\u1dad\u1db6\u1dba\u1dbe\u1dc2\u1dc6\u1dca\u1dd2\u1dd6\u1dda\u1dde\u1de2\u1de6\u1dea\u1dee\u1df2\u1df6\u1dfa\u1dfe\u1e06\u1e0a\u1d95\u1db2\u1dce\u1e02\u1e0e\u1e12\u1e14\u1e18\u1e1a\u1e1c\u0000\u0000\u1e1e\u1e22\u1e24\u04ad\u04ae\u04af\u04b0\u04b1\u04b2\u04b3\u04b4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2583\u2584\u2585\u2586\u0175\u2587\u2588\u2589\u258a\u0187\u0188\u0000\u258c\u258d\u0000\u0000\u0000\u258b\u0000\u0000\u0000\u0000\u0000' + '\u1397\u139d\u139e\u13c4\u13f3\u1435\u1436\u1486\u14a3\u1578\u1594\u15c4\u1603\u1649\u1681\u16f2\u1701\u16f3\u1702\u16fc\u16f6\u1718\u1708\u170a\u1734\u1786\u178c\u180c\u1866\u1869\u186b\u1884\u18a4\u18ca\u1929\u1940\u197a\u197b\u19c7\u1a4b\u1a74\u1a82\u1abe\u1c02\u133a\u137d\u13b7\u13c3\u140e\u1451\u1490\u14d2\u150b\u1546\u158f\u15a7\u15df\u162c\u165e\u1680\u169f\u1717\u1723\u1763\u17ef\u1825\u18bb\u1338\u13a3\u13a7\u139f\u13b6\u140d\u144f\u1495\u149b\u14a4\u14d1\u1579\u15a5\u162a\u1692\u169d\u1700\u1709\u170b\u1721\u17ed\u1823\u186a\u1882\u1894\u197c\u19bf\u19c5\u19ca\u1ab6\u1aba\u1545\u1762\u1824\u1895\u19c0\u19c6\u1a7e\u1ab7\u1abb\u186c\u13c5\u1439\u14c2\u164b\u1682\u1739\u1789\u1797\u17d3\u1811\u192c\u14f6\u1c1d\u14e3\u1801\u157d\u1585\u1735\u1875\u188a' + '\u13c8\u143a\u14c3\u14f2\u15c5\u1614\u164c\u168a\u173a\u178e\u17d4\u17e1\u18a7\u18e5\u192d\u139a\u13a9\u143f\u148b\u149c\u14a2\u1497\u157f\u1704\u17e4\u1876\u1943\u13ac\u13db\u13fd\u1420\u14a1\u14b1\u159b\u14ec\u187d\u157c\u1584\u1575\u157e\u1599\u1617\u1615\u1600\u164f\u1886\u1685\u168c\u167f\u170f\u1743\u17d7\u17df\u1813\u1871\u1889\u1867\u18aa\u18b1\u191b\u1932\u1934\u193d\u1a1c\u0043\u0044\u0088\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u1759\u004c\u004d\u004e\u004f\u0089\u008a\u0050\u1958\u135f\u137b\u138b\u1391\u13e5\u1421\u141e\u14cb\u14ef\u159f\u15d4\u15ff\u164a\u1656\u167e\u1780\u1784\u17a7\u17bf\u1914\u13a5\u13b0\u13ce\u1493\u14ab\u160e\u16bb\u171b\u17dd\u183f\u18b5\u1349\u16ab\u1833\u0051\u0052\u0053\u0054\u008b\u0000\u0055\u008c\u008d\u0056\u008e' + '\u135e\u135d\u13b9\u13b8\u13bb\u13ba\u13bd\u13bc\u13e8\u13e7\u1412\u1411\u1418\u1417\u141c\u141b\u1414\u1413\u141a\u1419\u1481\u1480\u147f\u147e\u1471\u1470\u1473\u1472\u147d\u147c\u14b3\u14b2\u14e0\u14df\u1513\u1512\u151b\u151a\u1511\u1510\u1515\u1514\u151d\u151c\u1563\u1562\u1565\u1564\u15a9\u15a8\u15b1\u15b0\u15b3\u15b2\u15e9\u15e8\u15f1\u15f0\u15ed\u15ec\u15eb\u15ea\u162e\u162d\u1630\u162f\u1632\u1631\u1668\u1667\u166e\u166d\u1672\u1671\u1670\u166f\u16d1\u16d0\u16d3\u16d2\u16df\u16de\u16dd\u16dc\u1725\u1724\u1727\u1726\u1769\u1768\u1773\u1772\u1779\u1778\u1775\u1774\u17b5\u17b4\u17bb\u17ba\u17c3\u17c2\u17c5\u17c4\u17c7\u17c6\u17f4\u17f3\u17f8\u17f7\u17fe\u17fd\u17fc\u17fb\u184b\u184a\u184f\u184e\u184d\u184c\u1859\u1858\u185b\u185a\u1898\u1897\u189a\u1899' + '\u18bf\u18be\u18bd\u18bc\u18c4\u18c3\u18c6\u18c5\u18c8\u18c7\u18e0\u18df\u18de\u18dd\u1901\u1900\u191f\u191e\u1925\u1924\u1927\u1926\u151e\u17f2\u18c2\u18fb\u1396\u17c8\u17da\u17db\u17ca\u1444\u135c\u135b\u1356\u1355\u1369\u1368\u136b\u136a\u136f\u136e\u136d\u136c\u1379\u1378\u1361\u1360\u1363\u1362\u1367\u1366\u1365\u1364\u1377\u1376\u146f\u146e\u1469\u1468\u145f\u145e\u1475\u1474\u1477\u1476\u147b\u147a\u1479\u1478\u1483\u1482\u155b\u155a\u1561\u1560\u16c5\u16c4\u16bd\u16bc\u16c7\u16c6\u16c9\u16c8\u16cd\u16cc\u16cb\u16ca\u16eb\u16ea\u16e1\u16e0\u16e3\u16e2\u16e7\u16e6\u16e5\u16e4\u16e9\u16e8\u1849\u1848\u1841\u1840\u185d\u185c\u185f\u185e\u1863\u1862\u1861\u1860\u1865\u1864\u18f8\u18f7\u1907\u1906\u1905\u1904\u18ff\u18fe\u15f6\u15f5\u18ae\u18ad\u190e\u190d' + '\u198c\u198e\u199f\u19a7\u199d\u19a5\u19a1\u19a9\u198d\u198f\u19a0\u19a8\u199e\u19a6\u19a2\u19aa\u19ce\u19d0\u19da\u19de\u19d8\u19dc\u0000\u0000\u19cf\u19d1\u19db\u19df\u19d9\u19dd\u0000\u0000\u19ec\u19ee\u19fb\u1a03\u19f9\u1a01\u19fd\u1a05\u19ed\u19ef\u19fc\u1a04\u19fa\u1a02\u19fe\u1a06\u1a21\u1a23\u1a34\u1a3a\u1a32\u1a38\u1a36\u1a3c\u1a22\u1a24\u1a35\u1a3b\u1a33\u1a39\u1a37\u1a3d\u1a5d\u1a5f\u1a69\u1a6d\u1a67\u1a6b\u0000\u0000\u1a5e\u1a60\u1a6a\u1a6e\u1a68\u1a6c\u0000\u0000\u1a94\u1a95\u1aa7\u1aab\u1aa6\u1aa9\u1aa8\u1aad\u0000\u1a96\u0000\u1aac\u0000\u1aaa\u0000\u1aae\u1ac2\u1ac4\u1ad1\u1ad9\u1acf\u1ad7\u1ad3\u1adb\u1ac3\u1ac5\u1ad2\u1ada\u1ad0\u1ad8\u1ad4\u1adc\u1994\u1991\u19d6\u19d3\u19f4\u19f1\u1a29\u1a26\u1a65\u1a62\u1a9c\u1a98\u1aca\u1ac7\u0000\u0000' + '\u19a3\u19ab\u19b2\u19b8\u19b0\u19b6\u19b4\u19ba\u19a4\u19ac\u19b3\u19b9\u19b1\u19b7\u19b5\u19bb\u19ff\u1a07\u1a0e\u1a14\u1a0c\u1a12\u1a10\u1a16\u1a00\u1a08\u1a0f\u1a15\u1a0d\u1a13\u1a11\u1a17\u1ad5\u1add\u1ae4\u1aea\u1ae2\u1ae8\u1ae6\u1aec\u1ad6\u1ade\u1ae5\u1aeb\u1ae3\u1ae9\u1ae7\u1aed\u1996\u1999\u19ae\u199b\u19ad\u0000\u1998\u19af\u1997\u199a\u1995\u1993\u199c\u04d6\u1a1e\u04d7\u04df\u04d1\u1a0a\u19f7\u1a09\u0000\u19f6\u1a0b\u19d7\u19d5\u19f5\u19f3\u19f8\u04d9\u04d8\u04da\u1a2b\u1a30\u1a40\u1a3f\u0000\u0000\u1a2d\u1a41\u1a2c\u1a31\u1a2a\u1a28\u0000\u04dd\u04dc\u04de\u1a9e\u1aa4\u1ab1\u1ab0\u1a7f\u1a80\u1aa0\u1ab2\u1a9f\u1aa5\u1a9d\u1a9a\u1a81\u04d0\u04cf\u04c1\u0000\u0000\u1ae0\u1acd\u1adf\u0000\u1acc\u1ae1\u1a66\u1a64\u1acb\u1ac9\u1ace\u04c5\u04db\u0000' + '\u01df\u01e0\u01e1\u01e2\u01e3\u01e4\u01e5\u01eb\u01e6\u01e7\u01e8\u0000\u0000\u0000\u0000\u0000\u0202\u0203\u0204\u0205\u0207\u020a\u0402\u01f9\u02e9\u02ea\u02eb\u02ec\u02f1\u02f2\u02f3\u02f4\u042e\u042f\u0434\u0435\u0286\u0288\u028a\u0436\u01da\u01db\u0000\u0000\u0000\u0000\u0000\u01ec\u042a\u042c\u043a\u043b\u043c\u043e\u043f\u0440\u0443\u02ed\u02ee\u0444\u026a\u0282\u01ed\u0445\u0447\u0449\u044a\u0437\u069e\u038c\u038d\u0275\u0274\u026b\u0421\u040b\u0438\u0439\u0414\u0237\u0448\u0415\u069a\u020d\u0446\u02d6\u02d7\u043d\u02d8\u02d9\u02da\u02db\u02dc\u02dd\u02de\u01e9\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u10cb\u1544\u0000\u0000\u1211\u1251\u128a\u12bf\u12f5\u132a\u067a\u0698\u0686\u02fe\u0375\u165c' + '\u10cc\u1101\u117a\u11ce\u1212\u1252\u128b\u12c0\u12f6\u132b\u067b\u0699\u0687\u02ff\u0376\u0000\u1339\u1450\u169e\u18dc\u1496\u150a\u15a6\u15de\u162b\u165d\u1722\u17ad\u17ee\u0000\u0000\u0000\u1080\u1081\u1082\u1083\u1084\u1085\u1086\u1087\u177d\u1088\u108a\u108b\u108c\u108d\u108e\u108f\u1090\u1091\u1092\u1093\u1094\u1095\u1096\u1097\u1098\u1099\u109a\u109b\u109c\u109d\u109e\u109f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u01bb\u01bc\u01bd\u01be\u01bf\u01c0\u01c1\u01c2\u0096\u0097\u0098\u01c3\u01c4\u009d\u009e\u009f\u00a0\u01c5\u00a1\u00a2\u00a3\u0099\u01c6\u01c7\u01c8\u01c9\u009a\u009b\u008f\u0090\u0091\u0092\u0057\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u1385\u1386\u13d8\u0549\u05d8\u13e9\u13ea\u149a\u05d9\u054a\u14cc\u1505\u1506\u1507\u1501\u1517\u1541\u1542\u15db\u15d6\u05da\u165a\u1679\u05db\u05dc\u171f\u174a\u175d\u175e\u175f\u05dd\u05de\u17cc\u1803\u1805\u05df\u1918\u05e0\u1ac1\u05e1\u1919\u05e2\u15a2\u1347\u13b4\u13d9\u05e3\u1448\u144d\u14af\u14c7\u1628\u1697\u1e7b\u1e82\u1e86\u1e89\u153b\u05e4\u14b6\u1a71\u19c2\u19c4\u1a73\u0675\u05e5\u05e6\u05e7\u05e8\u140b\u1406\u1449\u153c\u1588\u05e9\u074e\u05ea\u1387\u14c6\u05eb\u110a\u110c\u1104\u1106\u117c\u1108\u117d\u11d1\u1214\u1109\u1254\u110b\u11d2\u1255\u12c2\u1103\u1540\u1567\u1569\u156f\u1892\u189d\u189f\u18a1\u1571\u18d9\u18e2\u18e4\u15da\u13d7\u140a\u1627\u153a\u1566\u1568\u156e\u188e\u189c\u189e\u18a0\u1570\u18d5\u18e1\u18e3\u15d5\u13d3\u1405\u1623' + '\u1049\u104a\u104b\u13ff\u13fe\u127a\u104c\u104d\u104e\u10cd\u05ec\u05ed\u0000\u0000\u0000\u0000\u05ee\u05f4\u05f1\u05f6\u05f8\u05fa\u05fb\u05fc\u05fd\u05fe\u05f0\u05f3\u05ff\u0600\u0601\u0602\u0603\u0604\u0605\u0606\u0607\u0608\u0609\u060a\u060b\u060c\u060d\u060e\u060f\u0610\u05f9\u0611\u0612\u0613\u0614\u0615\u0616\u0617\u0618\u0619\u061a\u061b\u061c\u061d\u061e\u061f\u0620\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u0630\u0636\u0633\u062f\u0631\u0632\u0634\u0635\u0637\u0638\u0639\u063a\u063b\u063c\u063d\u063e\u063f\u0640\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u064b\u064c\u064d\u064e\u064f\u0650\u0651\u0652\u0653\u0654\u0655\u0656\u0657\u0658\u0659\u065a\u065b\u065c\u065d\u065e\u065f\u0660\u0661' + '\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u066a\u066b\u066c\u066d\u066e\u066f\u0671\u0672\u0673\u0674\u0697\u069b\u069c\u069d\u069f\u06a0\u06a1\u06a2\u06a3\u06a4\u06a6\u06a8\u06a9\u06aa\u06ab\u06ac\u06ad\u06ae\u06af\u06b0\u06b1\u06b2\u06b3\u06b4\u06b5\u06b6\u06b7\u06b8\u06ba\u06bb\u06bc\u06bd\u06be\u06bf\u06c0\u06c1\u06c2\u06c3\u06c4\u06c5\u06c6\u06c7\u06c8\u06ca\u06cb\u06cc\u06cd\u06c9\u06ce\u06cf\u06d0\u06d1\u06d3\u06d2\u06d4\u06d5\u06d6\u06d7\u06d8\u06d9\u06db\u06dc\u06dd\u06de\u06df\u06e0\u06e1\u06e2\u06e3\u06e4\u06e5\u06e6\u06e7\u06e8\u06e9\u06ea\u06eb\u06ec\u0688\u06ed\u06ee\u06ef\u06f0\u06f2\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u06fa\u06da\u0682\u068e\u06f1\u06f3\u06fb\u06fd\u06fc\u06fe\u06ff\u0701\u0700\u0702\u0703\u0705\u0707\u0709\u070b\u070c' + '\u0704\u0706\u070d\u070f\u070e\u0710\u0711\u0713\u0712\u0714\u0715\u0716\u0717\u0718\u0719\u071a\u071b\u071c\u071e\u0720\u0721\u0722\u0723\u0724\u0725\u0726\u0727\u0728\u0729\u072a\u072b\u072c\u072d\u072e\u072f\u0731\u0732\u0733\u0734\u0735\u0736\u0738\u073a\u073b\u0730\u0737\u0739\u073c\u073d\u073e\u073f\u0741\u0743\u0745\u0747\u0748\u0749\u074a\u074b\u074c\u074d\u074f\u0750\u0751\u0752\u0753\u0754\u0755\u0756\u0757\u0758\u0759\u075a\u075b\u075c\u075d\u075e\u075f\u0760\u0761\u0762\u0763\u0764\u0765\u0766\u0767\u0768\u0769\u076a\u076b\u076c\u076d\u076e\u076f\u0770\u0771\u0708\u070a\u071d\u071f\u0772\u0773\u0774\u0775\u0776\u0777\u0740\u0742\u0744\u0746\u0778\u0779\u077a\u077b\u077c\u077d\u077e\u077f\u0780\u0781\u0782\u0783\u0784\u0785\u0786\u0787\u0788\u0789' + '\u078a\u078b\u078c\u078d\u078e\u078f\u0790\u0791\u038e\u038f\u0390\u0391\u0792\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079a\u079b\u079c\u079d\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07a6\u07a7\u07a8\u07a9\u07aa\u07ab\u07ac\u07ad\u07ae\u03da\u03dd\u07af\u07b0\u07b1\u07b2\u07b3\u07b4\u07b5\u07b6\u07b7\u07b8\u07b9\u07ba\u07bb\u07bc\u07bd\u07be\u07bf\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u07c7\u07c8\u07c9\u07ca\u07cb\u07cc\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u07d4\u07d5\u07d6\u07d7\u07d8\u07d9\u07da\u07db\u07dc\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3\u07e4\u07e5\u07e6\u07e7\u07e8\u07e9\u07ea\u07eb\u07ec\u07ed\u07ee\u07ef\u07f0\u07f1\u07f2\u07f3\u07f4\u07f5\u07f6\u07f7\u07f8\u07f9\u07fa\u07fb\u07fc\u07fd\u07fe\u07ff\u0800\u0801\u0802\u0803' + '\u0804\u0805\u0806\u0807\u0808\u0809\u080a\u080b\u080c\u080d\u080e\u080f\u0810\u0811\u0812\u0813\u0814\u0815\u0816\u0817\u0818\u0819\u081a\u081b\u081c\u081d\u081e\u081f\u0820\u0821\u0822\u0823\u0824\u0825\u0826\u0827\u0828\u0829\u082a\u082b\u082c\u082d\u082e\u082f\u0830\u0831\u0832\u0833\u0834\u0835\u0836\u0837\u0838\u0839\u083a\u083b\u083c\u083d\u083e\u083f\u0840\u0841\u0842\u0843\u0844\u0845\u0846\u0847\u0848\u0849\u084a\u084b\u084c\u084d\u084e\u084f\u0850\u0851\u0852\u0853\u0854\u0855\u0856\u0857\u0858\u0859\u085a\u085b\u085c\u085d\u085e\u085f\u0860\u0861\u0862\u0863\u0864\u0865\u0866\u0867\u0868\u0869\u086a\u086b\u086c\u086d\u086e\u086f\u0870\u0871\u0872\u0873\u0874\u0875\u0876\u0877\u0878\u0879\u087a\u087b\u087c\u087d\u087e\u087f\u0880\u0881\u0882\u0883' + '\u0884\u0885\u0886\u0887\u0888\u0889\u088a\u088b\u088c\u088d\u088e\u088f\u0890\u0891\u0892\u0893\u0894\u0895\u0896\u0897\u0898\u0899\u089a\u089b\u089c\u089d\u089e\u089f\u08a0\u08a1\u08a2\u08a3\u08a4\u08a5\u08a6\u08a7\u08a8\u08a9\u08aa\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u08ab\u08ac\u08ad\u08ae\u08af\u08b0\u08b1\u08b2\u08b3\u08b4\u08b5\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u10fb\u1174\u11c8\u120c\u124c\u1285\u12ba\u12f0\u1325\u110d\u1117\u111d\u1123\u1128\u112d\u1132\u1137\u113c\u1141\u117e\u0301\u030c\u030e\u030f\u0310\u0311\u0312\u0313\u0314\u0302\u0303\u0304' + '\u0305\u0306\u0307\u0308\u0309\u030a\u030b\u030d\u1102\u117b\u11cf\u1213\u1253\u128c\u12c1\u12f7\u132c\u1113\u1119\u111f\u1125\u112a\u112f\u1134\u1139\u113e\u1143\u1181\u0315\u0316\u0317\u0318\u0319\u031a\u031b\u031c\u031d\u031e\u031f\u0320\u0321\u0322\u0323\u0324\u0325\u0326\u0327\u0328\u0329\u032a\u032b\u032c\u032d\u032e\u1336\u13b5\u13da\u140c\u144e\u14b0\u14d0\u1508\u1543\u158c\u15a4\u15dc\u1629\u165b\u169b\u1720\u174b\u1760\u17ab\u17ec\u1822\u1893\u18b9\u18da\u18f3\u191a\u1333\u13b1\u13d4\u1407\u144a\u14ac\u14cd\u1502\u153d\u1589\u15a0\u15d7\u1624\u1657\u1698\u171c\u1747\u175a\u17a8\u17e9\u181f\u188f\u18b6\u18d6\u18f0\u1915\u10c9\u1118\u111e\u1124\u1129\u112e\u1133\u1138\u113d\u1142\u117f\u10fc\u1175\u11c9\u120d\u124d\u1286\u12bb\u12f1\u1326\u110e\u10ca' + '\u08b6\u08b7\u08b8\u08ba\u08bb\u08bc\u08bd\u08be\u08bf\u08c0\u08c1\u08c2\u08c3\u08c4\u08c5\u08c6\u08c7\u08c8\u08c9\u08ca\u08cb\u08cc\u08cd\u08ce\u08cf\u08d0\u08d1\u08d2\u08d3\u08d4\u08d5\u08d6\u08d7\u08d8\u08d9\u08da\u08db\u08dc\u08dd\u08de\u08df\u08e0\u08e1\u08e2\u08e3\u08e4\u08e5\u08e6\u08e7\u08e8\u08e9\u08ea\u08eb\u08ec\u08ed\u08ee\u08ef\u08f0\u08f1\u08f2\u08f3\u08f4\u08f5\u08f6\u08f7\u08f8\u08f9\u08fa\u08fb\u08fc\u08fd\u08fe\u08ff\u0900\u0901\u0902\u0903\u0904\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913\u0914\u0915\u0916\u0917\u0918\u0919\u091a\u091b\u091c\u091d\u091e\u091f\u0920\u0921\u0922\u0923\u0924\u0925\u0926\u0927\u0928\u0929\u092a\u092b\u092c\u092d\u092e\u092f\u0930\u0931\u0932\u0933\u0934\u0935\u0936' + '\u0937\u0938\u0939\u093a\u093b\u093c\u093d\u093e\u093f\u0940\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u0949\u094a\u094b\u094c\u094d\u094e\u094f\u0950\u0951\u0952\u0953\u0954\u0955\u0956\u0957\u0959\u095a\u095b\u095c\u095d\u095e\u095f\u0960\u0961\u0962\u0963\u0964\u0965\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0970\u0971\u0972\u0973\u0974\u0975\u0976\u0977\u0978\u0979\u097a\u097b\u097c\u097d\u097e\u097f\u0980\u0981\u0982\u0983\u0985\u0986\u0987\u0988\u0989\u098a\u098b\u098c\u098d\u098e\u098f\u0990\u0991\u0992\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099a\u099b\u099c\u099d\u099e\u099f\u09a0\u09a1\u09a2\u09a3\u09a4\u09a5\u09a6\u09a7\u09a8\u09a9\u09aa\u09ab\u09ac\u09ad\u09ae\u09af\u09b0\u09b1\u09b2\u09b3\u09b4\u09b5\u09b6\u09b7\u09b8' + '\u09b9\u09ba\u09bb\u09bc\u09bd\u09be\u09bf\u09c0\u09c1\u09c2\u09c3\u09c4\u09c5\u09c6\u09c7\u09c8\u09c9\u09ca\u09cb\u09cc\u09cd\u09ce\u09cf\u09d0\u09d1\u09d2\u09d3\u09d4\u09d5\u09d6\u09d7\u09d8\u09d9\u09da\u09db\u09dc\u09dd\u09de\u09df\u09e0\u09e1\u09e2\u09e3\u09e4\u09e5\u09e6\u09e7\u09e8\u0f5b\u0f5c\u0f5d\u0f5e\u0f5f\u0f60\u0f61\u0f62\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09f0\u09f1\u09f2\u09f3\u09f4\u09f5\u09f6\u09f7\u09f8\u09f9\u09fa\u09fb\u09fc\u09fd\u09fe\u09ff\u0a00\u0a01\u0a02\u0a03\u0a04\u0a05\u0a06\u0a07\u0a08\u0a09\u0a0a\u0a0b\u0a0c\u0a0d\u0a0e\u0a0f\u0a10\u0a11\u0a12\u0a13\u0a14\u0a15\u0a16\u0a17\u0a18\u0a19\u0a1a\u0a1b\u0a1c\u0a1d\u0fda\u0fdb\u0fdc\u0a1e\u0a1f\u0a20\u0a21\u0a22\u0a23\u0a24\u0a25\u0a26\u0a27\u0a28\u0a29\u0a2a\u0a2b\u0a2c\u0a2d' + '\u0a2e\u0a2f\u0a30\u0a31\u0a32\u0a33\u0a34\u0a35\u0a36\u0a37\u0f55\u0f56\u0f57\u0f58\u0f59\u0f5a\u0a38\u0a39\u0a3a\u0a3b\u0a3c\u0a3d\u0a3e\u0a3f\u0a40\u0a41\u0a42\u0a43\u0a44\u0a45\u0a46\u0a47\u0a48\u0a49\u0a4a\u0a4b\u0a4c\u0a4d\u0a4e\u0a4f\u0a50\u0a51\u0a52\u0a53\u0a54\u0a55\u0a56\u0a57\u0a58\u0a59\u0a5a\u0a5b\u0a5c\u0a5d\u0a5e\u0a5f\u0a60\u0a61\u0a62\u0a63\u0a64\u0a65\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a70\u0a71\u0a72\u0a73\u0a74\u0a75\u0a76\u0a77\u0a78\u0a79\u0a7a\u0a7b\u0a7c\u0a7d\u0a7e\u0a7f\u0a80\u0a81\u0a82\u0a83\u0a84\u0a85\u0a86\u0a87\u0a88\u0a89\u0a8a\u0a8b\u0a8c\u0a8d\u0a8e\u0a8f\u0a90\u0a91\u0a92\u0a93\u0a94\u0a95\u0a96\u0a97\u0a98\u0a99\u0a9a\u0a9b\u0a9c\u0a9d\u0a9e\u0a9f\u0aa0\u0aa1\u0aa2\u0aa3\u0aa4\u0aa5\u0aa6\u0aa7' + '\u0aa8\u0aa9\u0aaa\u0aab\u0aac\u0aad\u0aae\u0aaf\u0ab0\u0ab1\u0ab2\u0ab3\u0ab4\u0ab5\u0ab6\u0ab7\u0ab8\u0ab9\u0aba\u0abb\u0abc\u0abd\u0abe\u0abf\u0ac0\u0ac1\u0ac2\u0ac3\u0ac4\u0ac5\u0ac6\u0ac7\u0ac8\u0acb\u0acc\u0acd\u0ace\u0acf\u0ad0\u0ad1\u0ad2\u0ad3\u0ad4\u0ad5\u0ad6\u0ad7\u0ad8\u0ad9\u0ada\u0adb\u0adc\u0add\u0ade\u0adf\u0ae0\u0ae1\u0ae2\u0ae3\u0ae4\u0ae5\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0af0\u0af1\u0af2\u0af3\u0af4\u0af5\u0af6\u0af7\u0af8\u0af9\u0afa\u0afb\u0afc\u0afd\u0afe\u0aff\u0b00\u0b01\u0b02\u0b03\u0b04\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\u0b0c\u0b0d\u0b0e\u0b0f\u0b10\u0b11\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u10fd\u1176\u11ca\u120e\u124e\u1287\u12bc\u12f2\u1327\u110f' + '\u10fe\u1177\u11cb\u120f\u124f\u1288\u12bd\u12f3\u1328\u1110\u10ff\u1178\u11cc\u1210\u1250\u1289\u12be\u12f4\u1329\u1111\u0b12\u0b13\u0b14\u0b15\u0b16\u0b17\u0b18\u0b19\u0b1a\u0b1b\u0b1c\u0b1d\u0b1e\u0b1f\u0b20\u0b21\u0b22\u0b23\u0b24\u0b25\u0b26\u0b27\u0b28\u0b29\u0b2a\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b30\u0b31\u0b32\u0b33\u0b34\u0b35\u0b36\u0b37\u0b38\u0b39\u0b3a\u0b3b\u0b3c\u0b3d\u0b3e\u0b3f\u0b40\u0b41\u0b42\u03ac\u03ad\u0b43\u0b44\u0b45\u0b46\u0b47\u0b48\u0b49\u0b4a\u0b4b\u0b4c\u0b4d\u0b4e\u0b4f\u0b50\u0b51\u0b52\u0b53\u0b54\u0b55\u0b56\u0b57\u0b58\u0b59\u0b5a\u0b5b\u0b5c\u0b5d\u0b5e\u0b5f\u0b60\u0b61\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u0b62\u0b63\u0b64\u0b65\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0b70\u0b71' + '\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\u0e5c\u0e5d\u0e5e\u0e5f\u0e60\u0e61\u0e62\u0e63\u0e64\u0e65\u0e66\u0e67\u0e68\u0e69\u0e6a\u0e6b\u0e6c\u0e6d\u0e6e\u0e6f\u0e70\u0e71\u0e72\u0e73\u0e74\u0e75\u0e76\u0e77\u0e78\u0e79\u0e7a\u0e7b\u0e7c\u0e7d\u0e7e\u0e7f\u0e80\u0e81\u0e82\u0e83\u0e84\u0e85\u0e86\u0e87\u0e88\u0e89\u0e8a\u0e8b\u0e8c\u0e8d\u0e8e\u0e8f\u0e90\u0e91\u0e92\u0e93\u0e94\u0e95\u0e96\u0e97\u0e98\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea0\u0ea1\u0ea2\u0ea3\u0ea4\u0ea5\u0ea6\u0ea7\u0ea8\u0ea9\u0eaa\u0eab\u0eac\u0ead\u0eae\u0eaf\u0eb0\u0eb1\u0eb2\u0eb3\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0eba\u0ebb\u0ebc\u0ebd\u0ebe\u0ebf\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\u0ec5\u0ec6\u0ec7\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0ece\u0ecf\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4' + '\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\u0eda\u0edb\u0edc\u0edd\u0ede\u0edf\u0ee0\u0ee1\u0ee2\u0ee3\u0ee4\u0ee5\u0ee6\u0ee7\u0ee8\u0ee9\u0eea\u0eeb\u0eec\u0eed\u0eee\u0eef\u0ef0\u0ef1\u0ef2\u0ef3\u0ef4\u0ef5\u0ef6\u0ef7\u0ef8\u0ef9\u0efa\u0efb\u0efc\u0efd\u0efe\u0eff\u0f00\u0f01\u0f02\u0f03\u0f04\u0f05\u0f06\u0f07\u0f08\u0f09\u0f0a\u0f0b\u0f0c\u0f0d\u0f0e\u0f0f\u0f10\u0f11\u0f12\u0f13\u0f14\u0f15\u0f16\u0f17\u0f18\u0f19\u0f1a\u0f1b\u0f1c\u0f1d\u0f1e\u0f1f\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f2a\u0f2b\u0f2c\u0f2d\u0f2e\u0f2f\u0f30\u0f31\u0f32\u0f33\u0f34\u0f35\u0f36\u0f37\u0f38\u0f39\u0f3a\u0f3b\u0f3c\u0f3d\u0f3e\u0f3f\u0f40\u0f41\u0f42\u0f43\u0f44\u0f45\u0f46\u0f47\u0f48\u0f49\u0f4a\u0f4b\u0f4c\u0f4d\u0f4e\u0f4f\u0f50\u0f51\u0f52\u0f53\u0f54' + '\u0b72\u0b73\u0b74\u0b75\u0b76\u0b77\u0b78\u0b79\u0b7a\u0b7b\u0b7c\u0b7d\u0b7e\u0b7f\u0b80\u0b81\u0b82\u0b83\u0b84\u0b85\u0b86\u0b87\u0b88\u0b89\u0b8a\u0b8b\u0b8c\u0b8d\u0b8e\u0b8f\u0b90\u0b91\u0b92\u0b93\u0b94\u0b95\u0b96\u0b97\u0b98\u0b99\u0b9a\u0b9b\u0b9c\u0b9d\u0b9e\u0b9f\u0ba0\u0ba1\u0ba2\u0ba3\u0ba4\u0ba5\u0ba6\u0ba7\u0ba8\u0ba9\u0baa\u0bab\u0bac\u0bad\u0bae\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6\u0bb7\u0bb8\u0bb9\u0bba\u0bbb\u0bbc\u0bbd\u0bbe\u0bbf\u0bc0\u0bc1\u0bc2\u0bc3\u0bc4\u0bc5\u0bc6\u0bc7\u0bc8\u0bc9\u0bca\u0bcb\u0bcc\u0bcd\u0bce\u0bcf\u0bd0\u0bd1\u0bd2\u0bd3\u0bd4\u0bd5\u0bd6\u0bd7\u0bd8\u0bd9\u0bda\u0bdb\u0bdc\u0bdd\u0bde\u0bdf\u0be0\u0be1\u0be2\u0be3\u0be4\u0be5\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0bf0\u0bf1' + '\u0bf2\u0bf3\u0bf4\u0394\u0395\u0396\u0398\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a2\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u0bf5\u0bf6\u0bf7\u0bf8\u0bf9\u0bfa\u0bfb\u0bfc\u0bfd\u0bfe\u0bff\u0c00\u0c01\u0c02\u0c03\u0c04\u0c05\u0c06\u0c07\u0c08\u0c09\u0c0a\u0c0b\u0c0c\u0c0d\u0c0e\u0c0f\u0c10\u0c11\u0c12\u0c13\u0c14\u0c15\u0c16\u0c17\u0c18\u0c19\u0c1a\u0c1b\u0c1c\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27\u0c28\u0c29\u0c2a\u0c2b\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c33\u0404\u0405\u0406\u0407\u0c34\u0c35\u0c36\u0c37\u0c38\u0c39\u0c3a\u0c3b\u0c3c\u0c3d\u0c3e\u0c3f\u0c40\u0c41\u0c42\u0c43\u0c44\u0c45\u0c46\u0c47\u0c48\u0c49\u0c4a\u0c4b\u0c4c\u0c4d\u0c4e\u0c4f\u0c50\u0c51\u0c52\u0c53\u0392\u0393\u0c54\u0c55' + '\u0c56\u0c57\u0c58\u0c59\u0c5a\u0c5b\u0c5c\u0c5d\u0c5e\u0c5f\u0c60\u0c61\u06b9\u0c62\u0c63\u0c64\u0c65\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0c6f\u0c70\u0c71\u0c72\u0c73\u0c74\u0c75\u0c76\u0c77\u0c78\u0c79\u0c7a\u0c7b\u0c7c\u0c7d\u0c7e\u0c7f\u0c80\u0c81\u0c82\u0c83\u0c84\u0c85\u0c86\u0c87\u0c88\u0c89\u0c8a\u0c8b\u0c8c\u0c8d\u0c8e\u0c8f\u0c90\u0c91\u0c92\u0c93\u0c94\u0c95\u0c96\u0c97\u0c98\u0c99\u0c9a\u0c9b\u0c9c\u0c9d\u0c9e\u0c9f\u0ca0\u0ca1\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0ca9\u0caa\u0cab\u0cac\u0cad\u0cae\u0caf\u0cb0\u0cb1\u0cb2\u0cb3\u0cb4\u0cb5\u0cb6\u0cb7\u0cb8\u0cb9\u0cba\u0cbb\u0cbc\u0cbd\u0cbe\u0cbf\u0cc0\u0cc1\u0cc2\u0cc3\u0cc4\u0cc5\u0cc6\u0cc7\u0cc8\u023f\u0689\u068a\u0cc9\u0cca\u0ccb\u0ccc\u0ccd\u0cce\u0ccf\u0cd0\u0cd1' + '\u0cd2\u0cd3\u0cd4\u0cd5\u0cd6\u0cd7\u0cd8\u0cd9\u0cda\u0cdb\u0cdc\u0cdd\u0cde\u0cdf\u0ce0\u0ce1\u0ce2\u0ce3\u0ce4\u0ce5\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0cf0\u0cf1\u0cf2\u0cf3\u0cf4\u0cf5\u0cf6\u0cf7\u0cf8\u0cf9\u0cfa\u0cfb\u0cfc\u0cfd\u0cfe\u0cff\u0d00\u0d01\u0d02\u0d03\u0d04\u0d05\u0d06\u0d07\u0d08\u0d09\u0d0a\u0d0b\u0d0c\u0d0d\u0d0e\u0d0f\u0d10\u0d11\u0d12\u0d13\u0d14\u0d15\u0d16\u0d17\u0d18\u0d19\u0d1a\u0d1b\u0d1c\u0d1d\u0d1e\u0d1f\u0d20\u0d21\u0d22\u0d23\u0d24\u0d25\u0d26\u0d27\u0d28\u0d29\u0d2a\u0d2b\u0d2c\u0d2d\u0d2f\u0d2e\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u0d38\u0d39\u0d3a\u0d3b\u0d3c\u0d3d\u0d3e\u0d3f\u0d40\u0d41\u0d42\u0d43\u0d44\u0d45\u0d46\u0d47\u0d48\u0d49\u0d4a\u0d4b\u0d4c\u0d4d\u0d4e\u0d4f\u0d50\u0d51' + '\u0d52\u0d53\u0d54\u0d55\u0d56\u0d57\u0d58\u0d59\u0d5a\u0d5b\u0d5c\u0d5d\u0d5e\u0d5f\u0d60\u0d61\u0d62\u0d63\u0d64\u0d65\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0d70\u0d71\u0d72\u0d73\u0d74\u0d75\u0d76\u0d77\u0d78\u0d79\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f\u0d80\u0d81\u0d82\u0d83\u0d84\u0d85\u0d86\u0d87\u0d88\u0d89\u0d8a\u0d8b\u0d8c\u0d8d\u0d8e\u0d8f\u0d90\u0d91\u0d92\u0d93\u0d94\u0d95\u0d96\u0d97\u0d98\u0d99\u0d9a\u0d9b\u0d9c\u0d9d\u0d9e\u0d9f\u0da0\u0da1\u0da2\u0da3\u0da4\u0da5\u0da6\u0da7\u0da8\u0da9\u0daa\u0dab\u0dac\u0dad\u0dae\u0daf\u0db0\u0db1\u0db2\u0db3\u0db4\u0db5\u0db6\u0db7\u0db8\u0db9\u0dba\u0dbb\u0dbc\u0dbd\u0dbe\u0dbf\u0dc0\u0dc1\u0dc2\u0dc3\u0dc4\u0dc5\u0000\u0000\u0dc6\u0dc7\u0dc8\u0dc9\u0dca\u0dcb\u0dcc\u0dcd\u0dce\u0dcf' + '\u0dd0\u0dd1\u0dd2\u0dd3\u0dd4\u0dd5\u0dd6\u0dd7\u0dd8\u0dd9\u0dda\u0ddb\u0ddc\u0ddd\u0dde\u0ddf\u0de0\u0de1\u0de2\u0de3\u0de4\u0de5\u0000\u0de6\u0de7\u0de8\u0de9\u0dea\u0deb\u0dec\u0ded\u0dee\u0def\u0df0\u0df1\u0df2\u0df3\u0df4\u0df5\u0df6\u0df7\u0df8\u0df9\u0dfa\u0dfb\u0dfc\u0dfd\u0dfe\u0dff\u0e00\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e3b\u0e3c\u0e3d\u0e3e\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e' + '\u1d1b\u1d1d\u1d1f\u1d21\u1d23\u1d25\u1d27\u1d29\u1d2b\u1d2d\u1d2f\u1d31\u1d33\u1d35\u1d37\u1d39\u1d3b\u1d3d\u1d3f\u1d41\u1d43\u1d45\u1d47\u1d49\u1d4b\u1d4d\u1d4f\u1d51\u1d53\u1d55\u1d57\u1d59\u1d5b\u1d5d\u1d5f\u1d61\u1d63\u1d65\u1d67\u1d69\u1d6b\u1d6d\u1d6f\u1d71\u1d73\u1d75\u1d77\u0000\u1d1a\u1d1c\u1d1e\u1d20\u1d22\u1d24\u1d26\u1d28\u1d2a\u1d2c\u1d2e\u1d30\u1d32\u1d34\u1d36\u1d38\u1d3a\u1d3c\u1d3e\u1d40\u1d42\u1d44\u1d46\u1d48\u1d4a\u1d4c\u1d4e\u1d50\u1d52\u1d54\u1d56\u1d58\u1d5a\u1d5c\u1d5e\u1d60\u1d62\u1d64\u1d66\u1d68\u1d6a\u1d6c\u1d6e\u1d70\u1d72\u1d74\u1d76\u0000\u1609\u1608\u160b\u1736\u1794\u1398\u180f\u152c\u152b\u15c9\u15c8\u1938\u1937\u13a6\u164e\u13a2\u13ab\u18ab\u18ce\u18cd\u18ac\u152e\u152d\u1744\u148d\u1791\u170c\u1491\u158e\u1896\u17d9\u1936' + '\u1af6\u1af5\u1af8\u1af7\u1afa\u1af9\u1afc\u1afb\u1afe\u1afd\u1b02\u1b01\u1b04\u1b03\u1b06\u1b05\u1b08\u1b07\u1b0a\u1b09\u1b0c\u1b0b\u1b11\u1b10\u1b13\u1b12\u1b15\u1b14\u1b1b\u1b1a\u1b1d\u1b1c\u1b1f\u1b1e\u1b21\u1b20\u1b23\u1b22\u1b25\u1b24\u1b27\u1b26\u1b29\u1b28\u1b2b\u1b2a\u1b2d\u1b2c\u1b2f\u1b2e\u1b65\u1b64\u1b67\u1b66\u1b00\u1aff\u1b0f\u1b0e\u1b17\u1b16\u1b19\u1b18\u1b31\u1b30\u1b33\u1b32\u1b39\u1b38\u1b3b\u1b3a\u1b3d\u1b3c\u1b45\u1b44\u1b49\u1b48\u1b4b\u1b4a\u1b4d\u1b4c\u1b4f\u1b4e\u1b51\u1b50\u1b53\u1b52\u1b59\u1b58\u1b5d\u1b5c\u1b5f\u1b5e\u1b61\u1b60\u1b69\u1b68\u1b6b\u1b6a\u1b6d\u1b6c\u1b0d\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u1b37\u1b36\u1b57\u1b56\u0058\u0008\u0005\u1b43\u1b42\u0000\u0000\u0000\u0000\u0000\u0295\u027d\u027e\u02e4\u104f\u0296\u02e5' + '\u1d7a\u1d7e\u1d82\u1d86\u1d8a\u1d8e\u1d92\u1d9a\u1d9e\u1da2\u1da6\u1daa\u1daf\u1db7\u1dbb\u1dbf\u1dc3\u1dc7\u1dcb\u1dd3\u1dd7\u1ddb\u1ddf\u1de3\u1de7\u1deb\u1def\u1df3\u1df7\u1dfb\u1dff\u1e07\u1e0b\u1d96\u1db3\u1dcf\u1e03\u1e0f\u0000\u1e15\u0000\u0000\u0000\u0000\u0000\u1e1f\u0000\u0000\u2333\u2334\u2335\u2336\u2337\u2338\u2339\u233a\u233b\u233c\u233d\u233e\u2340\u2341\u2342\u2343\u2344\u2345\u2346\u2347\u2348\u2349\u234a\u234b\u234c\u234d\u234e\u234f\u2350\u2351\u2352\u2353\u2354\u2355\u2356\u2357\u2359\u235a\u235b\u235c\u235d\u235e\u235f\u2360\u2361\u2362\u2363\u2364\u2365\u2366\u2367\u2368\u2369\u236a\u233f\u2358\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u236b\u04b5\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u237c\u2391\u23a2\u23ab\u23ba\u23e0\u23f1\u23fa\u2410\u2419\u2422\u2453\u2472\u2481\u248a\u24ac\u24b5\u24c5\u24f5\u24a0\u24a1\u24a2\u24a3\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u24f9\u24fa\u24fb\u24fc\u24fd\u24fe\u24ff\u0000\u2500\u2501\u2502\u2503\u2504\u2505\u2506\u0000\u2507\u2508\u2509\u250a\u250b\u250c\u250d\u0000\u250e\u250f\u2510\u2511\u2512\u2513\u2514\u0000\u2515\u2516\u2517\u2518\u2519\u251a\u251b\u0000\u251c\u251d\u251e\u251f\u2520\u2521\u2522\u0000\u2523\u2524\u2525\u2526\u2527\u2528\u2529\u0000\u252a\u252b\u252c\u252d\u252e\u252f\u2530\u0000\u1b7c\u1b80\u1b83\u1b93\u1bae\u1bbb\u1bed\u1c00\u1c14\u1c1b\u1c30\u1c44\u1c4d\u1c55\u1c5f\u1c84\u1c9e\u1ca9\u1cc0\u1cc5\u1d0c\u1c57\u1b6f\u1ba2\u1bea\u1c7c\u1cdf\u1ce8\u1ced\u1cf7\u1cfc\u1d05' + '\u044b\u044c\u03c6\u03c7\u03c8\u03c9\u044d\u044e\u044f\u03ca\u03cb\u0450\u03cc\u03cd\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u020f\u0283\u02e6\u045a\u045b\u03ce\u03cf\u045c\u045d\u03d0\u03d1\u03d2\u03d3\u03d4\u03d5\u03d6\u03d7\u03d8\u03d9\u02df\u02e0\u02e1\u02e2\u0277\u1cc9\u0297\u02a1\u021b\u02a2\u021a\u0238\u0430\u0431\u0432\u0409\u020b\u020c\u0298\u02e3\u0403\u040d\u0210\u021c\u02f5\u020e\u045e\u045f\u0460\u0461\u0462\u023a\u041d\u0433\u021d\u040c\u021e\u021f\u0ac9\u0aca\u0422\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\ua8ab\ua910\ua8b2\ua8b1\ua8b0\ua8bf\ua8db\ua8e6\ua8e9\ua8ea\ua90a\ua90c\ua950\ua951\ua954\ua955\ua952\ua956\ua966\ua96b\ua97d\ua97c\ua986\ua985\ua99f\ua9ad\u0000\ua9b9\ua9bd\ua9cb\ua9e9\ua9ef\ua9f3\ua9f7\ua9f8\uaa15\uaa22\uaa23\ua8a6\uaa2b\uaa2f\uaa3a\uaa52\uaa63\uaa74\uaa75\uaa92\uaaa0\uaaad\uaab3\uaab1\uaab4\uaab5\uaab2\uaaba\uaabb\uaabc\uaac2\uaacd\uaacc\uaacf\uaad8\uaae3\uaae4\uaae5\uaaf8\uab02\uab0c\uab0b\uab12\uab13\uab15\uab29\uab37\uab3b\uab45\uab4b\uab4c\uab4d\uab56\uab69\uab6a\uab6c\uab6d\uab70\uab72\uab73\uab84\uab8a\uab92\uab9e\uaba0\uaba2\uaba3\uaba6\uaba5\uabaa\uabac\uabb1\uabb3\uabbb\uabbf\uabc4\uabc6\uabcc\uabcf\uabd5\uabdc\uabdd\uabdf\uabe0\uabe3\uabe5\uabea\uabeb\uabec\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\ua897\ua8a5\ua8aa\ua8ad\ua8ae\ua8b5\ua8b7\ua8bb\ua8bd\ua8ce\ua8d2\ua8d5\ua8da\ua8dc\ua8de\ua8e5\ua8e7\ua8e8\ua8f1\ua8fa\ua8fc\ua8fe\ua8ff\ua902\ua909\ua90b\ua90f\ua911\ua913\ua914\ua926\ua92a\ua935\ua936\ua937\ua938\ua93a\ua942\ua946\ua948\ua94e\ua94f\ua953\ua957\ua95d\ua95e\ua962\ua963\ua965\ua967\ua968\ua96c\ua96e\ua976\ua977\ua979\ua97a\ua97b\ua97e\ua980\ua984\ua99a\ua99d\ua99e\ua9ab\ua9ac\ua9b1\ua9b3\ua9b5\ua9b6\ua9b8\ua9bb\ua9c7\ua9c9\ua9d0\ua9e3\ua9e4\ua9e8\ua9eb\ua9ee\ua9f0\ua9f1\ua9f2\ua9f4\ua9f5\uaa13\uaa20\uaa25\uaa26\uaa27\uaa28\uaa29\uaa2a\uaa2e\uaa36\uaa39\uaa44\uaa45\uaa47\uaa48\uaa49\uaa4a\uaa51\uaa53\uaa59\uaa5a\uaa5b\uaa5c\uaa62\uaa69\uaa6a\uaa6b\uaa73\uaa86\uaa87\uaa8c\uaa90\uaa91\uaa99\uaa9f\uaaae\uaab0\uaab9\uaabf\uaac1\uaac5\uaac6\uaac7' + '\uaacb\uaace\uaad2\uaad4\uaad6\uaad7\uaad9\uaadb\uaadc\uaadd\uaadf\uaae0\uaaf7\uaafa\uaafe\uab00\uab01\uab0a\uab0f\uab14\uab16\uab2a\uab2b\uab2d\uab2e\uab2f\uab38\uab39\uab3a\uab3d\uab3f\uab46\uab48\uab49\uab55\uab5a\uab5e\uab60\uab63\uab6b\uab6e\uab71\uab7c\uab7f\uab83\uab89\uab8d\uab8e\uab8f\uab90\uab93\uab94\uab97\uab9f\uaba1\uaba4\uabab\uabad\uabae\uabb2\uabb4\uabb5\uabb7\uabb8\uabb9\uabba\uabbc\uabc0\uabc5\uabc8\uabcb\uabcd\uabce\uabd0\uabd2\uabd3\uabd4\uabd6\uabd7\uabd8\uabd9\uabdb\uabde\uabe2\uabe9\uabed\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0fdd\u0fde\u0fdf\u0fe0\u0fe1\u0fe2\u0fe3\u0fe4\u0fe5\u0fe6\u0fe7\u0fe8\u0000\u0000\u0000\u0000' + '\u01dd\u022b\u029c\u0441\u100d\u105d\u36bd\u10bf\u03db\u03de\u03e0\u03e2\u03e4\u03e7\u03ea\u03ec\u03ee\u03f0\u100e\u1010\u03f2\u03f5\u03f8\u03fa\u03fc\u03fd\u03fe\u03ff\u0211\u02f6\u02f7\u02f8\u1011\u10f1\u116a\u11be\u1202\u1242\u127b\u12b0\u12e6\u131b\u01b5\u01b6\u01b7\u01b8\u01b9\u01ba\u0212\u105f\u1060\u1061\u1062\u1063\u100f\u1012\ua903\ua905\ua906\u105e\u375d\u0442\u1013\u1014\u0000\u364a\u364b\u3655\u3656\u365e\u365f\u3668\u3669\u3671\u3672\u367a\u367d\u3685\u3688\u3694\u3697\u36a0\u36a3\u36a7\u36aa\u36b0\u36b3\u36b9\u36bc\u36c2\u36c5\u36c8\u36cb\u36d0\u36d3\u36d6\u36d9\u36dd\u36e0\u36e5\u36e6\u36e9\u36ec\u36ef\u36f4\u36f7\u36fc\u3701\u3706\u370a\u370e\u3714\u3717\u3719\u3721\u3724\u3726\u372e\u3731\u3733\u373b\u373e\u3740\u374b\u374e\u3750\u3759\u3763' + '\u376b\u376f\u3776\u377c\u377d\u3785\u3786\u378d\u378e\u3794\u3799\u37a0\u37a7\u37ae\u37b3\u37b4\u37b9\u37bd\u37c2\u37c7\u3662\u3679\u369f\u0000\u0000\u00a4\u00a6\u04e0\u04e1\u1064\u1065\u3790\u0213\u3646\u3648\u3651\u3653\u365a\u365c\u3664\u3666\u366d\u366f\u3677\u367c\u3683\u3687\u3692\u3696\u369d\u36a2\u36a5\u36a9\u36ae\u36b2\u36b7\u36bb\u36c0\u36c4\u36c6\u36ca\u36ce\u36d2\u36d4\u36d8\u36db\u36df\u36e1\u36e3\u36e8\u36ea\u36ee\u36f2\u36f6\u36fa\u36ff\u3704\u3708\u370c\u3712\u3716\u3718\u371f\u3723\u3725\u372c\u3730\u3732\u3739\u373d\u373f\u3749\u374d\u374f\u3757\u3761\u3769\u376d\u3774\u3778\u377a\u3781\u3783\u3789\u378b\u3792\u3797\u379e\u37a5\u37ac\u37b0\u37b1\u37b8\u37bc\u37c0\u37c5\u3661\u3676\u369c\u37b6\u37bb\u37bf\u37c4\u0214\u1066\u1068\u1069\u36ac' + '\u0000\u0000\u0000\u0000\u0000\u37c8\u37ca\u37cc\u37ce\u37d0\u37d1\u37d3\u37d5\u37d6\u37d9\u37dd\u37df\u37e1\u37e2\u37e6\u37e7\u37e8\u37e9\u37ea\u37ec\u37ed\u37f1\u37f3\u37f6\u37f8\u37fb\u37fd\u37fe\u3800\u3801\u3802\u3803\u3805\u3808\u3809\u380c\u380f\u37cf\u37db\u37e3\u3810\u37f7\u37d4\u0000\u3431\u3436\u35a3\u3439\u35a7\u35aa\u343e\u3443\u3446\u35af\u35b2\u35b5\u35b8\u35bb\u35be\u3492\u344b\u3450\u3455\u349f\u3458\u345d\u3460\u3466\u346c\u346f\u3475\u347a\u347f\u3484\u3511\u3514\u3517\u351a\u351d\u3520\u3523\u3526\u3529\u352c\u352f\u3532\u3535\u3538\u353b\u353e\u3541\u3544\u3547\u354a\u354d\u350e\u348a\u348c\u35d2\u35d4\u35d9\u35dc\u35e2\u35e7\u35ea\u3496\u35ef\u35f2\u3498\u349a\u349d\u34a2\u34a4\u34a9\u34ac\u34af\u34b1\u34b3\u34b5\u34b7\u34bb\u34c0\u34cb' + '\u34d3\u34d9\u3605\u3607\u34e5\u34e7\u34e9\u355e\u3560\u3564\u356e\u3570\u3573\u357e\u3582\u0000\u1015\u1016\ua899\ua8b9\ua89d\ua928\ua89f\ua8a8\ua8a1\uaa4b\ua8af\ua8a3\ua89a\ua93c\ua92c\ua8be\u37c9\u37eb\u37e0\u37d8\u37f9\u37fa\u37f5\u37f4\u380e\u37f2\u380a\u380d\u37cd\u37dc\u37fc\u37ff\u3806\u3807\u3804\u380b\u37cb\u37d2\u37da\u37de\u37ee\u37ef\u37f0\u37d7\u37e4\u37e5\u3811\u3812\u0fe9\u0fea\u0feb\u0fec\u0fed\u0fee\u0fef\u0ff0\u0ff1\u0ff2\u0ff3\u0ff4\u0ff5\u0ff6\u0ff7\u0ff8\u0ff9\u0ffa\u0ffb\u0ffc\u0ffd\u0ffe\u0fff\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100a\u100b\u100c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u3691\u36b6\u36bf\u36f1\u3703\u3711\u371e\u372b\u3738\u3748\u3768\u3791\u3796\u379d\u37a4\u37ab' + '\u032f\u0331\u0333\u0335\u0337\u0339\u033b\u033d\u0341\u0344\u0346\u0348\u034a\u034c\u0330\u0332\u0334\u0336\u0338\u033a\u033c\u033e\u0342\u0345\u0347\u0349\u034b\u034d\u0343\u033f\u0340\u0000\u034e\u0352\u0350\u035e\u0353\u0358\u034f\u0357\u0351\u035a\u0362\u0367\u0366\u0364\u0371\u035f\u0361\u0365\u0363\u036a\u035c\u0368\u036f\u036b\u0359\u0354\u035d\u0360\u0369\u0355\u0370\u035b\u036c\u0356\u036d\u036e\ua91c\ua96d\ua9b2\uaa94\u1112\u1180\u11d3\u1215\u1256\u128d\u12c3\u12f8\u1731\u1184\u1187\u118a\u118d\u1190\u1192\u1194\u1196\u1198\u11d4\u11d6\u11d8\u11d9\u11da\u11db\u3432\u343a\u343f\u3447\u344c\u3451\u3459\u3461\u3467\u3470\u3476\u347b\u3480\u3485\u3434\u343c\u3441\u3449\u344e\u3453\u345b\u3463\u3469\u3472\u3478\u347d\u3482\u3487\u3473\u346a\u3464\u1017' + '\ua898\ua8b8\ua89c\ua927\ua8ba\ua8d8\ua89b\ua8d6\ua8b3\ua904\ua9ca\uaa14\ua9f6\ua9d1\uab64\ua92b\ua9bc\ua9d8\ua9cc\uaa78\ua917\uaa2d\uab30\uaa7e\ua8f3\uaa89\uaa4c\ua943\uab51\ua8cd\ua90d\ua9fc\uab98\ua8c4\ua8dd\ua9e5\ua89e\ua8a7\ua8a0\ua964\ua916\ua900\ua94a\ua947\uaa60\ua8c3\uab32\ua908\ua939\u11dc\u11dd\u11de\u11df\u1216\u1217\u1218\u1219\u121a\u121b\u121c\u121d\u121e\u121f\u1257\u1147\u119b\u11e1\u1221\u1259\u128f\u12c5\u12fa\u132e\u1115\u111b\u1121\u1520\u1484\u1485\u15fb\u364c\u3657\u3660\u366a\u3673\u367b\u3686\u3695\u36a1\u36a8\u36b1\u36ba\u36c3\u36c9\u36d1\u36d7\u36de\u36e7\u36ed\u36f5\u36fd\u3702\u3707\u370b\u370f\u3715\u3722\u372f\u373c\u374c\u375a\u3764\u376c\u3770\u3777\u377e\u3787\u378f\u3795\u379a\u37a1\u37a8\u37af\u37b5\u37ba\u37be\u37c3\ua8c2' + '\u364e\u364f\u3650\u364d\u3658\u3659\u3663\u366c\u366b\u3675\u3674\u3680\u3681\u3682\u367e\u367f\u3689\u368a\u368c\u368b\u368d\u368e\u368f\u3690\u3698\u3699\u369a\u369b\u36a4\u36ad\u36ab\u36b4\u36b5\u36be\u36cc\u36cd\u36da\u36f0\u36f8\u36f9\u36fe\u3710\u371d\u371a\u371b\u371c\u3727\u3728\u3729\u372a\u3735\u3736\u3734\u3737\u3746\u3743\u3744\u3747\u3745\u3741\u3742\u3751\u3752\u3756\u3753\u3754\u3755\u375b\u375c\u375e\u375f\u3760\u3765\u3766\u3767\u3772\u3773\u3771\u377f\u3780\u3788\u379b\u379c\u37a3\u37a2\u37a9\u37aa\u37b7\u10ce\u1148\u119c\u11e2\u1222\u125a\u1290\u12c6\u12fb\u132f\u1116\u111c\u1122\u1127\u112c\u1131\u1136\u113b\u1140\u1145\u1183\u1186\u1189\u118c\u118f\u1522\u1424\u1390\u13be\u16f1\u172b\u1428\u1429\u142a\u156d\ua969\ua9c0\ua93b\ua9be\ua9d9' + '\u1729\u1673\u1a4f\u1637\u15b4\u15b5\u1639\u14e6\u13ec\u15b6\u172c\u1674\u1a50\u1a51\u163a\u15b7\u1523\u15b8\u163b\u14e7\u1804\u1a52\u163d\u1427\u15ba\u14bc\u1678\u1a53\u163e\u13ef\u15bb\u163f\u13f0\u1635\u15bd\u1640\u13f1\u1636\u15be\u1633\u1634\u172a\u15bf\u1642\u14e8\u177a\u177b\u177c\u1730\u167a\u1a54\u1643\u1732\u167b\u1a55\u1644\u15c1\u1645\u1733\u167c\u1a56\u1646\u15c2\u1647\u15c3\u1648\u1384\u13bf\u13ed\u13ee\u13eb\u13f2\u1426\u14e9\u151f\u1521\u156c\u15b9\u15bc\u15c0\u15f7\u15f8\u15f9\u15fc\u1638\u163c\u1641\u172d\u1728\u172e\u172f\u17cd\u17cf\u18c9\u189b\u1388\u1146\u119a\u11e0\u1220\u1258\u128e\u12c4\u12f9\u132d\u1114\u111a\u1120\u1126\u112b\u1130\u1135\u113a\u113f\u1144\u1182\u1185\u1188\u118b\u118e\u1191\u1193\u1195\u1197\u1199\u11d5\u11d7\u14e5' + '\u3cee\u3cf4\u3cf5\u3d03\u3d04\u3d1d\u3d2e\u3d3c\u3d3d\u3d3e\u3d43\u3d44\u3d46\u3d47\u3d48\u3d49\u3d53\u3d54\u3d55\u3d56\u3d57\u3d58\u3d5b\u3d5c\u3d5d\u3d64\u3d65\u3d66\u3d6b\u3d6c\u3d6d\u3d6e\u3d6f\u3d74\u3d75\u3d76\u3d78\u3d7c\u3d7d\u3d82\u3d86\u3d9a\u3da3\u3da4\u3da8\u3dab\u3db7\u3db9\u3def\u3df0\u3df1\u3df2\u3df3\u3df4\u3df5\u3df6\u3e37\u3e38\u3e39\u3e3a\u3e3b\u3e3c\u3e3d\u3e3e\u3e3f\u3e7b\u3e7c\u3e7d\u3e7e\u3e7f\u3e80\u3e81\u3e82\u3ec9\u3eca\u3ecb\u3ecc\u3ecd\u3ece\u3ecf\u3ed0\u3ed1\u3ed2\u3ed3\u3ed4\u3ed5\u3ed6\u3f17\u3f18\u3f19\u3f1a\u3f1b\u3f1c\u3f1d\u3f1e\u3f1f\u3f20\u3f21\u3f22\u3f75\u3fbf\u3f76\u3f77\u3f78\u3f79\u3f7a\u3f7b\u3f7c\u3f7d\u3f7e\u3fc0\u3fc1\u3fc2\u3fc3\u3fc4\u3ff0\u3ff1\u3ff2\u3ff3\u3ff4\u3ff5\u3ff6\u3ff7\u401d\u401e\u401f\u4020\u4021' + '\u4022\u4023\u404b\u404c\u404d\u404e\u404f\u4050\u4051\u4052\u4053\u4054\u4055\u4056\u4057\u4058\u4059\u4075\u4076\u4077\u4078\u4079\u407a\u407b\u407c\u408e\u408f\u4090\u4091\u409f\u40a0\u40a7\u40a8\u40ac\u40ad\u40ae\u40b0\u40b1\u40b2\u40b7\u40b8\u40bc\u40be\u40cb\u40d8\u40de\u40e2\u40e8\u40ed\u40ee\u40f1\u40f2\u40f3\u4102\u4103\u4104\u410a\u4112\u4122\u4128\u4129\u412b\u412c\u412d\u4131\u4132\u413b\u4144\u4146\u4149\u4153\u4154\u415d\u4163\u4164\u4165\u4166\u4167\u416b\u416c\u4178\u4179\u417a\u417e\u4184\u4185\u4187\u4189\u41a3\u41b0\u41c2\u41c3\u41c4\u41d3\u41d4\u41e7\u41e8\u41fe\u41ff\u4200\u4201\u4202\u4203\u4213\u4214\u4215\u4216\u4217\u422e\u422f\u4230\u4231\u4232\u423d\u423e\u423f\u4240\u4241\u4242\u4248\u4249\u424a\u424b\u424c\u4256\u4257\u425d\u425e' + '\u425f\u4260\u4261\u4262\u4263\u4264\u4265\u4266\u4267\u4268\u4274\u427a\u427b\u427c\u427e\u427f\u4280\u4282\u4283\u4290\u4298\u4299\u429a\u42a7\u42a8\u42b4\u42b5\u42b6\u42c3\u42ca\u42cb\u42cc\u42d5\u42da\u42ea\u42f4\u42f5\u42f6\u42f7\u42f8\u4313\u4316\u4318\u431c\u431e\u4321\u8136\u432e\u432f\u433a\u433c\u433d\u433e\u4342\u4348\u434d\u4353\u435b\u4364\u4365\u4371\u437f\u4384\u4385\u4390\u4396\u43aa\u43ab\u43ac\u43b1\u43b2\u43b3\u43b8\u43b9\u43c0\u43c6\u43c7\u43c8\u43d3\u43d6\u43dc\u43dd\u43e0\u43e2\u43e4\u43ea\u43f4\u43f7\u43f8\u43fc\u4404\u4405\u440a\u440c\u4412\u4418\u441b\u441e\u8f66\u443e\u443f\u4440\u445b\u445c\u445d\u44a4\u44a5\u44a6\u44a7\u44a8\u44a9\u44aa\u44ab\u44ac\u44ad\u44ae\u44af\u44b0\u44b1\u44f3\u44f4\u44f5\u44f6\u44f7\u44f8\u44f9\u44fa\u44fb' + '\u453e\u453f\u4540\u4541\u4542\u4543\u4544\u4545\u4546\u4547\u4548\u4549\u454a\u454b\u454c\u4595\u4596\u4597\u4598\u4599\u459a\u459b\u459c\u459d\u459e\u459f\u45a0\u45a1\u45a2\u45a3\u45a4\u45f4\u45f5\u45f6\u45f7\u45f8\u45f9\u45fa\u45fb\u45fc\u45fd\u45fe\u45ff\u4600\u4601\u4602\u4603\u4604\u4605\u4606\u4607\u4608\u4609\u460a\u4652\u4653\u4654\u4655\u4656\u4657\u4658\u4659\u465a\u465b\u465c\u465d\u465e\u465f\u4660\u4661\u4662\u4663\u4664\u4665\u4666\u4667\u4668\u4669\u466a\u466b\u466c\u466d\u46a6\u46a7\u46a8\u46a9\u46aa\u46ab\u46ac\u46ad\u46ae\u46af\u46b0\u46b1\u46b2\u46b3\u46b4\u46b5\u46e8\u46e9\u46ea\u46eb\u46ec\u46ed\u46ee\u46ef\u46f0\u46f1\u46f2\u46f3\u46f4\u46f5\u46f6\u472c\u472d\u472e\u472f\u4730\u4731\u4732\u4733\u4734\u4735\u4754\u4755\u4756\u4757\u4758' + '\u4759\u475a\u475b\u475c\u475d\u4776\u4777\u4778\u4779\u478b\u478c\u478d\u478e\u478f\u4790\u4791\u479e\u479f\u47a0\u47aa\u47ab\u47b7\u47b8\u47b9\u47c2\u47c6\u47c7\u47cd\u47ce\u47d7\u4291\u47df\u47fb\u47fc\u47ff\u4806\u481a\u481e\u482b\u4865\u4866\u4867\u4868\u4869\u486a\u486b\u486c\u486d\u486e\u4899\u489a\u489b\u489c\u489d\u48cb\u48cc\u48cd\u48ce\u48cf\u48d0\u48d1\u48d2\u48d3\u48fa\u48fb\u48fc\u48fd\u48fe\u48ff\u4900\u4901\u493b\u493c\u493d\u493e\u493f\u4940\u4941\u4974\u4975\u4976\u4977\u4978\u4979\u497a\u497b\u497c\u497d\u497e\u49aa\u49ab\u49ac\u49ad\u49ae\u49af\u49b0\u49db\u49dc\u49dd\u49de\u49df\u49e0\u49e1\u49ff\u4a00\u4a01\u4a02\u4a03\u4a04\u4a05\u4a06\u4a07\u4a1c\u4a1d\u4a1e\u4a1f\u4a20\u4a21\u4a22\u4a2f\u4a30\u4a31\u4a32\u4a35\u4a36\u4a37\u4a40\u4a41' + '\u4a45\u4a4a\u4a4c\u4a5e\u4a64\u4a6d\u4a73\u4a74\u4a80\u4a86\u4a8b\u4a90\u4a91\u4a93\u4aa2\u4aab\u4aac\u4aad\u4ab4\u4ab5\u4ac0\u4ac1\u4ac2\u4ac3\u4ac4\u4ac5\u4acf\u4ad0\u4ada\u4adb\u4adc\u4ae4\u4ae8\u4af0\u4af8\u4b0b\u4b0c\u4b0d\u4b0e\u4b0f\u4b10\u4b33\u4b34\u4b35\u4b36\u4b37\u4b38\u4b39\u4b67\u4b68\u4b69\u4b6a\u4b6b\u4b6c\u4b6d\u4b6e\u4b6f\u4b70\u4b71\u4b72\u4b73\u4b74\u4b75\u4b76\u4b77\u4b78\u4ba9\u4baa\u4bab\u4bac\u4bad\u4bae\u4baf\u4bb0\u4bb1\u4bb2\u4bb3\u4be1\u4be2\u4be3\u4be4\u4be5\u4be6\u4be7\u4be8\u4be9\u4bea\u4beb\u4bec\u4bed\u4bee\u4bef\u4bf0\u4bf1\u4bf2\u4bf3\u4b3a\u4bf4\u4bf5\u4bf6\u4bf7\u4c3a\u4c3b\u4c3c\u4c3d\u4c3e\u4c3f\u4c40\u4c41\u4c42\u4c7c\u4c7d\u4c7e\u4c7f\u4c80\u4c81\u4c82\u4c83\u4c84\u4c85\u4c86\u4c87\u4c88\u4c89\u4c8a\u4c8b\u4c8c\u4c8d' + '\u4c8e\u4c8f\u4c90\u4c91\u4c92\u4cb8\u4cb9\u4cba\u4cbb\u4cbc\u4cbd\u4cbe\u4cbf\u4cc0\u4cc1\u4cc2\u4cc3\u4cc4\u4cc5\u4cc6\u4cc7\u4ce6\u4ce7\u4ce8\u4ce9\u4cea\u4ceb\u4cec\u4ced\u4cee\u4cef\u4cf0\u4cf1\u4cf2\u4cf3\u4d11\u4d12\u4d13\u4d14\u4d15\u4d16\u4d2b\u4d2c\u4d2d\u4d2e\u4d2f\u4d44\u4d45\u4d4b\u4d4c\u4d50\u4d51\u4d52\u4d53\u4d5b\u4d5c\u4d5d\u4d61\u4d65\u4d69\u4d6a\u4d75\u4d7b\u4d7c\u4d86\u4d8a\u4d8e\u4d8f\u4d95\u4d98\u4d9c\u4d9f\u4da6\u4da8\u4dad\u4dae\u4db4\u4db5\u4dbf\u4dc0\u4dc1\u4dc2\u4dd2\u4ddc\u4ddd\u4dde\u4ddf\u4df4\u4df5\u4df6\u4df7\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08\u4e09\u4e17\u4e18\u4e21\u4e22\u4e23\u4e24\u4e25\u4e31\u4e32\u4e33\u4e34\u4e3a\u4e3b\u4e3c\u4e41\u4e47\u4e48\u4e4b\u4e52\u4e54\u4e5b\u4e62\u4e75\u4e77\u4e7b\u4e7c\u4e83\u4e89\u4e8b\u4e8c' + '\u4e8f\u4e90\u4e91\u4e92\u4e93\u4e94\u4e95\u4e98\u4e99\u4e9d\u4e9e\u4ea6\u4ea8\u4ea9\u4eb0\u4eb8\u4eb9\u4eba\u4ec0\u4ec1\u4ec2\u4ec3\u4ec4\u4ece\u4ed4\u4ed5\u4eda\u4edb\u4ede\u4edf\u4ee0\u4ee5\u4ee6\u4eeb\u4ef1\u4ef3\u4efd\u4efe\u4eff\u4f00\u4f0d\u4f0e\u4f0f\u4f10\u4f11\u4f12\u4f13\u4f14\u4f2d\u4f2e\u4f2f\u4f30\u4f31\u4f32\u4f33\u4ef4\u4f34\u4f5e\u4f5f\u4f60\u4f61\u4f62\u4f63\u4f64\u4f65\u4f66\u4f67\u4f68\u4f8c\u4f8d\u4f8e\u4fad\u4fae\u4faf\u4fb0\u4fb1\u4fb2\u4fb3\u4fb4\u4fb5\u4fb6\u4fb7\u4fb8\u4fb9\u4fba\u4fbb\u4fbc\u4fe8\u4fe9\u4fea\u4feb\u4fec\u4fed\u4fee\u4fef\u4ff0\u4ff1\u4ff2\u4ff3\u4ff4\u4ff5\u4ff6\u5024\u5025\u5026\u5027\u5028\u5029\u502a\u502b\u502c\u502d\u5048\u5049\u504a\u504b\u504c\u504d\u504e\u504f\u5050\u5069\u506a\u506b\u506c\u506d\u506e\u506f' + '\u5070\u5071\u5072\u5073\u5074\u508c\u508d\u508e\u508f\u5090\u5091\u5092\u5093\u5094\u5095\u5096\u5097\u50a9\u50aa\u50ab\u50ac\u50ad\u50ae\u50af\u50b8\u50b9\u50ba\u50bb\u50bc\u50c0\u50c1\u50c2\u50c7\u50c8\u50c9\u50ca\u50d2\u50d6\u50d7\u50df\u50e4\u50ea\u50f0\u50fa\u50fb\u50fd\u50ff\u5104\u5107\u510e\u5118\u5119\u511d\u511e\u511f\u5128\u5129\u512a\u512b\u512c\u512d\u513a\u513b\u513c\u513d\u5149\u514a\u514b\u514c\u514d\u514e\u5159\u515a\u5166\u5167\u5168\u5169\u516a\u516b\u5178\u5179\u517a\u517b\u517c\u517d\u517e\u517f\u5186\u5187\u5188\u5189\u518a\u5196\u5197\u5198\u5199\u51a5\u51a6\u51ab\u51ac\u51ad\u51b1\u51b2\u51b8\u51b9\u51ba\u51bb\u51ca\u51cb\u51cc\u51cd\u51d6\u51d7\u51d8\u51e8\u51e9\u51f4\u51f5\u51f6\u51f7\u51f8\u51f9\u51fa\u51fb\u5203\u5204\u5205\u5206' + '\u5207\u5208\u5209\u5213\u5214\u5215\u5216\u5217\u5225\u5226\u5227\u5228\u5229\u5232\u5233\u5234\u5235\u523e\u524c\u524d\u524e\u524f\u525c\u525d\u525e\u5265\u5266\u5267\u5268\u526d\u5271\u5277\u527c\u528d\u528f\u5290\u5297\u5298\u529b\u52a0\u52a7\u52a8\u52a9\u52aa\u52af\u52b0\u52bb\u52bc\u52bd\u52be\u52c4\u52c5\u52c6\u52c7\u52c8\u52c9\u52ce\u52cf\u52d6\u52d7\u52d8\u52de\u52df\u52e0\u52e5\u52e6\u52e7\u52eb\u52f0\u52f1\u52f6\u52ff\u5307\u530d\u5311\u5312\u5313\u5314\u531c\u531e\u531f\u5323\u5325\u5326\u5329\u532c\u5335\u5336\u5340\u5341\u534c\u534d\u534e\u534f\u5350\u5351\u5352\u5353\u535b\u535c\u536b\u536c\u536d\u536e\u536f\u5370\u5379\u537a\u537b\u537c\u537d\u5383\u5387\u5388\u5389\u5391\u5392\u5395\u5396\u5399\u539b\u539e\u53a4\u53a9\u53bc\u53bd\u53be\u53bf' + '\u53c0\u53eb\u53ec\u53ed\u53ee\u53ef\u53f0\u53f1\u53f2\u53f3\u53f4\u53f5\u542f\u5430\u5431\u5432\u5433\u5434\u5435\u5436\u5437\u5438\u5439\u543a\u543b\u543c\u547b\u547c\u547d\u547e\u547f\u5480\u5481\u5482\u5483\u5484\u5485\u5486\u5487\u5488\u5489\u548a\u548b\u548c\u548d\u548e\u54c2\u54c3\u54c4\u54c5\u54c6\u54c7\u54c8\u54c9\u54ca\u54cb\u54cc\u54cd\u548f\u54ce\u54cf\u54d0\u5511\u5512\u5513\u5514\u5515\u5516\u5517\u5518\u5519\u551a\u551b\u551c\u551d\u551e\u551f\u5520\u5521\u5522\u5523\u5524\u5525\u5526\u5527\u5528\u5529\u552a\u552b\u552c\u5565\u5566\u5567\u5568\u5569\u556a\u556b\u556c\u556d\u556e\u556f\u5570\u5571\u5572\u5573\u5574\u5575\u5576\u55a2\u55a3\u55a4\u55a5\u55a6\u55a7\u55a8\u55a9\u55aa\u55ab\u55ac\u55ad\u55ae\u55af\u55b0\u55b1\u55e7\u55e8\u55e9\u55ea' + '\u55eb\u55ec\u55ed\u55ee\u55ef\u55f0\u55f1\u55f2\u55f3\u5620\u5621\u5622\u5623\u5624\u5625\u5626\u5627\u5628\u5629\u562a\u562b\u562c\u562d\u564e\u564f\u5650\u5666\u5667\u5668\u5669\u566a\u566b\u566c\u5679\u567a\u567f\u5680\u5681\u5682\u5683\u5687\u5688\u5689\u5691\u5692\u5698\u56a5\u56a6\u56ab\u56ac\u56ad\u56af\u56b1\u56b2\u56b3\u56b8\u56bc\u56c3\u56ca\u56cf\u56d0\u56d4\u56de\u56e3\u56e4\u56e8\u56e9\u56fd\u56fe\u56ff\u5716\u5717\u5718\u5752\u5753\u5754\u5755\u5756\u5757\u5758\u5759\u575a\u57a0\u57a1\u57a2\u57a3\u57a4\u57a5\u57a6\u57a7\u57a8\u57a9\u57aa\u57ab\u57ac\u57ad\u57ae\u57ed\u57ee\u57ef\u57f0\u57f1\u57f2\u57f3\u57f4\u57f5\u57f6\u57f7\u57f8\u57f9\u57fa\u57fb\u57fc\u57fd\u583b\u583c\u583d\u583e\u583f\u5840\u5841\u589a\u589b\u589c\u589d\u589e\u589f\u58a0' + '\u58a1\u58a2\u58a3\u58a4\u58a5\u58a6\u58a7\u58a8\u58a9\u58f3\u58f4\u58f5\u58f6\u58f7\u58f8\u58f9\u58fa\u58fb\u58fc\u58fd\u58fe\u58ff\u5946\u5900\u5901\u5947\u5948\u5949\u594a\u594b\u594c\u594d\u594e\u594f\u5950\u5951\u5952\u5953\u5954\u5955\u5956\u5957\u5958\u5959\u595a\u5995\u5996\u5997\u5998\u5999\u599a\u599b\u599c\u599d\u599e\u599f\u59a0\u59a1\u59a2\u59a3\u59a4\u59a5\u59a6\u59a7\u59a8\u59a9\u59aa\u59e3\u59e4\u59e5\u59e6\u59e7\u59e8\u59e9\u59ea\u59eb\u59ec\u59ed\u59ee\u59ef\u59f0\u59f1\u5a15\u5a16\u5a17\u5a18\u5a19\u5a1a\u5a1b\u5a1c\u5a2f\u5a30\u5a31\u5a32\u5a33\u5a34\u5a4b\u5a4c\u5a4d\u5a4e\u5a4f\u5a50\u5a51\u5a52\u5a53\u5a54\u5a55\u5a56\u5a62\u5a63\u5a6d\u5a6e\u5a6f\u5a73\u5a74\u5a75\u5a76\u5a86\u5a87\u5a88\u5a8c\u5a8d\u5a90\u5a92\u5a93\u5a94\u5a96\u5aa1' + '\u5aa2\u5aa6\u5aa7\u5aae\u5aaf\u5ab0\u5ab1\u5ab9\u5aba\u5abb\u5acc\u5acd\u5ace\u5acf\u5ad0\u5ae1\u5ae2\u5ae3\u5ae4\u5ae5\u5ae6\u5ae7\u5ae8\u5ae9\u5aea\u5aeb\u5aec\u5af2\u5af3\u5af4\u5af5\u5af6\u5afa\u5afb\u5afc\u5afd\u5b06\u5b07\u5b08\u5b0d\u5b0e\u5b0f\u5b10\u5b16\u5b17\u5b1b\u5b1c\u5b1f\u5b23\u5b2b\u5b31\u5b32\u5b34\u5b35\u5b38\u5b3b\u5b3d\u5b42\u5b45\u5b46\u5b4f\u5b50\u5b51\u5b52\u5b57\u5b5b\u5b5d\u5b64\u5b68\u5b75\u5b6d\u5b76\u5b77\u5b78\u5b81\u5b82\u5b83\u5b86\u5b8d\u5b8e\u5ba7\u5ba8\u5bb2\u5bb3\u5bb4\u5bb5\u5bb6\u5bb7\u5bd9\u5bda\u5bdb\u5c02\u5c03\u5c04\u5c05\u5c06\u5c07\u5c08\u5c09\u5c0a\u5c0b\u5c23\u5c24\u5c25\u5c26\u5c27\u5c28\u5c29\u5c2a\u5c2b\u5c2c\u5c42\u5c43\u5c44\u5c45\u5c46\u5c47\u5c63\u5c64\u5c65\u5c66\u5c67\u5c68\u5c69\u5c6a\u5c6b\u5c6c\u5c6d' + '\u5c6e\u5c84\u5c85\u5c86\u5c87\u5c88\u5c89\u5c8a\u5c8b\u5c8c\u5c8d\u5c8e\u5c8f\u5c9f\u5ca0\u5ca1\u5ca2\u5cb2\u5cb3\u5cb4\u5cb5\u5cb6\u5cb7\u5ccf\u5cd0\u5cd1\u5cd2\u5cd3\u5cd4\u5cd5\u5cd6\u5cd7\u5ce3\u5ce4\u5ce5\u5cea\u5ceb\u5cec\u5ced\u5cee\u5cef\u5cf6\u5cf7\u5cfe\u5d00\u5d01\u5d05\u5d09\u5d0e\u5d20\u5d21\u5d29\u5d33\u5d34\u5d3b\u5d3c\u5d41\u8061\u5d46\u5d47\u5d49\u5d4a\u5d4b\u5d4e\u5d4f\u5d6e\u5d96\u5d97\u5d98\u5d99\u5d9a\u5dde\u5ddf\u5de0\u5de1\u5de2\u5de3\u5de4\u5de5\u5de6\u5de7\u5e4c\u5e4d\u5e4e\u5e4f\u5e50\u5e51\u5e52\u5ead\u5eae\u5eaf\u5eb0\u5eb1\u5eb2\u5eb3\u5eb4\u5eb5\u5eb6\u5eb7\u5eb8\u5eb9\u5eba\u5ebb\u5ebc\u5f15\u5f16\u5f17\u5f18\u5f19\u5f1a\u5f1b\u5f1c\u5f1d\u5f1e\u5f1f\u5f20\u5f21\u5f22\u5f90\u5f23\u5f91\u5f92\u5f93\u5f94\u5f95\u5f96\u5f97\u5f98' + '\u5f99\u5f9a\u5f9b\u5f9c\u5f9d\u5f9e\u5f9f\u5fa0\u5fa1\u5fa2\u5fa3\u6004\u6005\u6006\u6007\u6008\u6009\u600a\u600b\u600c\u600d\u600e\u600f\u6010\u6011\u6012\u6013\u6014\u6015\u6016\u6017\u6018\u6019\u6a38\u601a\u601b\u6073\u6074\u6075\u6076\u6077\u6078\u6079\u607a\u607b\u607c\u607d\u607e\u607f\u6080\u6081\u6082\u6083\u6084\u6085\u6086\u6087\u6088\u6089\u608a\u608b\u608c\u60dd\u60de\u60df\u60e0\u60e1\u60e2\u60e3\u60e4\u60e5\u60e6\u60e7\u60e8\u60e9\u60ea\u60eb\u60ec\u60ed\u60ee\u613b\u60ef\u60f0\u613c\u613d\u613e\u613f\u6140\u6141\u6142\u6143\u6144\u6145\u6146\u6147\u6148\u60f1\u6149\u614a\u614b\u614c\u614d\u614e\u614f\u6150\u6151\u6180\u6181\u6182\u6183\u6184\u6185\u6186\u6187\u6188\u6189\u618a\u618b\u618c\u61ad\u61ae\u61af\u61b0\u61b1\u61b2\u61b3\u61d2\u61d3' + '\u61d4\u61d5\u61d6\u61d7\u61d8\u61d9\u61da\u61db\u61dc\u61eb\u61ec\u61ed\u61ee\u61ef\u61f0\u61f1\u61f2\u61f3\u61f4\u61f5\u6206\u6207\u61f6\u6211\u6212\u6217\u6218\u6219\u621a\u622d\u622e\u6233\u6234\u6235\u6236\u623a\u623b\u623c\u623d\u623e\u623f\u6247\u6248\u6249\u624a\u624b\u6254\u6255\u6256\u6257\u625f\u6260\u6261\u6262\u6263\u62da\u6264\u626e\u626f\u6270\u6271\u6272\u6273\u6279\u627a\u627b\u6282\u6283\u628b\u628c\u6290\u6291\u6292\u6293\u6297\u6298\u629a\u629b\u629c\u62a1\u62a3\u62a4\u62ab\u62ac\u62ad\u62b2\u62b3\u62b9\u62be\u62c2\u62c9\u62ca\u62cb\u62cc\u62d3\u62d4\u62d5\u62db\u62e4\u62e5\u62ed\u62ee\u62ef\u62f0\u62f1\u62f2\u62f5\u62f6\u62f7\u62f8\u62f9\u62ff\u6300\u6301\u6302\u6308\u6309\u630f\u6310\u6311\u6315\u631a\u631b\u631d\u631f\u6321\u6325\u6326' + '\u632b\u632e\u632f\u6330\u6336\u6339\u633e\u633f\u6340\u6341\u6342\u6353\u6357\u635c\u635d\u635e\u635f\u6360\u6363\u636d\u6372\u6373\u6374\u6375\u6376\u6377\u6378\u6381\u6382\u6383\u6384\u638c\u638d\u638e\u638f\u6390\u6392\u6393\u6394\u6395\u6396\u6397\u63a1\u63a2\u63a3\u63a4\u63a5\u63aa\u63ab\u63ad\u63b0\u63b6\u63c1\u63d0\u63d9\u63da\u63e3\u63f2\u63f3\u63f4\u63f5\u6411\u6412\u6413\u645a\u645b\u645c\u645d\u645e\u645f\u6460\u6461\u6462\u6463\u6464\u64b7\u64b8\u64b9\u64ba\u64bb\u64bc\u64bd\u64be\u64bf\u64c0\u64c1\u6518\u6519\u651a\u651b\u651c\u651d\u651e\u651f\u6520\u6521\u6522\u6523\u6524\u6525\u657b\u657c\u657d\u657e\u657f\u6580\u6581\u6582\u6583\u6584\u6585\u6586\u6587\u6588\u6589\u658a\u65fb\u65fc\u65fd\u65fe\u65ff\u6600\u6601\u6602\u6603\u6604\u6605\u6606' + '\u6607\u6608\u6609\u660a\u660b\u660c\u660d\u660e\u660f\u6610\u6611\u6612\u6613\u6614\u6615\u668d\u668e\u668f\u6690\u6691\u6692\u6693\u6694\u6695\u6696\u6697\u6698\u6699\u669a\u669b\u669c\u669d\u669e\u669f\u66a0\u66a1\u66a2\u66fe\u66ff\u6700\u6701\u6702\u6703\u6704\u6705\u6706\u6707\u6708\u6709\u670a\u670b\u670c\u670d\u670e\u670f\u6710\u6711\u6712\u6713\u6714\u6777\u6778\u6779\u677a\u677b\u677c\u677d\u677e\u677f\u6780\u6781\u6782\u6783\u6784\u67d7\u67d8\u67d9\u67da\u67db\u67dc\u67dd\u67de\u67df\u67e0\u67e1\u67e2\u67e3\u67e4\u67e5\u67e6\u67e7\u67e8\u67e9\u6821\u6822\u6823\u6824\u6825\u6826\u6827\u6828\u6829\u682a\u682b\u682c\u682d\u682e\u682f\u6830\u6831\u6832\u6857\u6858\u6859\u685a\u685b\u685c\u685d\u685e\u685f\u6860\u6861\u6862\u6863\u6864\u6881\u6882\u6883' + '\u6884\u6885\u6886\u6887\u68a3\u68a4\u68a5\u68a6\u68a7\u68a8\u68a9\u68aa\u68be\u68bf\u68c0\u68c1\u68c2\u68c3\u68d2\u68d3\u68d4\u68d5\u68d6\u68d7\u68d8\u68e1\u68e2\u68e7\u68e8\u68e9\u68ef\u68f0\u68f7\u6906\u6907\u6915\u6916\u6917\u6935\u6936\u6937\u6938\u6939\u695f\u6960\u6961\u6962\u6963\u6964\u6965\u6966\u6992\u6993\u6994\u6995\u6996\u6997\u69c1\u69c2\u69c3\u69c4\u69c5\u69c6\u69c7\u69c8\u69c9\u69f4\u69f5\u69f6\u69f7\u69f8\u69f9\u69fa\u69fb\u69fc\u69fd\u69fe\u69ff\u6a39\u6a3a\u6a3b\u6a3c\u6a3d\u6a3e\u6a3f\u6a40\u6a41\u6a42\u6a43\u6a44\u6a45\u6a46\u6a47\u6a48\u6a49\u6a6c\u6a6d\u6a6e\u6a6f\u6a70\u6a71\u6a72\u6a73\u6a74\u6a75\u6a76\u6a77\u6a96\u6a97\u6a98\u6a99\u6a9a\u6a9b\u6a9c\u6a9d\u6ac7\u6ac8\u6ac9\u6aca\u6acb\u6acc\u6acd\u6ace\u6acf\u6ad0\u6ad1\u6aec\u6aed' + '\u6aee\u6aef\u6af0\u6af1\u6afe\u6aff\u6b0b\u6b0c\u6b18\u6b0d\u6b19\u6b1a\u6b1b\u6b1f\u6b25\u6b28\u6b29\u6b2e\u6b36\u6b37\u6b3c\u6b3f\u6b46\u6b48\u6b49\u6b4b\u6b4d\u6b55\u6b57\u6b5e\u6b5f\u6b62\u6b63\u6b64\u6b6f\u6b73\u6b74\u6b76\u6b78\u6b79\u6b80\u6b86\u6b87\u6b90\u6b91\u6b92\u6b93\u6b94\u6b9e\u6b9f\u6ba0\u6ba1\u6ba2\u6ba8\u6ba9\u6baa\u6bab\u6bb2\u6bb3\u6bb4\u6bb5\u6bb6\u6bb7\u6bb8\u6bb9\u6bc5\u6bc6\u6bc7\u6bd8\u6bce\u6bcf\u6bd0\u6bd1\u6bd9\u6bda\u6bdb\u6be0\u6be1\u6be2\u6be3\u6be4\u6be9\u6bea\u6beb\u6bed\u6bee\u6bef\u6bf0\u6bf1\u6bf8\u6bfb\u6bfd\u6c1d\u6c1e\u6c1f\u6c20\u6c21\u6c38\u6c39\u6c3a\u6c3b\u6c3c\u6c3d\u6c3e\u6c3f\u6c40\u6c41\u6c56\u6c57\u6c58\u6c59\u6c5a\u6c5b\u6c6d\u6c6e\u6c6f\u6c70\u6c71\u6c72\u6c73\u6c74\u6c95\u6c96\u6c97\u6c98\u6c99\u6c9a\u6c9b' + '\u6c9c\u6cb4\u6cb5\u6cb6\u6cb7\u6cb8\u6cb9\u6cc9\u6cca\u6ccb\u6ccc\u6ccd\u6cce\u6ccf\u6cdb\u6cdc\u6cdd\u6cde\u6cdf\u6ce0\u6cf1\u6cf2\u6cf3\u6cf4\u6cf5\u6cf6\u6d00\u6d01\u6d02\u6d0a\u6d0b\u6d0c\u6d11\u6d15\u6d16\u6d19\u6d1a\u6d1b\u6d1c\u6d23\u6d32\u6d33\u6d34\u6d35\u6d40\u6d41\u6d42\u6d43\u6d5b\u6d5c\u6d5d\u6d5e\u6d5f\u6d60\u6d61\u6d82\u6d83\u6d84\u6d85\u6d86\u6d87\u6d88\u6d89\u6dac\u6dad\u6dae\u6daf\u6db0\u6db1\u6db2\u6db3\u6db4\u6db5\u6dd5\u6dd6\u6dd7\u6dd8\u6dd9\u6dda\u6ddb\u6ddc\u6e06\u6e07\u6e08\u6e09\u6e0a\u6e0b\u6e0c\u6e0d\u6e0e\u6e0f\u6e10\u6e11\u6e36\u6e37\u6e38\u6e39\u6e3a\u6e3b\u6e3c\u6e3d\u6e3e\u6e3f\u6e59\u6e5a\u6e5b\u6e5c\u6e73\u6e74\u6e75\u6e76\u6e77\u6e78\u6e79\u6e7a\u6e7b\u6e7c\u6e92\u6e93\u6e94\u6e95\u6e96\u6e97\u6e98\u6e99\u6eab\u6eac\u6ead' + '\u6eae\u6eaf\u6eb0\u6ec8\u6ec9\u6eca\u6ecb\u6ed3\u6edc\u6ee0\u6ee1\u6ee4\u6ee5\u6ee7\u6ee8\u6ee9\u6eeb\u6eec\u6eed\u6eee\u6eef\u6ef1\u6ef5\u6ef8\u6efb\u6efc\u6f06\u6f07\u6f0b\u6f0c\u6f0d\u6f0e\u6f0f\u6f13\u6f14\u6f15\u6f16\u6f17\u6f18\u6f1d\u6f1e\u6f1f\u6f20\u6f26\u6f27\u6f28\u6f29\u6f2a\u6f2b\u6f2c\u6f32\u6f33\u6f34\u6f35\u6f36\u6f37\u6f3b\u6f3c\u6f3d\u6f43\u6f44\u6f45\u6f46\u6f4b\u6f4c\u6f4d\u6f4e\u6f4f\u6f50\u6f51\u6f55\u6f56\u6f58\u6f59\u6f5b\u6f5c\u6f5d\u6f61\u6f66\u6f67\u6f68\u6f69\u6f72\u6f74\u6f75\u6f8a\u6f8b\u6f8c\u6fa5\u6fa6\u6fa7\u6fb4\u6fb5\u6fbf\u6fc0\u6fca\u6fcb\u6fd2\u6fd3\u6fd4\u6fd5\u6fda\u6fdd\u6fde\u6fdf\u6fe3\u6fe6\u6fe8\u6fe9\u6fec\u6fee\u6ff1\u6ff7\u7000\u7001\u700b\u700c\u700d\u700e\u701f\u7020\u7021\u7022\u7023\u7024\u703e\u703f\u7040' + '\u7041\u7042\u7043\u7044\u7045\u7046\u7047\u7048\u7049\u704a\u7058\u7059\u705a\u705b\u705c\u705d\u705e\u705f\u7060\u7076\u7077\u7078\u7079\u707a\u707b\u707c\u707d\u707e\u707f\u7080\u7081\u7082\u7083\u7084\u70a0\u70a1\u70a2\u70a3\u70a4\u70a5\u70a6\u70a7\u70bc\u70bd\u70be\u70bf\u70c0\u70c1\u70c2\u70c3\u70c4\u70c5\u70c6\u70c7\u70d9\u70da\u70db\u70dc\u70dd\u70de\u70df\u70e0\u70e1\u70e2\u70e3\u70e4\u70fa\u70fb\u70fc\u70fd\u70fe\u70ff\u7100\u710f\u7110\u7121\u7122\u7123\u7124\u7125\u7126\u712b\u712c\u712d\u7132\u7138\u7139\u713a\u713e\u7141\u7144\u7145\u7148\u7158\u715e\u7165\u716a\u716b\u7174\u7175\u7176\u717c\u7180\u7189\u718d\u718f\u7192\u7193\u7194\u7197\u7198\u719a\u719b\u719e\u71a1\u71a2\u71a7\u71a8\u71aa\u71ab\u71ad\u71b0\u71b2\u71b7\u71be\u71bf\u71c9\u71ca' + '\u71cb\u71d4\u71d5\u71d9\u71dd\u71de\u71e3\u71e8\u71e9\u71ed\u71f0\u71f2\u71f3\u71f4\u71f7\u71f8\u71ff\u7200\u7201\u7202\u7203\u721c\u721d\u721e\u721f\u7220\u7221\u7222\u7223\u7224\u7225\u7246\u7247\u7248\u7249\u724a\u724b\u724c\u724d\u7261\u7262\u7263\u7264\u7265\u7266\u7267\u7268\u727b\u727c\u727d\u727e\u727f\u7280\u7281\u7282\u7283\u7284\u7285\u7286\u7287\u7288\u7289\u728a\u728b\u728c\u72a8\u72a9\u72aa\u72ab\u72ac\u72ad\u72ae\u72af\u72b0\u72cb\u72cc\u72cd\u72ce\u72cf\u72d0\u72d1\u72d2\u72d3\u72d4\u72d5\u72d6\u72d7\u72e5\u72e6\u72e7\u72e8\u72e9\u72ea\u72eb\u72ec\u72ed\u72ee\u72ef\u7300\u7301\u7302\u7303\u7304\u7305\u7306\u7307\u7308\u731d\u731e\u731f\u7320\u7321\u7322\u7323\u7324\u7325\u7331\u7332\u7333\u7334\u7335\u7336\u7337\u7345\u7346\u7347\u7348\u734d' + '\u734e\u734f\u7351\u7352\u7357\u735a\u735c\u735e\u7360\u7364\u7365\u7366\u7367\u7368\u7369\u7373\u7374\u7377\u7378\u737b\u737d\u737e\u7384\u7388\u7394\u7395\u73b2\u73b3\u73b4\u73b5\u73b6\u73dd\u73de\u73df\u73e0\u73e1\u73e2\u73e3\u73e4\u73e5\u73e6\u7402\u7403\u7404\u7405\u7406\u7407\u7408\u7425\u7426\u7427\u7428\u7429\u742a\u742b\u7451\u7452\u7453\u7454\u7455\u7456\u7457\u7458\u7459\u745a\u745b\u745c\u745d\u745e\u745f\u7460\u7461\u7480\u7481\u7482\u7483\u7484\u7485\u7486\u7487\u7488\u74aa\u74ab\u74ac\u74ad\u74ae\u74af\u74b0\u74c4\u74c5\u74c6\u74c7\u74c8\u74c9\u74ca\u74e3\u74cb\u74e4\u74e5\u74e6\u74e7\u74e8\u74e9\u74ea\u74eb\u74fd\u74fe\u74ff\u7500\u7501\u7502\u7503\u750f\u751b\u751c\u751d\u7526\u7527\u7528\u7529\u752b\u752c\u7530\u7532\u7537\u754b\u754c\u754d' + '\u754e\u7563\u7564\u7565\u7572\u7573\u7574\u7581\u7582\u7583\u7584\u7592\u7593\u7594\u7595\u7596\u7597\u7598\u7599\u75ad\u75ae\u75af\u75b0\u75b1\u75bc\u75bd\u75c1\u75c2\u75c3\u75c4\u75c5\u75cb\u75d1\u75d2\u75d5\u75d7\u75d8\u75de\u75ec\u75ed\u75f5\u75f6\u75f7\u75f8\u75f9\u75fa\u7608\u7609\u760a\u760b\u760c\u760d\u760e\u760f\u7629\u762a\u762b\u762c\u763c\u763d\u763e\u763f\u7640\u7641\u7642\u7643\u7644\u7645\u7646\u7647\u7648\u7649\u764a\u764b\u764c\u765d\u765e\u765f\u7660\u7661\u7662\u7663\u7664\u7665\u767d\u767e\u767f\u7680\u7681\u7682\u7683\u7684\u7685\u7686\u7687\u7688\u7698\u7699\u769a\u769b\u769c\u769d\u769e\u769f\u76a0\u76a1\u76a2\u76a3\u76b4\u76b5\u76b6\u76b7\u76b8\u76b9\u76ba\u76bb\u76bc\u76bd\u76be\u76cc\u76cd\u76ce\u76cf\u76d0\u76d1\u76d2\u76e0\u76e1' + '\u76e2\u76e8\u76e9\u76ea\u76eb\u76ec\u76ed\u76ee\u76fb\u76fc\u76fe\u76ff\u7700\u7701\u7704\u7705\u7708\u770d\u7712\u771b\u771c\u771d\u771e\u772a\u772b\u772c\u7734\u7735\u7736\u7737\u7738\u7739\u773a\u7743\u7744\u7745\u7746\u7747\u7752\u7753\u7754\u7755\u775c\u775d\u7765\u7766\u7767\u7771\u7772\u7773\u7774\u7775\u7776\u777d\u777e\u777f\u7780\u7781\u7782\u7783\u7786\u7787\u7789\u778a\u778c\u7790\u7792\u7797\u7798\u77a1\u77a2\u77aa\u77ab\u77ac\u77ad\u77af\u77b6\u77b7\u77bc\u77bd\u77be\u77bf\u77c6\u77ca\u77cc\u77cd\u77dc\u77ee\u77ef\u77f0\u77f1\u77f2\u77f3\u77f4\u781e\u781f\u7820\u7821\u7822\u7823\u7824\u7825\u7826\u7847\u7848\u7849\u784a\u784b\u784c\u784d\u784e\u784f\u7850\u7851\u7852\u7853\u7854\u7879\u787a\u787b\u787c\u787d\u787e\u787f\u7880\u7881\u7882\u7883' + '\u7884\u78b0\u78b1\u78b2\u78b3\u78b4\u78b5\u78b6\u78b7\u78b8\u78b9\u78ba\u78bb\u78bc\u78e3\u78e4\u78e5\u78e6\u78e7\u78e8\u78e9\u78ea\u78eb\u78ec\u78ed\u78ee\u78ef\u78f0\u78f1\u78f2\u78f3\u78f4\u78f5\u78f6\u78f7\u78f8\u78f9\u78fa\u78fb\u78fc\u78fd\u78fe\u791e\u791f\u7920\u7921\u7922\u7923\u7924\u7925\u7926\u7927\u7928\u7929\u792a\u792b\u7952\u7953\u7954\u7955\u7956\u7957\u7958\u7959\u795a\u795b\u795c\u795d\u795e\u795f\u7960\u7961\u797d\u797e\u797f\u7980\u7981\u7982\u7983\u79a0\u7984\u7985\u7986\u7987\u7988\u7989\u798a\u798b\u798c\u798d\u798e\u79a1\u79a2\u79a3\u79a4\u79a5\u79a6\u79a7\u79a8\u798f\u79a9\u79b9\u79bf\u79c0\u79c1\u79c2\u79c3\u79c4\u79c5\u79c6\u79d2\u79d3\u79d4\u79d5\u79dd\u79de\u79df\u9feb\u79e1\u79e9\u79ea\u79ec\u79ff\u7a0f\u7a10\u7a1f\u7a20\u7a21' + '\u7a22\u7a32\u7a33\u7a34\u7a35\u7a36\u7a37\u7a41\u7a42\u7a43\u7a44\u7a45\u7a46\u7a52\u7a53\u7a54\u7a55\u7a56\u7a57\u7a65\u7a66\u7a67\u7a68\u7a69\u7a6a\u7a6b\u7a77\u7a78\u7a85\u7a86\u7a87\u7a88\u7a89\u7a8a\u7a8b\u7a91\u7a92\u7a93\u7a94\u7a95\u7a96\u7a97\u7a9d\u7a9e\u7a9f\u7aa3\u7aa4\u7aa6\u7aaa\u7aac\u7aad\u7aaf\u7ab0\u7aba\u7ac5\u7ac6\u7ac7\u7ac8\u7ae7\u7ae8\u7ae9\u7aea\u7aeb\u7aec\u7aed\u7aee\u7aef\u7af0\u7af1\u7af2\u7af3\u7af4\u7b1a\u7b1b\u7b1c\u7b1d\u7b1e\u7b1f\u7b20\u7b21\u7b22\u7b23\u7b24\u7b25\u7b26\u7b51\u7b52\u7b53\u7b54\u7b55\u7b56\u7b57\u7b58\u7b59\u7b5a\u7b81\u7b82\u7b83\u7b84\u7b85\u7b86\u7b87\u7b88\u7bc1\u7bc2\u7bc3\u7bc4\u7bc5\u7bc6\u7bc7\u7bc8\u7bc9\u7bca\u7bcb\u7bcc\u7c00\u7c01\u7c02\u7c03\u7c04\u7c05\u7c06\u7c07\u7c08\u7c09\u7c0a\u7c0b\u7c0c' + '\u7c0d\u7c0e\u7c0f\u7c10\u7c11\u7c33\u7c34\u7c35\u7c36\u7c37\u7c38\u7c39\u7c5d\u7c5e\u7c5f\u7c60\u7c61\u7c62\u7c63\u7c64\u7c65\u7c66\u7c82\u7c83\u7c84\u7c85\u7c86\u7c87\u7c9c\u7c9d\u7c9e\u7c9f\u7ca0\u7ca1\u7ca2\u7cac\u7cad\u7cae\u7caf\u7cb0\u7cbe\u7cbf\u7cc2\u7cc3\u7cc4\u7cc5\u7cca\u7ccc\u7ccd\u7cce\u7ccf\u7cd4\u7cd5\u7cd8\u7ce8\u7d0e\u7cfb\u7d0f\u7d1f\u7d20\u7d2a\u7d44\u7d5c\u7d5d\u7d6a\u7d7b\u7d80\u7d84\u7d87\u7d88\u7d89\u7d8a\u7d8b\u7d8c\u7d90\u7d93\u7d94\u7d96\u7da3\u7da8\u7dad\u7dae\u7db2\u7db3\u7db4\u7dbd\u7dbe\u7dbf\u7dc1\u7dc5\u7dc6\u7dd0\u7dd1\u7dd2\u7dd3\u7dd9\u7de2\u7de3\u7de9\u7deb\u7df0\u7df1\u7df5\u7e06\u7e07\u7e08\u7e10\u7e11\u7e12\u7e13\u7e17\u7e18\u7e19\u7e22\u7e24\u7e25\u7e26\u7e27\u7e28\u7e2e\u7e31\u7e32\u7e33\u7e37\u7e38\u7e40\u7e4b\u7e4c' + '\u7e59\u7e5a\u7e5b\u7e5c\u7e5d\u7e5e\u7e5f\u7e68\u7e69\u7e6a\u7e6b\u7e6f\u7e70\u7e71\u7e72\u7e7a\u7e7b\u7e7c\u7e7d\u7e7e\u7e8c\u7e8d\u7e99\u7e9a\u7e9b\u7ea0\u7ea1\u7ea5\u7eae\u7eaf\u7eb0\u7eb7\u7eb8\u7eb9\u7ebd\u7ec9\u7ecd\u7ece\u7ed2\u7ed3\u7ed4\u7ed5\u7ed6\u7ed9\u7eda\u7ee0\u7ee1\u7ee2\u7ee5\u7ee8\u7eed\u7efc\u7efd\u7f09\u7f0a\u7f13\u7f18\u7f19\u7f25\u7f26\u7f27\u7f28\u7f29\u7f33\u7f34\u7f37\u7f38\u7f39\u7f3f\u7f40\u7f41\u7f42\u7f49\u7f4f\u7f52\u7f5b\u7f65\u7f66\u7f78\u7f79\u7f9b\u7f9c\u7f9d\u7f9e\u7f9f\u7fa0\u7fa1\u7fa2\u7fa3\u7fa4\u7fa5\u7fa6\u7fa7\u7fa8\u7fd6\u7fd7\u7fd8\u7fd9\u7fda\u7fdb\u7fdc\u7fdd\u8005\u8006\u8007\u8008\u8009\u800a\u800b\u800c\u800d\u8032\u8033\u8034\u8035\u8036\u8037\u8038\u8039\u803a\u803b\u803c\u803d\u803e\u8062\u8063\u8064\u8065' + '\u8066\u8067\u8068\u8069\u806a\u806b\u806c\u806d\u806e\u806f\u8070\u8071\u8072\u8099\u809a\u809b\u809c\u809d\u809e\u809f\u80a0\u80a1\u80a2\u80a3\u80a4\u80a5\u80a6\u80a7\u80bb\u80bc\u80bd\u80be\u80bf\u80c0\u80c1\u80c2\u80c3\u80c4\u80c5\u80c6\u80c7\u80c8\u80c9\u80dc\u80dd\u80de\u80df\u80e0\u80e1\u80e2\u80e3\u80e4\u80e5\u80f9\u80fa\u80fb\u80fc\u80fd\u80fe\u80ff\u8100\u8101\u8118\u8119\u811a\u811b\u8123\u8124\u8125\u8126\u812b\u812c\u812d\u8133\u8134\u8137\u8138\u8139\u813a\u813d\u8144\u8149\u8155\u815b\u8164\u8166\u816b\u816d\u8170\u8178\u8179\u817b\u8182\u818a\u818b\u818c\u818f\u8194\u8195\u8196\u81a4\u81a5\u81b0\u81b1\u81b2\u81b3\u81b8\u81b9\u81ba\u81bb\u81bc\u81c7\u81c8\u81cd\u81ce\u81cf\u81d0\u81d1\u81d2\u81d3\u81d4\u81dc\u81dd\u81de\u81e4\u81e5\u81e6\u81eb' + '\u81ec\u81ed\u81ee\u81ef\u81f0\u81f1\u81f5\u81f6\u81f7\u8201\u820c\u820f\u8211\u8212\u8213\u8214\u8216\u821a\u8225\u8226\u8227\u823d\u823e\u823f\u8240\u8241\u827a\u827b\u827c\u827d\u827e\u827f\u8280\u8281\u8282\u8283\u8284\u8285\u82cc\u82cd\u82ce\u82cf\u82d0\u82d1\u82d2\u82d3\u82d4\u82d5\u832e\u832f\u8330\u8331\u8332\u8333\u8334\u8335\u8336\u8337\u8338\u8339\u833a\u833b\u833c\u833d\u833e\u833f\u8390\u8391\u8392\u8393\u8394\u8395\u8396\u8397\u8398\u8399\u839a\u839b\u839c\u839d\u839e\u839f\u83a0\u83a1\u83a2\u8412\u83a3\u8413\u8414\u8415\u8416\u8417\u8418\u8419\u841a\u841b\u841c\u841d\u841e\u841f\u8420\u8421\u8422\u8423\u8424\u8425\u8426\u8427\u8428\u8429\u8491\u8492\u8493\u8494\u8495\u8496\u8497\u8498\u8499\u849a\u849b\u849c\u849d\u849e\u84f4\u84f5\u84f6\u84f7' + '\u84f8\u84f9\u84fa\u84fb\u84fc\u84fd\u84fe\u84ff\u8500\u8501\u8502\u8503\u8504\u8505\u855d\u855e\u855f\u8560\u8561\u8562\u8563\u8564\u8565\u8566\u8567\u8568\u8569\u856a\u856b\u856c\u856d\u856e\u856f\u8570\u8571\u8572\u8573\u8574\u8575\u8576\u8577\u8578\u8579\u857a\u857b\u85b5\u85b6\u85b7\u85b8\u85b9\u85ba\u85bb\u85bc\u85bd\u85be\u85bf\u85c0\u85c1\u85c2\u85c3\u85c4\u85c5\u85c6\u85c7\u85c8\u85c9\u85ca\u85cb\u85cc\u8606\u8607\u8608\u8609\u860a\u860b\u860c\u860d\u860e\u860f\u8610\u8611\u8612\u863b\u863c\u863d\u863e\u863f\u8640\u8641\u8642\u8643\u8644\u8645\u8646\u8668\u8669\u866a\u866b\u866c\u866d\u866e\u866f\u8690\u8691\u8692\u8693\u8694\u8695\u8696\u8697\u8698\u8699\u869a\u869b\u869c\u86b8\u86b9\u86ba\u86bb\u86bc\u86c5\u86c6\u86c7\u86d3\u86d4\u86d5\u86da\u86df' + '\u86e0\u86e1\u86e3\u86e4\u86e5\u86e6\u86e7\u86ea\u86ee\u86f1\u86f5\u86f6\u86f7\u86f8\u86ff\u8700\u8704\u8705\u8708\u8709\u870a\u870b\u870c\u8711\u8715\u8718\u871a\u871b\u871c\u8720\u8738\u8739\u873a\u8762\u8763\u8764\u878a\u878b\u878c\u878d\u878e\u878f\u8790\u8791\u8792\u87b8\u87b9\u87ba\u87bb\u87bc\u87bd\u87be\u87bf\u87c0\u87e7\u87e8\u87e9\u87ea\u87eb\u87ec\u87ed\u87ee\u87ef\u8822\u8823\u8824\u8825\u8826\u8827\u8828\u8829\u882a\u882b\u882c\u882d\u8864\u8865\u8866\u8867\u8868\u8869\u886a\u886b\u886c\u886d\u882e\u886e\u889a\u889b\u889c\u889d\u889e\u889f\u88a0\u88a1\u88cc\u88cd\u88ce\u88cf\u88d0\u88d1\u88d2\u88d3\u88d4\u88d5\u88d6\u88d7\u88d8\u88d9\u88da\u88db\u88fe\u88ff\u8900\u8901\u8902\u891b\u891c\u891d\u891e\u891f\u8920\u8921\u8922\u892d\u892e\u892f\u8930' + '\u8931\u8932\u893f\u8940\u8941\u894a\u894b\u894c\u894d\u894e\u8956\u8957\u8958\u8960\u8965\u8969\u896c\u896e\u8973\u8974\u8975\u897c\u8986\u8990\u8991\u8992\u8997\u8998\u89a0\u89a1\u89a2\u89be\u89bf\u89c0\u89e9\u89ea\u89eb\u89ec\u89ed\u89ee\u8a09\u8a0a\u8a0b\u8a0c\u8a0d\u8a0e\u8a0f\u8a2c\u8a2d\u8a2e\u8a2f\u8a4e\u8a4f\u8a50\u8a51\u8a52\u8a53\u8a54\u8a55\u8a56\u8a57\u8a58\u8a59\u8a5a\u8a5b\u8a5c\u8a5d\u8a78\u8a79\u8a7a\u8a7b\u8a7c\u8a7d\u8a7e\u8a7f\u8a80\u8a81\u8a82\u8a99\u8a9a\u8a9b\u8a9c\u8a9d\u8a9e\u8ab2\u8ab3\u8ab4\u8ab5\u8ab6\u8ab7\u8ab8\u8ab9\u8aba\u8abb\u8acc\u8acd\u8ace\u8acf\u8ad0\u8ad1\u8adf\u8ae0\u8ae7\u8ae8\u8ae9\u8aea\u8af1\u8af6\u8afa\u8afb\u8aff\u8b00\u8b06\u8b07\u8b0c\u8b0d\u8b0f\u8b12\u8b13\u8b1f\u8b20\u8b27\u8b28\u8b29\u8b2e\u8b2f\u8b30\u8b31' + '\u8b34\u8b35\u8b3b\u8b3c\u8b41\u8b42\u8b48\u8b49\u8b4a\u8b4b\u8b51\u8b52\u8b53\u8b58\u8b59\u8b5f\u8b60\u8b61\u8b62\u8b63\u8b69\u8b6d\u8b6e\u8b87\u8b96\u8b97\u8b98\u8b9d\u8ba2\u8ba3\u8ba4\u8ba5\u8ba6\u8ba9\u8baa\u8bab\u8bac\u8baf\u8bb0\u8bb3\u8bb6\u8bb7\u8bbc\u8bbd\u8bb8\u8bc4\u8bce\u8bcf\u8bd0\u8be3\u8be4\u8bfe\u8bff\u8c00\u8c01\u8c02\u8c03\u8c04\u8c05\u8c06\u8c07\u8c08\u8c09\u8c0a\u8c0b\u8c0c\u8c0d\u8c0e\u8c3c\u8c3d\u8c3e\u8c3f\u8c40\u8c41\u8c42\u8c43\u8c44\u8c45\u8c46\u8c47\u8c48\u8c49\u8c4a\u8c4b\u8c78\u8c79\u8c7a\u8c7b\u8c7c\u8c7d\u8c7e\u8c7f\u8c80\u8ca4\u8ca5\u8ca6\u8ca7\u8ca8\u8ca9\u8caa\u8cab\u8cac\u8cad\u8cae\u8caf\u8cdd\u8cde\u8cdf\u8ce0\u8ce1\u8ce2\u8ce3\u8ce4\u8ce5\u8ce6\u8ce7\u8ce8\u8ce9\u8cea\u8ceb\u8cec\u8d15\u8d16\u8d17\u8d18\u8d19\u8d39\u8d3a' + '\u8d3b\u8d3c\u8d3d\u8d5a\u8d5b\u8d5c\u8d5d\u8d5e\u8d5f\u8d60\u8d61\u8d80\u8d81\u8d82\u8d83\u8d84\u8d85\u8d86\u8d9e\u8d9f\u8da0\u8da1\u8da2\u8da3\u8da4\u8db0\u8db1\u8db2\u8db3\u8db4\u8db5\u8dbe\u8dbf\u8dc0\u8dcc\u8dfd\u8e27\u8e49\u8e67\u8e68\u8e6e\u8e78\u8e7b\u8e7d\u8e81\u8e82\u8e85\u8e87\u8e8b\u8e8d\u8e90\u8e93\u8e97\u8e98\u8e9b\u8e9d\u8e9e\u8e9f\u8ea3\u8ea4\u8ea5\u8ea6\u8ea7\u8ea8\u8eaa\u8eab\u8eac\u8eaf\u8eb1\u8eb7\u8ebe\u8ebf\u8ec4\u8eca\u8ecf\u8ed0\u8ed1\u8ed6\u8ed7\u8edf\u8ee1\u8ee2\u8ee4\u8ee5\u8ee6\u8ee7\u8eee\u8eef\u8ef0\u8ef1\u8ef8\u8ef9\u8f04\u8f07\u8f08\u8f0d\u8f11\u8f15\u8f16\u8f18\u8f19\u8f1a\u8f1b\u8f30\u8f31\u8f45\u8f46\u8f47\u8f48\u8f49\u8f4a\u8f4b\u8f59\u8f5a\u8f5b\u8f67\u8f68\u8f69\u8f7e\u8f7f\u8f80\u8f81\u8f82\u8f83\u8f84\u8f85\u8f86\u8f87' + '\u8f91\u8f92\u8f93\u8f94\u8f95\u8f9e\u8f9f\u8fa7\u8faf\u8fb3\u8fbd\u8fc0\u8fed\u8ffd\u8ffe\u9001\u9002\u9010\u9017\u9019\u901a\u901f\u902a\u902b\u902c\u9035\u9036\u9037\u9038\u9045\u9046\u9047\u9048\u9049\u904a\u904b\u904c\u9056\u9057\u9058\u9059\u905a\u905b\u9062\u9063\u9064\u9065\u9066\u9067\u9068\u9069\u9074\u9075\u9076\u9077\u9078\u9079\u907d\u907e\u907f\u9080\u9082\u9083\u9084\u9085\u9086\u9087\u9088\u9089\u908a\u908b\u9091\u9093\u9094\u9095\u9096\u9099\u909a\u909b\u909c\u909e\u909f\u90a0\u90a4\u90a5\u90aa\u90ab\u90b7\u90b8\u90b9\u90ba\u90bb\u90bc\u90bd\u90be\u90da\u90db\u90dc\u90dd\u90de\u90df\u90e0\u90e1\u90e2\u90e3\u90e4\u90e5\u90e6\u90e7\u90e8\u9106\u9107\u9108\u9109\u910a\u910b\u911f\u9120\u9121\u9122\u9123\u9124\u9125\u9126\u9149\u9127\u914a\u914b' + '\u914c\u914d\u914e\u914f\u9150\u9151\u9152\u9153\u9154\u9155\u9156\u9157\u9158\u916f\u9170\u9171\u9172\u9173\u9174\u9175\u9176\u9177\u9178\u9187\u9188\u9189\u918a\u918b\u918c\u918d\u91a4\u91a5\u91a6\u91a7\u91a8\u91c0\u91c1\u91c2\u91c3\u91c4\u91ce\u91cf\u91d6\u91d7\u91df\u91e6\u91e7\u91ec\u91f2\u91f8\u91ff\u9200\u9201\u9202\u9203\u9206\u9207\u9208\u9209\u9214\u9217\u9219\u921a\u9221\u9223\u9225\u922c\u922d\u922e\u9237\u9246\u9247\u9248\u9249\u924a\u924b\u924c\u924d\u924e\u9269\u926a\u926b\u926c\u927d\u927e\u927f\u9280\u9281\u928b\u928c\u928d\u928e\u92a6\u92a7\u92a8\u92a9\u92ba\u92bb\u92bc\u92bd\u92be\u92c8\u92c9\u92ca\u92cb\u92cc\u92cd\u92d6\u92d7\u92d8\u92d9\u92da\u92db\u92dc\u92e5\u92e6\u92e7\u92e8\u92ef\u92f5\u92f6\u92f7\u92fb\u92fc\u92ff\u9300\u9302\u9303' + '\u930a\u9310\u931c\u9346\u9351\u9356\u9357\u9359\u935b\u935c\u9373\u9374\u938d\u938e\u938f\u9390\u93a4\u93a5\u93bd\u93be\u93bf\u93c0\u93c1\u93c2\u93c3\u93e1\u93e2\u93e3\u93f8\u93f9\u93fa\u93fb\u93fc\u9419\u9428\u9429\u942a\u942b\u9439\u943a\u943b\u943c\u9448\u9449\u944a\u944b\u9456\u9459\u945a\u945e\u9463\u9467\u9472\u9482\u9483\u9484\u9494\u9495\u9496\u94ae\u94af\u94b0\u94b1\u94b2\u94b3\u94b4\u94b5\u94cb\u94cc\u94cd\u94ce\u94cf\u94d0\u94d1\u94e3\u94e4\u94e5\u94e6\u94e7\u94e8\u94fb\u94fc\u94fd\u950b\u950c\u950d\u950e\u950f\u951e\u951f\u9520\u9521\u9522\u9530\u9531\u9532\u9533\u9539\u953c\u954c\u954d\u9551\u9552\u955a\u955b\u9568\u9569\u956a\u956b\u956c\u9574\u9575\u9576\u9577\u9578\u9579\u9586\u9587\u9588\u9589\u958a\u958b\u959a\u959b\u95a9\u95aa\u95ab\u95ac' + '\u95b8\u95b9\u95ba\u95bb\u95bc\u95bd\u95be\u95bf\u95c0\u95ce\u95cf\u95d0\u95d1\u95da\u95e0\u95e1\u95e2\u95e3\u95e4\u95ef\u95f0\u95f1\u95f2\u95f8\u95f9\u95ff\u9609\u961e\u9639\u966a\u966b\u966c\u966d\u96b8\u96b9\u96ba\u96f6\u96f7\u96f8\u96f9\u96fa\u96fb\u96fc\u9743\u9744\u9745\u9746\u9747\u9748\u9749\u974a\u979e\u979f\u97a0\u97a1\u97e3\u97e4\u97e5\u97e6\u97e7\u97e8\u9821\u9822\u9823\u9824\u9825\u9826\u9827\u9828\u9829\u982a\u982b\u9861\u9862\u9863\u9864\u9865\u9866\u9867\u9868\u9869\u986a\u986b\u986c\u98a1\u98a2\u98a3\u98a4\u98a5\u98a6\u98a7\u98a8\u98a9\u98c4\u98c5\u98c6\u98c7\u98c8\u98c9\u98ca\u98cb\u98cc\u98cd\u98e2\u98e3\u98e4\u98e5\u98e6\u98e7\u98e8\u98e9\u98fc\u98fd\u98fe\u98ff\u9900\u9901\u9907\u9908\u9909\u9911\u9923\u994f\u9950\u9951\u9972\u9973\u9974' + '\u999e\u99be\u9a00\u9a17\u9a18\u9a19\u9a25\u9a29\u9a2c\u9a2d\u9a2e\u9a30\u9a3f\u9a40\u9a4e\u9a4f\u9a50\u9a51\u9a5b\u9a5c\u9a5d\u9a68\u9a69\u9a6a\u9a6b\u9a6c\u9a6d\u9a6e\u9a79\u9a7a\u9a7b\u9a7c\u9a8a\u9a8b\u9a8c\u9a8d\u9a8e\u9a8f\u9a90\u9a91\u9a92\u9aa1\u9aa2\u9aa3\u9aa4\u9aa5\u9aa6\u9aa7\u9ab6\u9abb\u9ac1\u9ac2\u9ac3\u9ac5\u9ae1\u9ae6\u9af6\u9b01\u9b02\u9b08\u9b1b\u9b1c\u9b1d\u9b1e\u9b1f\u9b33\u9b34\u9b35\u9b42\u9b43\u9b44\u9b45\u9b46\u9b5a\u9b5b\u9b5c\u9b5d\u9b5e\u9b5f\u9b60\u9b73\u9b74\u9b75\u9b76\u9b77\u9b78\u9b79\u9b90\u9b91\u9b92\u9b9d\u9b9e\u9b9f\u9ba0\u9ba1\u9ba2\u9bab\u9bac\u9bad\u9bae\u9bb3\u9bb4\u9bb5\u9bbd\u9bbe\u9bb6\u9bbf\u9bc7\u9bc8\u9bc9\u9bcc\u9bce\u9bcf\u9bda\u9bdd\u9bde\u9be7\u9be8\u9be9\u9bf1\u9bf2\u9bf3\u9bf4\u9bf8\u9bfa\u9bfb\u9bfe\u9bff' + '\u7a79\u9c01\u9c02\u9c0d\u9c11\u9c12\u9c13\u9c14\u9c16\u9c19\u9c1b\u9c20\u9c29\u9c2a\u9c36\u9c3a\u9c3b\u9c3c\u9c3d\u9c3e\u9c3f\u9c40\u9c41\u9c4b\u9c4c\u9c4d\u9c5b\u9c5c\u9c5d\u9c5e\u9c68\u9c69\u9c6a\u9c6b\u9c6c\u9c6d\u9c6e\u9c74\u9c75\u9c76\u9c77\u9c78\u9c79\u9c82\u9c83\u9c84\u9c85\u9c86\u9c8e\u9c8f\u9c9c\u9c9d\u9c9e\u9ca0\u9ca1\u9ca9\u9cab\u9cb2\u9cb4\u9cb6\u9cc4\u9cc6\u9cc7\u9cc9\u9ccb\u9ccd\u9cd0\u9cd1\u9cd2\u9cd4\u9cd5\u9cd6\u9cd9\u9cda\u9cdb\u9cdc\u9cde\u9cdf\u9ce0\u9ce2\u9cec\u9ced\u9cee\u9cf7\u9cf8\u9cf9\u9cfa\u9cfb\u9cfc\u9d0a\u9d0b\u9d0c\u9d0d\u9d0e\u9d0f\u9d1c\u9d24\u9d25\u9d26\u9d27\u9d28\u9d29\u9d2a\u9d2b\u9d34\u9d35\u9d36\u9d37\u9d38\u9d39\u9d3a\u9d4a\u9d4b\u9d4c\u9d4d\u9d4e\u9d4f\u9d50\u9d58\u9d59\u9d5a\u9d5b\u9d5c\u9d5d\u9d62\u9d63\u9d64\u9d69' + '\u9d6a\u9d6b\u9d6c\u9d6d\u9d6e\u9d73\u9d74\u9d77\u9d78\u9d7c\u9d7d\u9d7e\u9d80\u9d81\u9d82\u9d86\u9d89\u9d8a\u9d8b\u9d8c\u9d91\u9d95\u9d9b\u9d9c\u9d9d\u9da2\u9da3\u9da8\u9daa\u9dab\u9db7\u9db9\u9dbc\u9dbe\u9dbf\u9dc0\u9dc1\u9dc2\u9dc6\u9dc7\u9dc8\u9dcb\u9dce\u9dd0\u9dd1\u9dd4\u9dd7\u9dd8\u9ddc\u9de7\u9de8\u9df4\u9df5\u9df6\u9dfd\u9dfe\u9dff\u9e00\u9e01\u9e02\u9e03\u9e04\u9e05\u9e16\u9e17\u9e18\u9e19\u9e2d\u9e2e\u9e2f\u9e30\u9e31\u9e32\u9e33\u9e34\u9e41\u9e42\u9e43\u9e44\u9e45\u9e46\u9e47\u9e48\u9e49\u9e56\u9e57\u9e58\u9e59\u9e5a\u9e5b\u9e5c\u9e5d\u9e5e\u9e5f\u9e69\u9e6a\u9e6b\u9e6c\u9e6d\u9e6e\u9e6f\u9e70\u9e71\u9e72\u9e78\u9e79\u9e7a\u9e7b\u9e81\u9e82\u9e83\u9e84\u9e85\u9e86\u9e8a\u9e8b\u9e8c\u9e92\u9e93\u9e96\u9ecd\u9ed0\u9ed3\u9ed4\u9ed5\u9ed6\u9edc\u9edd' + '\u9ede\u9edf\u9ee0\u9ee1\u9ee4\u9ee5\u9ee8\u9ee9\u9eea\u9eeb\u9eec\u9eef\u9ef0\u9ef1\u9ef2\u9ef3\u9ef4\u9ef8\u9ef9\u9efa\u9efb\u9efc\u9efd\u9efe\u9f05\u9f06\u9f07\u9f0c\u9f0d\u9f14\u9f16\u9f17\u9f28\u9f29\u9f33\u9f39\u9f3a\u9f3b\u9f46\u9f47\u9f48\u9f49\u9f4a\u9f57\u9f58\u9f59\u9f5a\u9f5b\u9f5c\u9f5d\u9f5e\u9f5f\u9f60\u9f72\u9f73\u9f74\u9f75\u9f76\u9f77\u9f78\u9f84\u9f85\u9f86\u9f87\u9f88\u9f89\u9f8a\u9f9a\u9f9b\u9f9c\u9f9d\u9f9e\u9fac\u9fad\u9fae\u9faf\u9fb0\u9fb1\u9fb2\u9fb3\u9fc1\u9fc2\u9fc3\u9fc4\u9fc5\u9fcc\u9fcd\u9fce\u9fd9\u9fda\u9fdb\u9fdc\u9fdd\u9fe4\u9fe5\u9fe6\u9fe7\u9fec\u9fed\u9fee\u9fef\u9ff0\u9ff4\u9ff5\u9ff6\u9ff9\ua02d\ua031\ua032\ua034\ua035\ua03b\ua042\ua043\ua044\ua04d\ua051\ua059\ua05a\ua06d\ua06e\ua06f\ua070\ua071\ua072\ua073\ua074\ua08e' + '\ua08f\ua090\ua091\ua092\ua093\ua094\ua0a7\ua0a8\ua0a9\ua0aa\ua0ab\ua0ac\ua0ad\ua0ae\ua0bf\ua0c0\ua0c1\ua0c2\ua0c3\ua0d5\ua0d6\ua0d7\ua0d8\ua0d9\ua0da\ua0db\ua0dc\ua0dd\ua0f3\ua0f4\ua0f5\ua0f6\ua0f7\ua0f8\ua0f9\ua10a\ua10b\ua10c\ua10d\ua10e\ua10f\ua110\ua121\ua122\ua123\ua124\ua125\ua126\ua127\ua128\ua137\ua138\ua139\ua13a\ua13b\ua143\ua144\ua145\ua149\ua14a\ua14b\ua14c\ua151\ua157\ua15a\ua15c\ua15e\ua17d\ua184\ua195\ua19f\ua1a1\ua1aa\ua1ab\ua1b2\ua1b3\ua1b4\ua1b5\ua1b6\ua1bc\ua1bd\ua1be\ua1bf\ua1c0\ua1c1\ua1c4\ua1c5\ua1c6\ua1c7\ua1c8\ua1c9\ua1cd\ua1ce\ua1d3\ua1d4\ua1d5\ua1d6\ua1de\ua1e2\ua1e4\ua1e9\ua1eb\ua1ed\ua1f1\ua1f2\ua1f4\ua1f7\ua1f9\ua1fb\ua1fe\ua1ff\ua20a\ua20b\ua20c\ua20d\ua20e\ua20f\ua21a\ua21b\ua224\ua225\ua22d\ua22e\ua22f\ua230\ua236\ua237\ua238' + '\ua239\ua23a\ua23b\ua23c\ua244\ua245\ua246\ua247\ua24c\ua24d\ua24e\ua24f\ua256\ua257\ua25c\ua262\ua263\ua264\ua265\ua267\ua268\ua269\ua26b\ua272\ua273\ua27c\ua27d\ua27e\ua280\ua289\ua28a\ua292\ua297\ua298\ua29a\ua29b\ua2a4\ua2a5\ua2a6\ua2a7\ua2a8\ua2a9\ua2ab\ua2b2\ua2b3\ua2b4\ua2b5\ua2b9\ua2ba\ua2bb\ua2bd\ua2c2\ua2c7\ua2c8\ua2c9\ua2e1\ua2e2\ua2e3\ua2e4\ua2e5\ua2e6\ua2e7\ua2e8\ua309\ua30a\ua30b\ua30c\ua30d\ua30e\ua30f\ua310\ua311\ua312\ua313\ua330\ua331\ua332\ua333\ua334\ua354\ua355\ua356\ua357\ua358\ua359\ua35a\ua35b\ua35c\ua35d\ua381\ua382\ua383\ua384\ua385\ua386\ua387\ua388\ua389\ua38a\ua38b\ua38c\ua38d\ua38e\ua38f\ua390\ua391\ua392\ua3b8\ua3b9\ua3ba\ua3bb\ua3bc\ua3bd\ua3be\ua3bf\ua3c0\ua3c1\ua3d7\ua3d8\ua3d9\ua3da\ua3db\ua3dc\ua3dd\ua3de\ua3df\ua3fa\ua3fb' + '\ua3fc\ua3fd\ua3fe\ua3ff\ua400\ua401\ua402\ua403\ua404\ua418\ua419\ua41a\ua41b\ua41c\ua41d\ua41e\ua42e\ua42f\ua430\ua431\ua432\ua433\ua43a\ua43b\ua43c\ua443\ua446\ua447\ua44c\ua456\ua465\ua466\ua4a4\ua4a5\ua4ae\ua4af\ua4b0\ua4d1\ua4d8\ua4d9\ua4da\ua4db\ua4dc\ua4dd\ua4f5\ua4f6\ua4f7\ua4f8\ua4f9\ua4fa\ua4fb\ua4fc\ua4fd\ua4fe\ua4ff\ua500\ua501\ua521\ua522\ua523\ua524\ua525\ua526\ua527\ua528\ua529\ua52a\ua52b\ua52c\ua52d\ua52e\ua52f\ua530\ua531\ua532\ua550\ua551\ua552\ua553\ua554\ua555\ua556\ua557\ua558\ua559\ua575\ua576\ua577\ua578\ua579\ua57a\ua57b\ua57c\ua5a8\ua5a9\ua5aa\ua5ab\ua5ac\ua5ad\ua5ae\ua5af\ua5b0\ua5cc\ua5cd\ua5ce\ua5cf\ua5d0\ua5d1\ua5d2\ua5d3\ua5d4\ua5d5\ua5d6\ua5fa\ua5fb\ua5fc\ua5fd\ua5fe\ua5ff\ua611\ua612\ua613\ua614\ua615\ua616\ua617\ua633\ua634' + '\ua635\ua636\ua637\ua638\ua639\ua63a\ua63b\ua64b\ua64c\ua64d\ua64e\ua64f\ua658\ua659\ua65c\ua660\ua668\ua669\ua66a\ua676\ua68d\ua68e\ua6a5\ua6ad\ua6b7\ua6c4\ua6cb\ua6cd\ua6d2\ua6d3\ua6d6\ua6dc\ua6df\ua6e0\ua6e1\ua6e6\ua6e7\ua6e8\ua6f1\ua6f9\ua700\ua702\ua705\ua706\ua70d\ua70e\ua70f\ua714\ua715\ua719\ua71a\ua71b\ua71c\ua71f\ua722\ua723\ua724\ua727\ua728\ua729\ua72a\ua72b\ua72d\ua72e\ua72f\ua731\ua732\ua734\ua735\ua733\ua736\ua740\ua744\ua745\ua74b\ua751\ua752\ua753\ua754\ua755\ua756\ua75a\ua75b\ua75c\ua75e\ua75f\ua760\ua761\ua762\ua763\ua765\ua766\ua767\ua76a\ua76b\ua76e\ua76f\ua775\ua77b\ua77c\ua780\ua781\ua782\ua783\ua786\ua787\ua78f\ua790\ua791\ua797\ua798\ua799\ua79f\ua7a0\ua7a2\ua7a3\ua7a4\ua7a6\ua7b2\ua7b5\ua7b7\ua7ba\ua7c7\ua7c8\ua7c9\ua7ce\ua7cf\ua7d0' + '\ua7d2\ua7d7\ua7de\ua7e2\ua7ed\ua7ef\ua7f4\ua7f9\ua7fe\ua7ff\ua806\ua807\ua80a\ua80b\ua80c\ua80d\ua815\ua816\ua81a\ua81b\ua826\ua82a\ua82b\ua837\ua838\ua839\ua840\ua841\ua845\ua846\ua84c\ua84d\ua854\ua855\ua856\ua85b\ua85c\ua85d\ua85e\ua85f\ua862\ua863\ua864\ua866\ua87d\ua882\ua883\ua887\ua888\ua88a\ua88b\ua890\ua893\ua896\u3cfe\u4441\u445e\u4eef\u5d2a\u5d2b\u5d42\u5d44\u624c\u9f34\u0f63\u0f64\u0f65\u0f66\u0f67\u0f68\u0f69\u0f6a\u0f6b\u0f6c\u0f6d\u0f6e\u0f6f\u0f70\u0f71\u0f72\u0f73\u0f74\u0f75\u0f76\u0f77\u0f78\u0f79\u0f7a\u0f7b\u0f7c\u0f7d\u0f7e\u0f7f\u0f80\u0f81\u0f82\u0f83\u0f84\u0f85\u0f86\u0f87\u0f88\u0f89\u0f8a\u0f8b\u0f8c\u0f8d\u0f8e\u0f8f\u0f90\u0f91\u0f92\u0f93\u0f94\u0f95\u0f96\u0f97\u0f98\u0f99\u0f9a\u0f9b\u0f9c\u0f9d\u0f9e\u0f9f\u0fa0\u0fa1\u0fa2' + '\u3cce\u3ccf\u3cd0\u3cd1\u3cd2\u3cd3\u3cd4\u3cd5\u3cd6\u3cd7\u3cd8\u3cd9\u3cda\u3cdd\u3cde\u3cdf\u3ce0\u3ce1\u3ce2\u3ce3\u3ce5\u3ce6\u3ce7\u3ce4\u3ce8\u3ce9\u3cea\u3ceb\u3cec\u3ced\u3cef\u3cf0\u3cf1\u3cf2\u3cf3\u3cf6\u3cf7\u3cf8\u3cfb\u3cfc\u3cff\u3d00\u3d01\u3d02\u6b51\u3d05\u3d06\u3d07\u3d08\u3d09\u3d0a\u3d0b\u3d0c\u3d0d\u3d0e\u3d0f\u3d10\u3d12\u3d13\u3d14\u3d15\u3cf9\u3d16\u3d17\u3d18\u3d19\u3d1a\u3d1b\u3d1c\u3d1e\u3d1f\u3d20\u3d21\u3d11\u3d22\u3d23\u3d24\u3d26\u3d27\u3d28\u3d29\u3d2a\u3d2b\u3d2c\u3d2d\u3d2f\u3d30\u3d31\u3d32\u3d33\u3d34\u3d35\u3d36\u3d37\u3d39\u3d3a\u3d3b\u51c4\u4ef6\u3d3f\u3d40\u3d41\u3d42\u3d45\u3d4a\u3d4b\u3d4c\u3d4d\u3d4e\u3d4f\u3d50\u3d51\u3d52\u3d59\u3d5a\u3d5e\u3d5f\u3d60\u3d61\u3d62\u3d63\u3d67\u3d68\u3d69\u3d6a\u3d70\u3d71\u3d72' + '\u3d73\u3d77\u3d79\u3d7a\u3d7b\u3d7e\u3d7f\u3d80\u3d81\u3d83\u3d84\u3d85\u3d87\u3d88\u3d89\u3d8a\u3cdb\u3d8b\u3d8c\u3d8d\u3d8e\u3d8f\u3d90\u3d91\u3d92\u3d93\u3d94\u3d95\u3d96\u3d97\u3d98\u3d99\u3d9b\u3d9c\u3d9d\u3d9e\u3d9f\u3da0\u3da1\u3da2\u3da5\u3da6\u3da7\u3da9\u3daa\u3dac\u3dad\u3dae\u3daf\u3db0\u3db1\u3db2\u3db3\u3db4\u3db5\u3db6\u3db8\u3dba\u3dbb\u3dbc\u3dbd\u3dbe\u3dbf\u3dc0\u3dc1\u3dc2\u3dc3\u3dc4\u3dc5\u3dc6\u3dc7\u3dc8\u3dc9\u3dca\u3dcb\u3dcc\u3dcd\u3dce\u3dcf\u3dd0\u3dd1\u3dd2\u3dd3\u3dd4\u3dd5\u3dd6\u3dd7\u3dd8\u3dd9\u3dda\u3ddb\u3ddc\u3ddd\u3dde\u3ddf\u3de0\u3de1\u3de2\u3de3\u3de4\u3de5\u3de6\u3de7\u3de8\u3de9\u3dea\u3deb\u3dec\u3ded\u3dee\u3df7\u3df8\u3df9\u3dfa\u3dfb\u3dfc\u3dfd\u3dfe\u3dff\u3e00\u3e01\u3e02\u3e03\u3e04\u3e05\u3e06\u3e07\u3e08' + '\u3e09\u3e0a\u3e0b\u3e0c\u3e0d\u3e0e\u3e0f\u3e10\u3e11\u3e12\u3e13\u3e14\u3e15\u3e16\u3e17\u3e18\u3e19\u3e1a\u3e1b\u3e1c\u3e1d\u3e1e\u3e1f\u3e20\u3e21\u3e22\u3e23\u3e24\u3e25\u3e26\u3e27\u3e28\u3e29\u3e2a\u3e2b\u3e2c\u3e2d\u3e2e\u3e2f\u3e30\u3e31\u3e32\u3e33\u3e34\u3e35\u3e40\u3e41\u3e42\u3e43\u3e44\u3e45\u3e46\u3e47\u3e48\u3e49\u3e4a\u3e4b\u3e4c\u3e4d\u3e4e\u3e4f\u3e50\u3e51\u3e52\u3e53\u3e54\u3e55\u3e56\u3e57\u3e58\u3e59\u3e5a\u3e5b\u3e5c\u3e5d\u3e5e\u3e5f\u3e60\u3e61\u3e62\u3e63\u3e64\u3e65\u3e66\u3e67\u3e68\u3e69\u3e6a\u3e6b\u3e6c\u3e6d\u3e6e\u3e6f\u3e70\u3e71\u3e72\u3e73\u3e74\u3e75\u3e76\u3e36\u3e77\u3e78\u3e79\u3e7a\u3e83\u3e84\u3e85\u3e86\u3e87\u3e88\u3e89\u3e8a\u3e8b\u3e8c\u3e8d\u3e8e\u3e8f\u3e90\u3e91\u3e92\u3e93\u3e94\u3e95\u3e96\u3e97\u3e98\u3e99' + '\u3e9a\u3e9b\u3e9c\u3e9d\u3e9e\u3e9f\u3ea0\u3ea1\u3ea2\u3ea3\u3ea4\u3ea5\u3ea6\u3ea7\u3ea8\u3ea9\u3eaa\u3eab\u3eac\u3ead\u3eae\u3eaf\u3eb0\u3eb1\u3eb2\u3eb3\u3eb4\u3eb5\u3eb6\u3eb7\u3eb8\u3eb9\u3eba\u3ebb\u3ebc\u3ebd\u3ebe\u3ebf\u3ec0\u3ec1\u3ec2\u3ec3\u3ec4\u3ec5\u3ec6\u3ec7\u3ed7\u3ed8\u3ed9\u3eda\u3edb\u3edc\u3edd\u3ede\u3edf\u3ee0\u3ee1\u3ee2\u3ee3\u3ee4\u3ee5\u3ee6\u3ee7\u3ee8\u3ee9\u3eea\u3eeb\u3eec\u3eed\u3eee\u3eef\u3ef0\u3ef1\u3ef2\u3ef3\u3ef4\u3ef5\u3ef6\u3ef7\u3ef8\u3ef9\u3efa\u3efb\u3efc\u3efd\u3efe\u3eff\u3f00\u3f01\u3f02\u3f03\u3f04\u3f05\u3f06\u3f07\u3f08\u3f09\u3f0a\u3f0b\u3f0c\u3f0d\u3f0e\u3f0f\u3f10\u3f11\u3f12\u3f13\u3f14\u3f15\u3f16\u3f23\u3f24\u3f25\u3f26\u3f27\u3f28\u3f29\u3f2a\u3f2b\u3f2c\u3f2d\u3f2e\u3f2f\u3f30\u3f31\u3f32\u3f33\u3f34' + '\u3f35\u3f36\u3f37\u3f38\u3f39\u3f3a\u3f3b\u3f3c\u3f3d\u3f3e\u3f3f\u3f40\u3f41\u3f42\u3f43\u3f44\u3f45\u3f46\u3f47\u3f48\u3f49\u3f4a\u3f4b\u3f4c\u3f4d\u3f4e\u3f4f\u3f50\u3f51\u3f52\u3f53\u3f54\u3f55\u3f56\u3f57\u3f58\u3f59\u3f5a\u3f5b\u3f5c\u3f5d\u3f5e\u3f5f\u3f60\u3f61\u3f62\u3f63\u3f64\u3f65\u3f66\u3f67\u3f68\u3f69\u3f6a\u3f6b\u3f6c\u3f6d\u3f6e\u3f6f\u3f70\u3f71\u3f72\u3f73\u3f74\u3f7f\u3f80\u3f81\u3f82\u3f83\u3f84\u3f85\u3f86\u3f87\u3f88\u3f89\u3f8a\u3f8b\u3f8c\u3f8d\u3f8e\u3f8f\u3f90\u3f91\u3f92\u3f93\u3f94\u3f95\u3f96\u3f97\u3f98\u3f99\u3f9a\u3f9b\u3f9c\u3f9d\u3f9e\u3f9f\u3fa0\u3fa1\u3fa2\u3fa3\u3fa4\u3fa5\u3fa6\u3fa7\u3fa8\u3fa9\u3faa\u3fab\u3fac\u3fad\u3fae\u3faf\u3fb0\u3fb1\u3fb2\u3fb3\u3fb4\u3fb5\u3fb6\u3fb7\u3fb8\u3fb9\u3fba\u3fbb\u3fbc\u3fbd\u3fbe' + '\u3fc5\u3fc6\u3fc7\u3fc8\u3fc9\u3fca\u3fcb\u3fcc\u3fcd\u3fce\u3fcf\u3fd0\u3fd1\u3fd2\u3fd3\u3fd4\u3fd5\u3fd6\u3fd7\u3fd8\u3fd9\u3fda\u3fdb\u3fdc\u3fdd\u3fde\u3fdf\u3fe0\u3fe1\u3fe2\u3fe3\u3fe4\u3fe5\u3fe6\u3fe7\u3fe8\u3fe9\u3fea\u3feb\u3fec\u3fed\u3fee\u3ff8\u3ff9\u3ffa\u3ffb\u3ffc\u3ffd\u3ffe\u3fff\u4000\u4001\u4002\u4003\u4004\u4005\u4006\u4007\u4008\u4009\u400a\u400b\u400c\u400d\u400e\u400f\u4010\u4011\u4012\u4013\u4014\u4015\u4016\u4017\u4018\u4019\u401a\u401b\u4024\u4025\u4026\u4027\u4028\u4029\u402a\u402b\u402c\u402d\u402e\u402f\u4030\u4031\u4032\u4033\u4034\u4035\u4036\u4037\u4038\u4039\u403a\u403b\u403c\u403d\u403e\u403f\u4040\u4041\u4042\u4043\u4044\u4045\u4046\u4047\u405a\u4048\u4049\u405b\u405c\u404a\u405d\u405e\u405f\u4060\u4061\u4062\u4063\u4064' + '\u4065\u4066\u4067\u4068\u4069\u406a\u406b\u406c\u406d\u406e\u406f\u4070\u4071\u4072\u4073\u4074\u407d\u407e\u407f\u4080\u4081\u4082\u4083\u4084\u4085\u4086\u4087\u4088\u4089\u408a\u408b\u4092\u4093\u4094\u4095\u4096\u4097\u4098\u4099\u409a\u409b\u409c\u409d\u408c\u409e\u40a1\u40a2\u40a3\u40a4\u40a5\u40a6\u40a9\u40aa\u40ab\u40af\u40b3\u40b4\u40b5\u40b6\u40b9\u40ba\u40bb\u40bd\u40bf\u40c0\u40c1\u40c2\u40c3\u40c4\u40c5\u40c6\u40c7\u40c8\u40c9\u40ca\u40cc\u40cd\u40ce\u40cf\u40d0\u40d1\u40d2\u40d3\u40d4\u40d5\u40d6\u40d7\u40d9\u40da\u40db\u40dc\u40dd\u40df\u40e0\u40e1\u40e3\u40e4\u40e5\u40e6\u40e7\u40e9\u40ea\u40eb\u40ec\u40ef\u40f4\u40f5\u40f6\u40f7\u40f8\u40f9\u40fa\u40fb\u40fc\u40fd\u40fe\u40ff\u4101\u4105\u4106\u4107\u4108\u410b\u4109\u410c\u410d\u410e\u410f' + '\u4110\u4111\u4113\u4114\u4115\u4116\u4117\u4118\u4119\u411a\u411b\u411c\u411d\u411e\u411f\u4120\u4121\u4123\u4124\u4125\u4126\u4127\u412e\u412f\u4130\u4133\u4134\u4135\u4136\u4137\u4138\u4139\u413a\u413c\u413d\u413e\u413f\u4140\u4141\u4142\u4143\u4145\u4147\u4148\u414a\u414b\u414c\u414d\u414e\u414f\u4150\u4151\u4152\u4155\u4156\u4157\u4158\u4159\u415a\u415b\u415e\u415f\u4160\u4161\u4162\u4168\u4169\u416a\u416d\u416e\u416f\u4170\u4171\u4172\u4173\u4174\u4175\u4176\u4177\u417b\u417c\u417d\u417f\u4180\u4181\u4182\u4183\u4186\u4188\u418a\u418b\u418c\u418d\u418e\u418f\u4190\u4192\u4193\u4194\u4195\u4196\u4197\u4198\u4199\u419a\u419b\u419c\u419d\u419e\u419f\u41a0\u41a1\u41a2\u41a4\u41a5\u41a6\u41a7\u41a8\u41a9\u41aa\u41ab\u41ac\u41ad\u41ae\u41af\u41b1\u41b2\u41b3' + '\u41b4\u41b5\u41b6\u41b7\u41b8\u41b9\u41ba\u41bb\u41bc\u41bd\u41be\u41bf\u41c0\u41c1\u41c5\u41c6\u41c7\u41c8\u41c9\u41ca\u41cb\u41cc\u41cd\u41ce\u41cf\u41d0\u41d1\u41d2\u41d5\u41d6\u41d7\u41d8\u41d9\u41da\u41db\u41dc\u41dd\u41de\u41df\u41e0\u41e1\u41e2\u41e3\u41e4\u41e5\u41e6\u41e9\u41ea\u41eb\u41ec\u41ed\u41ee\u41ef\u41f0\u41f1\u41f2\u41f3\u41f4\u41f5\u41f6\u41f7\u41f8\u41f9\u41fa\u41fb\u41fc\u41fd\u4204\u4205\u4206\u4207\u4208\u4209\u420a\u420b\u420c\u420d\u420e\u420f\u4210\u4211\u4212\u4218\u4219\u421a\u421b\u421c\u421d\u421e\u421f\u4220\u4221\u4222\u4223\u4224\u4225\u4226\u4227\u4228\u4229\u422a\u422b\u422c\u422d\u4233\u4243\u4234\u4235\u4236\u4237\u4238\u4239\u423a\u423b\u4244\u4245\u4246\u4247\u423c\u424d\u424e\u424f\u4250\u4251\u4252\u4253\u4254\u4255' + '\u4258\u4259\u425a\u425b\u425c\u4269\u426a\u426b\u426c\u426d\u426e\u426f\u4270\u4271\u4272\u4273\u4275\u4276\u4277\u4278\u4279\u427d\u4281\u4284\u4285\u4286\u4287\u4288\u4289\u428a\u428b\u428c\u428d\u428e\u428f\u4292\u4293\u4294\u4295\u4296\u4297\u429b\u429c\u429d\u429e\u429f\u42a0\u42a1\u42a2\u42a3\u42a4\u42a5\u42a6\u42a9\u42aa\u42ab\u42ac\u42ad\u42ae\u42af\u42b0\u42b1\u42b2\u42b3\u42b7\u42b8\u42b9\u42ba\u42bb\u42bc\u42bd\u42be\u42bf\u42c0\u42c1\u42c2\u42c4\u42c5\u42c6\u42c7\u42c8\u42c9\u42cd\u42ce\u42cf\u42d0\u42d1\u5c2d\u42d2\u42d3\u42d4\u42d6\u42d7\u42d8\u42d9\u42db\u42dc\u42dd\u42de\u42df\u42e0\u42e1\u42e2\u42e3\u42e4\u42e5\u42e6\u42e7\u42e8\u42e9\u42eb\u42ec\u42ed\u42ee\u42ef\u42f0\u42f1\u42f2\u42f3\u42f9\u42fa\u42fb\u42fc\u42fd\u42fe\u42ff\u4300\u4301' + '\u4302\u4303\u4304\u4305\u4306\u4307\u4308\u4309\u430a\u430b\u430c\u430d\u430e\u430f\u4310\u4311\u4312\u4314\u4315\u4317\u4319\u431a\u431b\u431d\u431f\u4320\u4322\u4323\u4324\u4325\u4326\u4327\u4328\u4329\u432a\u432b\u432c\u432d\u4330\u4331\u4332\u4333\u4334\u4335\u4337\u4338\u4339\u433b\u433f\u4340\u4341\u4343\u4344\u4345\u4346\u4347\u4349\u434a\u434b\u434c\u434e\u434f\u4350\u4351\u4352\u4354\u4355\u4356\u3cdc\u4357\u4358\u4359\u435a\u435c\u435d\u435f\u435e\u4360\u4361\u4362\u4363\u4366\u4367\u4368\u4369\u436a\u436b\u436d\u436e\u436f\u4370\u4372\u4373\u4374\u4375\u4376\u4377\u4378\u4379\u437a\u437b\u437c\u437d\u437e\u4380\u4381\u4382\u4383\u4386\u4387\u4388\u4389\u438a\u438b\u438c\u438d\u438e\u438f\u4391\u4392\u4393\u4394\u4395\u4397\u4398\u4399\u439a\u439b' + '\u439c\u439d\u439e\u439f\u43a0\u43a1\u43a2\u43a3\u43a4\u43a5\u43a6\u43a7\u43a8\u43a9\u43ad\u43ae\u43af\u43b0\u43b4\u43b5\u43b6\u43b7\u43ba\u43bb\u43bc\u43bd\u43be\u43bf\u43c1\u43c2\u43c3\u43c4\u43c9\u43ca\u43cb\u43cc\u43ce\u43cf\u43d0\u43d1\u43d2\u43cd\u43d4\u43d5\u43d7\u43d8\u43d9\u43da\u43db\u43de\u43df\u43e1\u43e3\u43e5\u43e6\u43e7\u43e8\u43e9\u43eb\u43ec\u43ed\u43ee\u43ef\u43f0\u43f1\u43f2\u43f3\u43f5\u43f6\u43f9\u43fa\u43fb\u43fd\u43fe\u43ff\u4400\u4401\u4402\u4403\u4406\u4407\u4408\u4409\u440b\u440d\u440e\u440f\u4410\u4411\u4413\u4414\u4415\u4416\u4417\u4419\u441a\u441c\u441f\u4420\u4422\u4423\u4424\u4425\u4426\u4427\u4428\u4429\u442a\u442b\u442c\u442d\u442e\u442f\u4430\u4431\u4432\u4433\u4434\u4435\u4436\u4437\u4438\u4439\u443a\u443b\u443c\u443d\u4442' + '\u4443\u4444\u4445\u4446\u4447\u4448\u4449\u444a\u444b\u444c\u444d\u444e\u444f\u4450\u4451\u4452\u4453\u4454\u4455\u4456\u4457\u4458\u4459\u445a\u445f\u4460\u4461\u4462\u4463\u4464\u4465\u4466\u4467\u4468\u4469\u446a\u446b\u446c\u446d\u446e\u446f\u4470\u4471\u4472\u4473\u4474\u4475\u4476\u4477\u4478\u4479\u447a\u447b\u447c\u447d\u447e\u447f\u4480\u4481\u4482\u4483\u4484\u4485\u4486\u4487\u4488\u4489\u448a\u448b\u448c\u448d\u448e\u448f\u4490\u4491\u4492\u4493\u4494\u4495\u4496\u4497\u4498\u4499\u449a\u449b\u449c\u449d\u449e\u449f\u44a0\u44a1\u44a2\u44a3\u44b2\u44b3\u44b4\u44b5\u44b6\u44b7\u44b8\u44b9\u44ba\u44bb\u44bc\u44bd\u44be\u44bf\u44c0\u44c1\u44c2\u44c3\u44c4\u44c5\u44c6\u44c7\u44c8\u44c9\u44ca\u44cb\u44cc\u44cd\u44ce\u44cf\u44d0\u44d1\u44d2\u44d3\u44d4' + '\u44d5\u44d6\u44d7\u44d8\u44d9\u44da\u44db\u44dc\u44dd\u44de\u44df\u44e0\u44e1\u44e2\u44e3\u44e4\u44e5\u44e6\u44e7\u44e8\u44e9\u44ea\u44eb\u44ec\u44ed\u44ee\u44ef\u44f0\u44f1\u44f2\u44fc\u44fd\u44fe\u44ff\u4500\u4501\u4502\u4503\u4504\u4505\u4506\u4507\u4508\u4509\u450a\u450b\u450c\u450d\u450e\u450f\u4510\u4511\u4512\u4513\u4514\u4515\u4516\u4517\u4518\u4519\u451a\u451b\u451c\u451d\u451e\u451f\u4520\u4521\u4522\u4523\u4524\u4525\u4526\u4527\u4528\u4529\u452a\u452b\u452c\u452d\u452e\u452f\u4530\u4531\u4532\u4533\u4534\u4535\u4536\u4537\u4538\u4539\u453a\u453b\u453c\u453d\u454d\u454e\u454f\u4550\u4551\u4552\u4553\u4554\u4555\u4556\u4557\u4558\u4559\u455a\u455b\u455c\u455d\u455e\u455f\u4560\u4561\u4562\u4563\u4564\u4565\u4566\u4567\u4568\u4569\u456a\u456b\u456c' + '\u456d\u456e\u456f\u4570\u4571\u4572\u4573\u4574\u4575\u4576\u4577\u4578\u4579\u457a\u457b\u457c\u457d\u457e\u457f\u4580\u4581\u4582\u4583\u4584\u4585\u4586\u4587\u4588\u4589\u458a\u458b\u458c\u458d\u458e\u458f\u4590\u4591\u4592\u4593\u4594\u45a5\u45a6\u45a7\u45a8\u45a9\u45aa\u45ab\u45ac\u45ad\u45ae\u45af\u45b0\u45b1\u45b2\u45b3\u45b4\u45b5\u45b6\u45b7\u45b8\u45b9\u45ba\u45bb\u45bc\u45bd\u45be\u45bf\u45c0\u45c1\u45c2\u45c3\u45c4\u45c5\u45c6\u45c7\u45c8\u45c9\u45ca\u45cb\u45cc\u45cd\u45ce\u45cf\u45d0\u45d1\u45d2\u45d3\u45d4\u45d5\u460b\u45d6\u45d7\u45d8\u45d9\u45da\u5abc\u45db\u45dc\u45dd\u45de\u45df\u45e0\u45e1\u45e2\u45e3\u45e4\u45e5\u460c\u45e6\u45e7\u45e8\u45e9\u45ea\u45eb\u45ec\u45ed\u45ee\u45ef\u45f0\u45f1\u45f2\u45f3\u460d\u460e\u460f\u4610\u4611\u4612' + '\u4613\u4614\u4615\u4616\u4617\u4618\u4619\u461a\u461b\u461c\u461d\u461e\u461f\u466e\u4620\u4621\u4622\u4623\u4624\u4625\u4626\u4627\u4628\u4629\u462a\u462b\u462c\u462d\u462e\u462f\u4630\u4631\u4632\u4633\u4634\u4635\u4636\u4637\u4638\u4639\u463a\u463b\u463c\u463d\u463e\u463f\u4640\u4641\u4642\u4643\u4644\u4645\u4646\u4647\u4648\u4649\u464a\u464b\u464c\u464d\u464e\u464f\u4650\u466f\u4670\u4671\u4672\u4673\u4674\u4675\u4676\u4677\u4678\u4679\u467a\u467b\u467c\u467d\u467e\u467f\u4680\u4681\u4682\u4683\u4684\u4685\u4686\u4687\u4688\u4689\u468a\u468b\u468c\u468d\u468e\u468f\u4690\u4691\u4692\u4693\u4694\u4695\u4696\u4697\u4698\u4699\u469a\u469b\u469c\u469d\u469e\u469f\u46a0\u46a1\u46a2\u46a3\u46a4\u46a5\u46b6\u46b7\u46b8\u46b9\u46ba\u46bb\u46bc\u46bd\u46be\u46bf' + '\u46c0\u46c1\u46c2\u46c3\u46c4\u46c5\u46c6\u46c7\u46c8\u46c9\u46ca\u46cb\u46cc\u46cd\u46ce\u46cf\u46d0\u46d1\u46d2\u46d3\u46d4\u46d5\u46d6\u46d7\u46d8\u46d9\u46da\u46db\u46dc\u46dd\u46de\u46f7\u46f8\u46df\u46e0\u46e1\u46e2\u46e3\u46e4\u46e5\u46f9\u46fa\u46fb\u46fc\u46fd\u46fe\u46ff\u4700\u4701\u4702\u4703\u4704\u4705\u4706\u4707\u4708\u4709\u470a\u470b\u470c\u470d\u470e\u470f\u4710\u4711\u4712\u4713\u4714\u4715\u4651\u4716\u4717\u4718\u4719\u471a\u471b\u471c\u471d\u471e\u471f\u4720\u46e6\u4721\u46e7\u4722\u6b40\u4723\u4724\u4725\u4726\u4727\u4728\u4729\u472a\u4736\u4737\u4738\u4739\u473a\u473b\u473c\u473d\u473e\u473f\u4740\u4741\u4742\u4743\u4744\u4745\u4746\u4747\u4748\u4749\u474a\u474b\u472b\u474c\u474d\u474e\u474f\u4750\u4751\u4752\u4753\u475e\u475f\u4760' + '\u4761\u4762\u4763\u4764\u4765\u4766\u4767\u4768\u4769\u476a\u476b\u476c\u476d\u476e\u476f\u4770\u4771\u4772\u4773\u4774\u477a\u477b\u477c\u477d\u477e\u477f\u4780\u4781\u4782\u4783\u4784\u4785\u4786\u4787\u4788\u4789\u478a\u4792\u4793\u4794\u4795\u4796\u4797\u4798\u4799\u479a\u479b\u479c\u479d\u47a1\u47a2\u47a3\u47a4\u47a5\u47a6\u47a7\u47a8\u47a9\u4775\u47ac\u47ad\u47ae\u47af\u47b0\u47b1\u47b2\u47b3\u47b4\u47b5\u47ba\u47bb\u47bc\u47bd\u47be\u47bf\u47c0\u47c3\u47b6\u47c1\u47c4\u47c5\u47c8\u47c9\u47ca\u47cb\u47cc\u47cf\u47d0\u47d1\u47d2\u47d3\u47d4\u47d5\u47d8\u47d9\u47da\u47db\u47dc\u47dd\u47de\u47e0\u47e1\u47e2\u47e3\u47e4\u47e5\u47e6\u47e7\u47e8\u47e9\u47ea\u47eb\u47ec\u47ed\u47ee\u47ef\u47f0\u47f1\u47f2\u47f3\u47f4\u47f5\u47f6\u47f7\u47f8\u47f9\u47fa\u47fd' + '\u47fe\u4800\u4801\u4802\u4803\u4804\u4805\u4807\u4808\u4809\u480a\u480b\u480d\u480e\u480f\u480c\u4810\u4811\u4812\u4813\u4814\u4815\u4816\u4817\u4818\u4819\u481b\u481c\u481d\u481f\u4820\u4821\u4822\u4823\u4825\u4826\u4827\u4828\u4829\u482a\u482c\u482d\u482e\u482f\u4830\u4831\u4832\u4833\u4834\u4835\u4836\u4837\u4838\u4839\u483a\u483b\u483c\u483d\u483e\u483f\u4840\u4841\u4842\u4843\u4844\u4845\u4846\u4847\u4848\u4849\u484a\u484b\u484c\u484d\u484e\u484f\u4850\u4851\u4852\u4853\u4854\u4855\u4856\u4857\u4858\u4859\u485a\u485b\u485c\u485d\u485e\u485f\u4860\u4861\u4862\u4863\u4864\u486f\u4870\u4871\u4872\u4873\u4874\u4875\u4876\u4877\u4878\u4879\u487a\u487b\u487c\u487d\u487e\u487f\u4880\u4881\u4882\u4883\u4884\u4885\u4886\u4887\u4888\u4889\u488a\u488b\u488c\u488d' + '\u488e\u488f\u4890\u4891\u4892\u4893\u4894\u4895\u4896\u4897\u4898\u489e\u489f\u48a0\u48a1\u48a2\u48a3\u48a4\u48a5\u48a6\u48a7\u48a8\u48a9\u48aa\u48ab\u48ac\u48ad\u48ae\u48af\u48b0\u48b1\u48b2\u48b3\u48b4\u48b5\u48b6\u48b7\u48b8\u48b9\u48ba\u48bb\u48bc\u48bd\u48be\u48bf\u48c0\u48c1\u48c2\u48c3\u48c4\u48c5\u48c6\u48c7\u48c8\u48d4\u48d5\u48d6\u48d7\u48d8\u48d9\u48da\u48db\u48dc\u48dd\u48de\u48df\u48e0\u48e1\u48e2\u48e3\u48e4\u48e5\u48e6\u48e7\u48e8\u48e9\u48ea\u48eb\u48c9\u48ec\u48ed\u48ee\u48ef\u48f0\u48f1\u48f2\u48f3\u48f4\u48f5\u48f6\u48f7\u48f8\u4902\u4903\u4904\u4905\u4906\u4907\u4908\u4909\u490a\u490b\u490c\u490d\u490e\u490f\u4942\u4910\u4911\u4912\u4913\u4914\u4915\u4916\u4917\u4918\u4919\u491a\u491b\u491c\u491d\u491e\u491f\u4920\u4921\u4922\u4923\u4924' + '\u4925\u4926\u4927\u4928\u4929\u492a\u492b\u492c\u492d\u492e\u492f\u4930\u4931\u4932\u4933\u4934\u4935\u4936\u4937\u4938\u4939\u493a\u4943\u4944\u4945\u4946\u4947\u4948\u4949\u494a\u494b\u494c\u494d\u494e\u494f\u4950\u4951\u4952\u4953\u4954\u4955\u4956\u4957\u4958\u4959\u495a\u495b\u495c\u495d\u495e\u495f\u4960\u4961\u4962\u4963\u4964\u4965\u4966\u4967\u4968\u4969\u497f\u496a\u496b\u496c\u496d\u496e\u4980\u496f\u4970\u4971\u4972\u4973\u4981\u4982\u4983\u4984\u4985\u4986\u4987\u4988\u4989\u498a\u498b\u498c\u498d\u498e\u498f\u4990\u4991\u4992\u4993\u4994\u4995\u4996\u4997\u4998\u4999\u499a\u499b\u499c\u499d\u499e\u499f\u49a0\u49a1\u49a2\u49a3\u49a4\u49a5\u49a6\u49a7\u49a8\u49a9\u49b1\u49b2\u49b3\u49b4\u49b5\u49b6\u49b7\u49b8\u49b9\u49ba\u49bb\u49bc\u49bd\u49be' + '\u49bf\u49c0\u49c1\u49c2\u49c3\u49c4\u49c5\u49c6\u49c7\u49c8\u49c9\u49ca\u49cb\u49cc\u49cd\u49ce\u49cf\u49d0\u49d1\u49d2\u49d3\u49d4\u49d5\u49d6\u49d7\u49d8\u49d9\u49da\u49e2\u49e3\u49e4\u49e5\u49e6\u49e7\u49e8\u49e9\u49ea\u49eb\u49ec\u49ed\ua76c\u49ee\u49ef\u49f0\u49f1\u49f2\u49f3\u49f4\u49f5\u49f6\u49f7\u49f8\u49f9\u49fa\u49fb\u49fc\u49fd\u49fe\u4a08\u4a09\u4a0a\u4a0b\u4a0c\u4a0d\u4a0e\u4a0f\u4a10\u4a11\u4a12\u4a13\u4a14\u4a15\u4a16\u4a17\u4a18\u4a19\u4a1a\u4a23\u4a24\u4a25\u4a26\u4a27\u4a28\u4a29\u4a2a\u4a2b\u4a2c\u4a2d\u4a33\u4a34\u4a38\u4a39\u4a3a\u4a3b\u4a3c\u4a3d\u4a3e\u4421\u4a3f\u4a42\u4a43\u4a44\u4a46\u4a47\u4a48\u4a49\u4a4b\u4a4d\u4a4e\u4a4f\u4a50\u4a51\u4a52\u4a53\u4a54\u4a55\u4a56\u4a57\u4a58\u4a59\u4a5a\u4a5b\u4a5c\u4a5d\u4a5f\u4a60\u4a61\u4a62' + '\u4a63\u4a65\u4a66\u4a67\u4a68\u4a69\u4a6a\u4a6b\u4a6c\u4a71\u4a6e\u4a6f\u4a70\u4a72\u4a75\u4a76\u4a77\u4a78\u4a7a\u4a79\u4a7b\u4a7c\u4a7d\u4a7e\u4a7f\u4a81\u4a82\u4a83\u4a84\u4a85\u4a87\u4a88\u4a89\u4a8a\u4a8c\u4a8d\u4a8e\u4a8f\u4a92\u4a94\u4a95\u4a96\u4a97\u4a98\u4a99\u4a9a\u4a9b\u4a9c\u4a9d\u4a9e\u4a9f\u4aa0\u4aa1\u4aa3\u4aa4\u4aa5\u4aa6\u4aa7\u4aa8\u4aa9\u4aaa\u4aae\u4aaf\u4ab0\u4ab1\u4ab2\u4ab3\u4ab6\u4ab7\u4ab8\u4ab9\u4aba\u4abb\u4abc\u4ad1\u4abd\u4abe\u4abf\u4ac6\u4ac7\u4ac8\u4ac9\u4aca\u4acb\u4acc\u4acd\u4ace\u4ad2\u4ad3\u4ad4\u4ad5\u4ad6\u4ad7\u4ad8\u4ad9\u4add\u4ade\u4adf\u4ae0\u4ae1\u4ae2\u4ae3\u4ae5\u4ae6\u4ae7\u4ae9\u4aea\u4aeb\u4aec\u4aed\u4aee\u4aef\u4af1\u4af2\u4af3\u4af4\u4af5\u4af6\u4af7\u4af9\u4afa\u4afb\u4afc\u4afd\u4afe\u4aff\u4b00\u4b01' + '\u4b02\u4b03\u4b04\u4b05\u4b06\u4b07\u4b08\u4b09\u4b0a\u4b11\u4b12\u4b13\u4b14\u4b79\u4b15\u4b16\u4b17\u4b18\u4b19\u4b1a\u4b1b\u4b1c\u4b1d\u4b1e\u4b1f\u4b20\u4b21\u4b22\u4b23\u4b24\u4b25\u4b26\u4b27\u4b28\u4b29\u4b2a\u4b2b\u4b2c\u4b2d\u4b2e\u4b2f\u4b30\u4b31\u4b32\u4b3b\u4b3c\u4b3d\u4b3e\u4b3f\u4b40\u4b41\u4b42\u4b43\u4b44\u4b45\u4b46\u4b47\u4b48\u4b49\u4b4a\u4b4b\u4b4c\u4b4d\u4b4e\u4b4f\u4b50\u4b51\u4b52\u4b53\u4b54\u4b55\u4b56\u4b57\u4b58\u4b59\u4b5a\u4b5b\u4b5c\u4b5d\u4b5e\u4b5f\u4b60\u4b61\u4b62\u4b63\u4b64\u4b65\u4b66\u4b7a\u4b7b\u4b7c\u4b7d\u4b7e\u4b7f\u4b80\u4b81\u4b82\u4b83\u4b84\u4b85\u4b86\u4b87\u4b88\u4b89\u4b8a\u4b8b\u4b8c\u4b8d\u4bb4\u4b8e\u4b8f\u4b90\u4b91\u4b92\u4b93\u4b94\u4b95\u4b96\u4b97\u4b98\u4b99\u4b9a\u4b9b\u4b9c\u4b9d\u4b9e\u4b9f\u4ba0' + '\u4ba1\u4ba2\u4ba3\u4ba4\u79f2\u4ba5\u4ba6\u4ba7\u4ba8\u4bb5\u4bb6\u4bb7\u4bb8\u4bb9\u4bba\u4bbb\u4bbc\u4bbd\u4bbe\u4bbf\u4bc0\u4bc1\u4bc2\u4bc3\u4bc4\u4bc5\u4bc6\u4bc7\u4bc8\u4bc9\u4bca\u4bcb\u4bcc\u4bcd\u4bce\u4bcf\u4bd0\u4bd1\u4bd2\u4bd3\u4bd4\u4bd5\u4bd6\u4bd7\u4bf8\u4bd8\u4bd9\u4bda\u4bdb\u4bdc\u4bdd\u4bde\u4bdf\u4bf9\u4bfa\u4bfb\u4bfc\u4bfd\u4bfe\u4bff\u4c00\u4be0\u4c01\u4c02\u4c03\u4c04\u4c05\u4c06\u4c07\u4c08\u4c09\u4c0a\u4c0b\u4c0c\u4c0d\u4c0e\u4c0f\u4c10\u4c11\u4c12\u4c13\u4c14\u4c15\u4c16\u4c17\u4c18\u4c19\u4c1a\u4c1b\u4c1c\u4c1d\u4c1e\u4c1f\u4c20\u4c21\u4c22\u4c23\u4c24\u4c25\u4c26\u4c27\u4c28\u4c29\u4c2a\u4c2b\u4c2c\u4c2d\u4c2e\u4c2f\u4c30\u4c31\u4c32\u4c33\u4c34\u4c35\u4c36\u4c37\u4c38\u4c39\u4c43\u4c44\u4c45\u4c46\u4c47\u4c48\u4c49\u4c4a\u4c4b' + '\u4c4c\u4c4d\u4c4e\u4c4f\u4c50\u4c51\u4c52\u4c53\u4c54\u4c55\u4c56\u4c57\u4c58\u4c59\u4c5a\u4c5b\u4c93\u4c5c\u4c5d\u4c5e\u4c5f\u4c60\u4c61\u4c62\u4c63\u4c64\u4c65\u4c66\u4c67\u4c68\u4c69\u4c6a\u4c6b\u4c6c\u4c6d\u4c6e\u4c6f\u4c70\u4c71\u4c72\u4c73\u4c74\u4c75\u4c76\u4c77\u4c78\u4c79\u4c7a\u4c94\u4c95\u4c96\u4c97\u4c98\u4c99\u4c9a\u4c9b\u4c9c\u4c9d\u4c9e\u4c9f\u4ca0\u4ca1\u4ca2\u4ca3\u4ca4\u4ca5\u4ca6\u4ca7\u4ca8\u4ca9\u4caa\u4cab\u4cac\u4cad\u4cae\u4caf\u4cb0\u4cb1\u4cb2\u4c7b\u4cb3\u4cb4\u4cb5\u4cb6\u4cb7\u4cc8\u4cc9\u4cca\u4ccb\u4ccc\u4ccd\u4cce\u4ccf\u4cd0\u4cd1\u4cd2\u4cd3\u4cd4\u4cd5\u4cd6\u4cd7\u4cd8\u4cd9\u4cda\u4cdb\u4cdc\u4cdd\u4cde\u4cdf\u4ce0\u4ce1\u4ce2\u4ce3\u4ce4\u4ce5\u4cf4\u4cf5\u4cf6\u4cf7\u4cf8\u4cf9\u4cfa\u4cfb\u4cfc\u4cfd\u4cfe\u4cff\u4d00' + '\u4d01\u4d02\u4d03\u4d04\u4d05\u4d06\u4d07\u4d08\u4d09\u4d0a\u4d0b\u4d0c\u4d0d\u4d0e\u4d0f\u4d10\u4d17\u4d18\u4d19\u4d1a\u4d1b\u4d1c\u4d1d\u4d1e\u4d1f\u4d20\u4d21\u4d22\u4d23\u4d24\u4d25\u4d26\u4d27\u4d28\u4d29\u4d30\u4d31\u4d32\u4d33\u4d34\u4d35\u4d36\u4d37\u4d38\u4d39\u4d3a\u4d3b\u4d3c\u4d3d\u4d3e\u4d3f\u4d40\u4d2a\u4d41\u4d42\u4d43\u4d46\u4d4d\u4d47\u4d48\u4d49\u4d4a\u4d4e\u4d4f\u4d54\u4d55\u4d56\u4d57\u4d58\u4d59\u4d5a\u4d5e\u4d5f\u4d60\u4d62\u4d63\u4d64\u4d66\u4d67\u4d68\u4d6b\u4d6c\u4d6d\u4d6e\u4d6f\u4d70\u4d71\u4d72\u4d73\u4d74\u4d76\u4d77\u4d78\u4d79\u4d7a\u4d7d\u4d7e\u4d7f\u4d80\u4d81\u4d82\u4d83\u4d84\u4d85\u4d87\u4d88\u4d89\u4d8b\u4d8c\u4d8d\u4d90\u4d91\u4d92\u4d94\u4d93\u4d96\u4d97\u4d99\u4d9a\u4d9b\u4d9d\u4d9e\u4da0\u4da1\u4da2\u4da3\u4da4\u4da5' + '\u4da7\u4da9\u4daa\u4dab\u4dac\u4daf\u4db0\u4db1\u4db2\u4db3\u4db6\u4db7\u4db8\u4db9\u4dba\u4dbb\u4dbc\u4dbd\u4dbe\u4dc3\u4dc4\u4dc5\u4dc6\u4dc7\u4dc8\u4dc9\u4dca\u4dcb\u4dcc\u4dcd\u4dce\u4dcf\u4dd0\u4dd1\u4dd3\u4dd4\u4dd5\u4dd6\u4dd7\u4de0\u4dd8\u4dd9\u4dda\u4ddb\u4de1\u4de2\u4de3\u4de4\u4de5\u4de6\u4de7\u4de8\u4de9\u4dea\u4deb\u4dec\u4ded\u4dee\u4def\u4df0\u4df1\u4df2\u4df3\u4df8\u4df9\u4dfa\u4dfb\u4dfc\u4dfd\u4dfe\u4dff\u4e00\u4e01\u4e02\u4e0a\u4e0b\u4e0c\u4e0d\u4e0e\u4e0f\u4e10\u4e11\u4e12\u4e13\u4e14\u4e15\u4e19\u4e1a\u4e1b\u4e1c\u4e1d\u4e1e\u4e1f\u4e20\u4e26\u4e27\u4e28\u4e29\u4e2a\u4e2b\u4e2c\u4e2d\u4e2e\u4e2f\u4e30\u4e35\u4e16\u4e36\u4e37\u4e38\u4e39\u4e3d\u4e3e\u4e3f\u4e40\u4e42\u4e43\u4e44\u4e45\u4e46\u4e49\u4e4a\u4e4c\u4e4d\u4e4e\u4e4f\u4e50\u4e51' + '\u4e53\u4e55\u4e56\u4e58\u4e59\u4e5a\u4e57\u4e5c\u4e5d\u4e5e\u4e5f\u4e60\u4e61\u4e63\u4e64\u4e65\u4e66\u4e67\u4e68\u4e69\u4e6a\u4e6b\u4e6d\u4e6e\u4e6f\u4e70\u4e71\u4e72\u4e73\u4e74\u4e76\u4e78\u4e79\u4e7a\u4e7d\u4e7e\u4e7f\u4e80\u4e81\u4e82\u4e84\u4e85\u4e86\u4e87\u4e88\u4e8a\u4e8d\u4e8e\u4e96\u4e97\u4e9a\u4e9b\u4e9c\u4e9f\u4ea0\u4ea1\u4ea2\u3d25\u4ea3\u4ea4\u4ea5\u4ea7\u4eaa\u4eab\u4eac\u4ead\u4eae\u4eaf\u4eb1\u4eb2\u4eb3\u4eb4\u4eb5\u4eb6\u4eb7\u4ebb\u4ebc\u4ebd\u4ebe\u4ebf\u4ec5\u4ec6\u4ec7\u4ec8\u4ec9\u4eca\u4ecb\u4ecc\u4ecd\u4ecf\u4ed0\u4ed1\u4ed2\u4ed3\u4ed6\u4ed7\u4ed8\u4ed9\u4edc\u4edd\u4ee1\u4ee2\u4ee3\u4ee4\u4ee7\u4ee8\u4ee9\u4eea\u4eec\u4eed\u4eee\u4ef0\u4ef2\u4ef5\u4ef7\u4ef8\u4ef9\u4efa\u4efb\u4efc\u4f01\u4f02\u4f03\u4f04\u4f05\u4f06\u4f07\u4f08' + '\u4f09\u4f0a\u4f0b\u4f0c\u4f15\u4f16\u4f17\u4f18\u4f19\u4f1a\u4f1b\u4f1c\u4f1d\u4f69\u4f1e\u4f1f\u4f20\u4f21\u4f22\u4f23\u4f24\u4f25\u4f26\u4f27\u4f28\u4f29\u4f2a\u4f2b\u4f2c\u4f35\u4f36\u4f37\u4f38\u4f39\u4f3a\u4f3b\u4f3c\u4f3d\u4f3e\u4f3f\u4f40\u4f41\u4f42\u4f43\u4f44\u4f45\u4f46\u4f47\u4f48\u4f49\u4f4a\u4f4b\u4f4c\u4f4d\u4f4e\u4f4f\u4f50\u4f51\u4f52\u4f53\u4f54\u4f55\u4f56\u4f57\u4f58\u4f59\u4f5a\u4f5b\u4f5c\u4f5d\u4f6a\u4f6b\u4f6c\u4f6d\u4f6e\u4f6f\u4f70\u4f71\u4f72\u4f73\u4f74\u4f75\u4f76\u4f77\u4f78\u4f79\u4f7a\u4f7b\u4f7c\u4f7d\u4f7e\u4f7f\u4f80\u4f81\u4f82\u4f83\u4f84\u4f85\u4f86\u4f87\u4f88\u4f89\u4f8a\u4f8b\u4f8f\u4f90\u4f91\u4f92\u4f93\u4f94\u4f95\u4f96\u4f97\u4f98\u4f99\u4f9a\u4f9b\u4f9c\u4f9d\u4f9e\u4f9f\u4fa0\u4fa1\u4fa2\u4fa3\u4fa4\u4fa5\u4fa6' + '\u4fa7\u4fa8\u4fa9\u4faa\u4fab\u4fac\u4fbd\u4fbe\u4fbf\u4fc0\u4fc1\u4fc2\u4fc3\u4fc4\u4fc5\u4fc6\u4fc7\u4fc8\u4fc9\u4fca\u4fcb\u4fcc\u4fcd\u4fce\u4fcf\u4fd0\u4fd1\u4fd2\u4fd3\u4fd4\u4fd5\u4fd6\u4fd7\u4fd8\u4fd9\u4fda\u4fdb\u4fdc\u4fdd\u4fde\u4fdf\u4fe0\u4fe1\u4fe2\u4fe3\u4fe4\u4fe5\u4fe6\u4fe7\u4ff7\u4ff8\u4ff9\u4ffa\u4ffb\u4ffc\u4ffd\u4ffe\u4fff\u5000\u5001\u5002\u5003\u5004\u5005\u5006\u5007\u5008\u5009\u500a\u500b\u500c\u500d\u500e\u500f\u502e\u5010\u5011\u5012\u5013\u5014\u5015\u5016\u5017\u5018\u5019\u501a\u501b\u501c\u501d\u501e\u501f\u5020\u5021\u5022\u502f\u5030\u5031\u5032\u5033\u5034\u5035\u5036\u5037\u5038\u5039\u503a\u503b\u503c\u503d\u503e\u503f\u5040\u5041\u5042\u5043\u5044\u5045\u5046\u5047\u5051\u5052\u5053\u5054\u5055\u5056\u5057\u5058\u5059' + '\u505a\u505b\u505c\u505d\u505e\u505f\u5060\u5061\u5062\u5063\u5064\u5065\u5066\u5067\u5068\u5075\u5076\u5077\u5078\u5079\u507a\u507b\u507c\u507d\u507e\u507f\u5080\u5081\u5082\u5083\u5084\u5085\u5086\u5087\u5088\u5089\u508a\u508b\u5098\u5099\u509a\u509b\u509c\u509d\u509e\u509f\u50a0\u50a1\u50a2\u50a3\u50a4\u50a5\u50a6\u50a7\u50a8\u50b0\u50b1\u50b2\u50b3\u50c3\u50b4\u50b5\u50b6\u50b7\u50bd\u50be\u50bf\u50c4\u50c5\u50c6\u50cb\u50cc\u50cd\u50ce\u50cf\u50d0\u50d1\u50d3\u50d8\u50d4\u50d5\u50d9\u50da\u50db\u50dc\u50dd\u50e0\u50de\u50e1\u50e2\u50e3\u50e5\u50e6\u50e7\u50e8\u50e9\u50eb\u9366\u50ec\u50ed\u50ee\u50ef\u50f1\u50f2\u50f3\u50f4\u50f5\u50f6\u50f7\u50f8\u50f9\u50fc\u50fe\u5100\u5101\u5102\u5103\u5105\u5106\u5108\u5109\u510a\u510b\u510c\u510d\u510f\u5110\u5111' + '\u5112\u5113\u5114\u5115\u5116\u5117\u511a\u511b\u511c\u5120\u5121\u5122\u5123\u5124\u5125\u5126\u5127\u512e\u512f\u5130\u5131\u5132\u5133\u5134\u5135\u5136\u5137\u5138\u5139\u513e\u513f\u5140\u5141\u5142\u5143\u5144\u5145\u5146\u5147\u5148\u514f\u5150\u5151\u5152\u5153\u5154\u5155\u5156\u5157\u5158\u515b\u515c\u515d\u515e\u515f\u5160\u5161\u5162\u5163\u5164\u5165\u516c\u516d\u516e\u516f\u5170\u5171\u5172\u5173\u5174\u5175\u5176\u518b\u5177\u5180\u5181\u5182\u5183\u5184\u5185\u8073\u518c\u518d\u518e\u518f\u5190\u5191\u5192\u5193\u5194\u519a\u5195\u519b\u519c\u519d\u519e\u519f\u51a0\u51a1\u51a2\u51a3\u51a4\u51a7\u51a8\u51a9\u51aa\u51ae\u51af\u51b0\u51b3\u51b4\u51b5\u51b6\u51b7\u51bc\u51bd\u51be\u51bf\u51c0\u51c1\u51c2\u51c3\u51c5\u51c6\u51c7\u51c8\u51c9\u51ce' + '\u51cf\u51d0\u51d1\u51d2\u51d3\u51d4\u51d5\u51d9\u51da\u51db\u51dc\u51dd\u51de\u51df\u51e0\u51e1\u51e2\u51e3\u51e4\u51e5\u51e6\u51ea\u51eb\u51ec\u51e7\u51ed\u51ee\u51ef\u51f0\u51f1\u51f2\u51f3\u51fc\u51fd\u51fe\u51ff\u5200\u5201\u5202\u520a\u520b\u520c\u520d\u520e\u520f\u5210\u5211\u5212\u5218\u5219\u521a\u521b\u521c\u521d\u521e\u521f\u5220\u5221\u5222\u5223\u5224\u522a\u522b\u522c\u522d\u522e\u522f\u5230\u523f\u5236\u5237\u5238\u5239\u523a\u5231\u523b\u523c\u5240\u5241\u5242\u5243\u5244\u5245\u5246\u5247\u5248\u5249\u524a\u524b\u5250\u5251\u5252\u5253\u5254\u5255\u5256\u5257\u5258\u5259\u525a\u525b\u525f\u5260\u5261\u5262\u5263\u5264\u5269\u526a\u526b\u526e\u526f\u5270\u5272\u5273\u5274\u5275\u5276\u5278\u5279\u527a\u527b\u527d\u527e\u527f\u5280\u5281\u5282' + '\u5283\u5284\u5285\u5286\u5287\u5288\u5289\u528a\u528b\u528c\u528e\u5291\u5292\u5293\u5294\u5295\u5296\u5299\u529a\u529c\u529d\u529e\u529f\u52a1\u52a2\u52a3\u52a4\u52a5\u52a6\u52ab\u52ac\u52ad\u52ae\u52b1\u52b2\u52b3\u52b4\u52b5\u52b6\u52b7\u52b8\u52b9\u52ba\u52bf\u52c0\u52c1\u52c2\u52c3\u52ca\u52cb\u52cc\u52cd\u52d0\u52d1\u52d2\u52d3\u52d4\u52d5\u52d9\u52da\u52db\u52dc\u52dd\u52e1\u52e2\u52e3\u52e4\u52e8\u52e9\u52ea\u52ec\u52ed\u52ee\u52ef\u52f2\u52f3\u52f4\u52f5\u52f7\u52f8\u52f9\u52fa\u52fb\u52fc\u52fd\u52fe\u5300\u5301\u5302\u5303\u5304\u5305\u5306\u5308\u5309\u530a\u530b\u530c\u530e\u530f\u5310\u5315\u5316\u5317\u5318\u5319\u86ef\u531a\u531b\u531d\u5320\u5321\u5322\u5324\u5327\u5328\u532a\u532b\u532d\u532e\u532f\u5330\u5331\u5332\u5337\u5338\u5339\u533a' + '\u533b\u533c\u533d\u533e\u533f\u5342\u5343\u5344\u5345\u5346\u5347\u5348\u5349\u534a\u5354\u5355\u5356\u5357\u5358\u5359\u534b\u535a\u535d\u535e\u535f\u5360\u5371\u5361\u5362\u5363\u5364\u5365\u5366\u5367\u5368\u5369\u536a\u5372\u5373\u5374\u5375\u5376\u5377\u5378\u537e\u537f\u5380\u5381\u5382\u5384\u538a\u5385\u5386\u538b\u538c\u538d\u538e\u538f\u5390\u5393\u5394\u5397\u5398\u539a\u539c\u539d\u539f\u53a0\u53a1\u53a2\u53a3\u53a5\u53a6\u53a7\u53a8\u53aa\u53ab\u53ac\u53ad\u53ae\u53af\u53b0\u53b1\u53b2\u53b3\u53b4\u53b5\u53b6\u53b7\u53b8\u53b9\u53ba\u53bb\u53c1\u53c2\u53c3\u53c4\u53c5\u53c6\u53c7\u53c8\u53c9\u53ca\u53cb\u53cc\u53cd\u53ce\u53cf\u53d0\u53d1\u53d2\u53d3\u53d4\u53d5\u53d6\u53d7\u53d8\u53d9\u53da\u53db\u53dc\u53dd\u53de\u53df\u53e0\u53e1\u53e2\u53e3' + '\u53e4\u53e5\u53e6\u53e7\u53e8\u53e9\u53ea\u53f6\u53f7\u53f8\u53f9\u53fa\u53fb\u53fc\u53fd\u53fe\u53ff\u5400\u5401\u5402\u5403\u5404\u5405\u5406\u5407\u5408\u5409\u540a\u540b\u540c\u540d\u540e\u540f\u5410\u5411\u5412\u5413\u5414\u5415\u5416\u5417\u5418\u5419\u541a\u541b\u541c\u541d\u541e\u541f\u5420\u5421\u5422\u5423\u5424\u5425\u5426\u5427\u5428\u5429\u542a\u542b\u542c\u542d\u542e\u543d\u543e\u543f\u5440\u5441\u5442\u5443\u5444\u5445\u5446\u5447\u5448\u5449\u544a\u544b\u544c\u544d\u544e\u544f\u5450\u5451\u5452\u5453\u5454\u5455\u5456\u5457\u5458\u5459\u545a\u545b\u545c\u545d\u545e\u545f\u5460\u5461\u5462\u5463\u5464\u5465\u5466\u5467\u5468\u5469\u546a\u546b\u546c\u546d\u546e\u546f\u5470\u5471\u5472\u5473\u5474\u5475\u5476\u5477\u5478\u5479\u547a\u5490\u5491' + '\u5492\u5493\u5494\u5495\u5496\u5497\u5498\u5499\u549a\u549b\u549c\u549d\u549e\u549f\u54a0\u54a1\u54a2\u54a3\u54a4\u54a5\u54a6\u54a7\u54a8\u54a9\u54aa\u54ab\u54ac\u54ad\u54ae\u54af\u54b0\u54b1\u54b2\u54b3\u54b4\u54b5\u54b6\u54b7\u54b8\u54b9\u54ba\u54bb\u54bc\u54bd\u54be\u54bf\u54c0\u54c1\u54d1\u54d2\u54d3\u54d4\u54d5\u54d6\u54d7\u54d8\u54d9\u54da\u54db\u54dc\u54dd\u54de\u54df\u54e0\u54e1\u54e2\u54e3\u54e4\u54e5\u54e6\u54e7\u54e8\u54e9\u54ea\u54eb\u54ec\u54ed\u54ee\u54ef\u54f0\u54f1\u54f2\u54f3\u54f4\u54f5\u54f6\u54f7\u54f8\u54f9\u54fa\u54fb\u54fc\u54fd\u54fe\u54ff\u5500\u5501\u5502\u5503\u5504\u5505\u5506\u5507\u5508\u5509\u550a\u550b\u550c\u550d\u550e\u550f\u5510\u552d\u552e\u552f\u5530\u5531\u5532\u5533\u5534\u5535\u5536\u5537\u5538\u5539\u553a\u553b\u553c' + '\u553d\u553e\u553f\u5540\u5541\u5542\u5543\u5544\u5545\u5546\u5547\u5548\u5549\u554a\u554b\u554c\u554d\u554e\u554f\u5550\u5551\u5552\u5553\u5554\u5555\u5556\u5557\u5558\u5559\u555a\u555b\u555c\u555d\u555e\u555f\u5560\u5561\u5562\u5563\u5577\u5578\u5579\u557a\u557b\u557c\u557d\u557e\u557f\u5580\u5581\u5582\u5583\u5584\u5585\u5586\u5587\u5588\u5589\u558a\u558b\u558c\u558d\u558e\u558f\u5590\u5591\u5592\u5593\u5594\u5595\u5596\u5597\u5598\u5599\u559a\u559b\u559c\u559d\u559e\u559f\u55a0\u55a1\u55b2\u55b3\u55b4\u55b5\u55b6\u55b7\u55b8\u55b9\u55ba\u55bb\u55bc\u55bd\u55be\u55bf\u55c0\u55c1\u55c2\u55c3\u55c4\u55c5\u55c6\u55c7\u5564\u55c8\u55c9\u55ca\u55cb\u55f4\u55cc\u55cd\u55ce\u55cf\u55d0\u55d1\u55d2\u55d3\u55d4\u55d5\u55d6\u55d7\u55d8\u55d9\u55da\u55db\u55dc\u55dd' + '\u55de\u55df\u55e0\u55e1\u55e2\u55e3\u55e4\u55e5\u55e6\u55f5\u55f6\u55f7\u55f8\u55f9\u55fa\u55fb\u55fc\u55fd\u55fe\u55ff\u5600\u5601\u5602\u5603\u5604\u5605\u5606\u5607\u5608\u5609\u560a\u560b\u560c\u560d\u560e\u560f\u5610\u5611\u5612\u5613\u5614\u5615\u5616\u5617\u5618\u5619\u561a\u561b\u561c\u561d\u561e\u561f\u562e\u562f\u5630\u5631\u5632\u5633\u5634\u5651\u5635\u5636\u5637\u5638\u5639\u563a\u563b\u563c\u563d\u563e\u563f\u5640\u5641\u5642\u5643\u5644\u5645\u5646\u5647\u5648\u5649\u564a\u564b\u564c\u564d\u5652\u5653\u5654\u5655\u5656\u5657\u5658\u5659\u565a\u565b\u565c\u565d\u565e\u565f\u5660\u5661\u5662\u5663\u5664\u5665\u566d\u566e\u566f\u5670\u5671\u5672\u5673\u5674\u5675\u5676\u5677\u5678\u567b\u567c\u567d\u567e\u5684\u5685\u5686\u568a\u568b\u568c\u568d' + '\u568e\u568f\u5690\u5693\u5694\u5695\u5696\u5697\u5699\u569a\u569b\u569c\u569d\u569e\u569f\u56a0\u56a1\u56a2\u56a3\u56a4\u56a7\u56a8\u56a9\u56aa\u56ae\u56b0\u56b4\u56b5\u56b6\u56b7\u56b9\u56ba\u56bd\u56be\u56bf\u56c0\u56c1\u56c2\u56bb\u56c4\u56c5\u56c6\u56c7\u56c8\u56c9\u56cb\u56cc\u56cd\u56d1\u56ce\u56d2\u56d5\u56d3\u56d6\u56d7\u56d8\u56d9\u56da\u56db\u56dc\u56dd\u56df\u56e0\u56e1\u56e2\u56e5\u56e6\u56e7\u56ea\u56eb\u56ec\u56ed\u56ee\u56ef\u56f0\u56f1\u56f2\u56f3\u56f5\u5700\u56f6\u56f7\u56f8\u56f9\u56fa\u56fb\u56fc\u5701\u5702\u5703\u5704\u5705\u5706\u5707\u5708\u5719\u5709\u570a\u570b\u570c\u570d\u570e\u570f\u5710\u5711\u5712\u5713\u5714\u5715\u571a\u571b\u571c\u571d\u571e\u571f\u5720\u5721\u5722\u5723\u5724\u575b\u5725\u5726\u5727\u5728\u5729\u572a\u572b' + '\u572c\u572d\u572e\u572f\u5730\u5731\u5732\u5733\u5734\u5735\u5736\u5737\u5738\u5739\u573a\u573b\u573c\u573d\u573e\u573f\u5740\u5741\u5742\u5743\u5744\u5745\u5746\u5747\u5748\u5749\u574a\u574b\u574c\u574d\u574e\u574f\u5750\u5751\u575c\u575d\u575e\u575f\u5760\u5761\u5762\u5763\u5764\u5765\u5766\u5767\u5768\u5769\u576a\u576b\u576c\u576d\u576e\u576f\u5770\u5771\u5772\u5773\u5774\u5775\u5776\u5777\u5778\u5779\u577a\u577b\u577c\u577d\u577e\u577f\u5780\u5781\u5782\u5783\u5784\u5785\u5786\u5787\u5788\u5789\u578a\u578b\u578c\u578d\u578e\u578f\u5790\u5791\u5792\u5793\u5794\u5795\u5796\u5797\u5798\u5799\u579a\u579b\u579c\u579d\u579e\u579f\u57af\u57b0\u57b1\u57b2\u57b3\u57b4\u57b5\u57b6\u57b7\u57b8\u57b9\u57ba\u57bb\u57bc\u57bd\u57be\u57bf\u57c0\u57c1\u57c2\u57c3\u57c4' + '\u57c5\u57c6\u57c7\u57c8\u57c9\u57ca\u57cb\u57cc\u57cd\u57ce\u57cf\u57d0\u57d1\u57d2\u57d3\u57d4\u57d5\u57d6\u57d7\u57d8\u57d9\u57da\u57db\u57dc\u57dd\u57de\u57df\u57e0\u57e1\u57e2\u57e3\u57e4\u57e5\u57e6\u57e7\u57e8\u57e9\u57ea\u57eb\u57ec\u57fe\u57ff\u5800\u5801\u5802\u5803\u5804\u5805\u5806\u5807\u5808\u5809\u580a\u580b\u580c\u580d\u580e\u580f\u5810\u5811\u5812\u5813\u5814\u5815\u5816\u5817\u5818\u5819\u581a\u581b\u581c\u581d\u581e\u581f\u5820\u5821\u5822\u5823\u5824\u5825\u5826\u5827\u5828\u5829\u582a\u582b\u582c\u582d\u582e\u582f\u5830\u5831\u5832\u5833\u5834\u5835\u5836\u5837\u5838\u5839\u583a\u5842\u5843\u5844\u5845\u5846\u5847\u5848\u5849\u584a\u584b\u584c\u584d\u584e\u584f\u5850\u5851\u5852\u5853\u5854\u5855\u5856\u5857\u5858\u5859\u585a\u585b\u585c' + '\u585d\u585e\u585f\u5860\u5861\u5862\u5863\u5864\u5865\u5866\u5867\u5868\u5869\u586a\u586b\u586c\u586d\u586e\u586f\u5870\u5871\u5872\u5873\u5874\u5875\u5876\u5877\u5878\u5879\u587a\u587b\u587c\u587d\u587e\u587f\u5880\u5881\u5882\u5883\u5884\u5885\u5886\u5887\u5888\u5889\u588a\u588b\u588c\u588d\u588e\u58aa\u588f\u5890\u5891\u5892\u5893\u5894\u5895\u5896\u5897\u5898\u5899\u58ab\u58ac\u58ad\u58ae\u58af\u58b0\u58b1\u595b\u58b2\u58b3\u58b4\u58b5\u58b6\u58b7\u58b8\u58b9\u58ba\u58bb\u58bc\u58bd\u58be\u58bf\u58c0\u58c1\u58c2\u58c3\u58c4\u58c5\u58c6\u58c7\u58c8\u58c9\u58ca\u58cb\u58cc\u58cd\u58ce\u58cf\u58d0\u58d1\u58d2\u58d3\u58d4\u58d5\u58d6\u58d7\u58d8\u58d9\u58da\u58db\u58dc\u58dd\u58de\u58df\u58e0\u58e1\u58e2\u58e3\u58e4\u58e5\u58e6\u58e7\u58e8\u58e9\u58ea\u58eb' + '\u58ec\u58ed\u58ee\u58ef\u58f0\u58f1\u5902\u5903\u5904\u5905\u5906\u5907\u5908\u5909\u590a\u590b\u590c\u590d\u590e\u590f\u5910\u5911\u5912\u5913\u5914\u5915\u5916\u5917\u5918\u5919\u591a\u591b\u591c\u591d\u591e\u591f\u5920\u5921\u5922\u5923\u5924\u5925\u5926\u5927\u5928\u5929\u592a\u592b\u592c\u59ab\u592d\u592e\u592f\u5930\u5931\u5932\u5933\u5934\u5935\u5936\u5937\u5938\u5939\u593a\u593b\u593c\u593d\u593e\u593f\u5940\u5941\u5942\u5943\u5944\u5945\u595c\u595d\u595e\u595f\u5960\u5961\u5962\u58f2\u5963\u5964\u5965\u59ac\u5966\u5967\u5968\u5969\u596a\u596b\u596c\u596d\u596e\u596f\u5970\u5971\u5972\u5973\u5974\u5975\u5976\u5977\u5978\u5979\u597a\u597b\u597c\u597d\u597e\u597f\u5980\u5981\u5982\u5983\u5984\u5985\u5986\u5987\u5988\u5989\u598a\u598b\u598c\u598d\u598e' + '\u598f\u5990\u5991\u5992\u5993\u59ad\u59ae\u5994\u59af\u59b0\u59b1\u59b2\u59b3\u59b4\u59b5\u59b6\u59b7\u59b8\u59b9\u59ba\u59bb\u59bc\u59bd\u59be\u59bf\u59c0\u59c1\u59c2\u59c3\u59c4\u59c5\u59c6\u59c7\u59c8\u59c9\u59ca\u59cb\u59cc\u59cd\u59ce\u59cf\u59d0\u59d1\u59d2\u59d3\u59d4\u59d5\u59d6\u59d7\u59d8\u59d9\u59da\u59db\u59dc\u59dd\u59de\u59df\u59e0\u59e1\u59f2\u59f3\u59f4\u59f5\u59f6\u59f7\u59f8\u59f9\u59fa\u59fb\u59fc\u59e2\u59fd\u59fe\u59ff\u5a00\u5a01\u5a02\u5a03\u5a04\u5a05\u5a06\u5a07\u5a08\u5a09\u5a0a\u5a0b\u5a0c\u5a0d\u5a0e\u5a0f\u5a10\u5a11\u5a12\u5a13\u5a14\u5a1d\u5a1e\u5a1f\u5a20\u5a21\u5a22\u5a35\u5a23\u5a24\u5a25\u5a26\u5a27\u5a28\u5a29\u5a2a\u5a2b\u5a2c\u5a2d\u5a2e\u5a36\u5a37\u5a38\u5a39\u5a3a\u5a3b\u5a3c\u5a3d\u5a3e\u5a3f\u5a40\u5a41\u5a42\u5a43' + '\u5a44\u5a45\u5a46\u5a47\u5a48\u5a49\u5a4a\u5a57\u5a58\u5a59\u5a5a\u5a5b\u5a5c\u5a5d\u5a5e\u5a5f\u5a60\u5a64\u5a61\u5a65\u5a66\u5a67\u5a68\u5a69\u5a6a\u5a6b\u5a6c\u5a70\u5a71\u5a72\u5a77\u5a78\u5a79\u5a7a\u5a7b\u5a7c\u5a7d\u5a81\u5a7e\u5a7f\u5a82\u5a83\u5a84\u5a85\u5a89\u5a8a\u5a8b\u5a8e\u5a8f\u5a91\u5a95\u5a97\u5a98\u5a99\u5a9a\u5a9b\u5a9c\u5a9d\u5a9e\u5a9f\u5aa0\u5aa3\u5aa4\u5aa5\u5aa8\u5aa9\u5aaa\u5aab\u5aac\u5aad\u5ab2\u5ab3\u5ab4\u5ab5\u5ab6\u5ab7\u5ab8\u5abd\u5abe\u5abf\u5ac0\u5ac1\u5ac2\u5ac3\u5ac4\u5ac5\u5ac6\u5ac7\u5ac8\u5ac9\u5aca\u5acb\u5ad1\u5ad2\u5ad3\u5ad4\u5ad5\u5ad6\u5ad7\u5ad8\u5ad9\u5ada\u5adb\u5adc\u5add\u5ade\u5adf\u5aed\u5aee\u5ae0\u5aef\u5af0\u5af1\u5af7\u5af8\u5af9\u5afe\u5aff\u5b00\u5b01\u5b02\u5b03\u5b04\u5b05\u5b09\u5b0a\u5b0b\u5b0c' + '\u5b11\u5b12\u5b13\u5b14\u5b18\u5b19\u5b1a\u5b1d\u5b1e\u5b20\u5b21\u5b22\u5b24\u5b25\u5b26\u5b27\u5b28\u5b29\u5b2a\u5b2c\u5b2d\u5b2e\u5b2f\u5b30\u5b33\u5b36\u5b37\u5b39\u5b3a\u5b3c\u5b3e\u5b3f\u5b40\u5b41\u5b43\u5b44\u5b47\u5b48\u5b49\u5b4a\u5b4b\u5b4c\u5b4d\u5b4e\u5b53\u5b54\u5b55\u5b56\u5b58\u5b59\u5b5a\u5b5c\u5b5e\u5b5f\u5b60\u5b61\u5b62\u5b63\u5b65\u5b66\u5b67\u5b69\u5b6a\u5b6b\u5b6c\u5b6e\u5b6f\u5b70\u5b71\u5b72\u5b73\u5b79\u5b7a\u5b7b\u5b74\u5b7c\u5b7d\u5b7e\u5b7f\u5b80\u5b84\u5b85\u5b87\u5b88\u5b89\u5b8a\u5b8b\u5b8c\u5b8f\u5b90\u5b91\u5b92\u5b93\u5b94\u5b95\u5b96\u5b97\u5b98\u5b99\u5b9a\u5b9b\u5b9c\u5b9d\u5b9e\u5b9f\u5ba0\u5ba1\u5ba2\u5ba3\u5ba4\u5ba5\u5ba6\u5ba9\u5baa\u5bab\u5bac\u5bad\u5bae\u5baf\u5bb0\u5bb1\u5bb8\u5bb9\u5bba\u5bbb\u5bbc\u5bbd\u5bbe' + '\u5bbf\u5bc0\u5bc1\u5bc2\u5bc3\u5bc4\u5bc5\u5bc6\u5bc7\u5bc8\u5bc9\u5bca\u5bcb\u5bcc\u5bcd\u5bce\u5bcf\u5bd0\u5bd1\u5bd2\u5bd3\u5bd4\u5bd5\u5bd6\u5bd7\u5bd8\u5bdc\u5bdd\u5bde\u5bdf\u5be0\u5be1\u5be2\u5be3\u5be4\u5be5\u5be6\u5be7\u5be8\u5be9\u5bea\u5beb\u5bec\u5bed\u5bee\u5bef\u5bf0\u5bf1\u5bf2\u5bf3\u5bf4\u5bf5\u5bf6\u5bf7\u5bf8\u5bf9\u5bfa\u5bfb\u5bfc\u5bfd\u5bfe\u5bff\u5c00\u5c01\u5c0c\u5c0d\u5c0e\u5c0f\u5c10\u5c11\u5c12\u5c13\u5c14\u5c15\u5c16\u5c17\u5c18\u5c19\u5c1a\u5c1b\u5c1c\u5c1d\u5c1e\u5c1f\u5c20\u5c21\u5c22\u5c2e\u5c2f\u5c30\u5c31\u5c32\u5c33\u5c34\u5c35\u5c36\u5c37\u5c38\u5c39\u5c3a\u5c3b\u5c3c\u5c3d\u5c3e\u5c3f\u5c40\u5c48\u5c49\u5c4a\u5c4b\u5c4c\u5c4d\u5c4e\u5c4f\u5c50\u5c51\u5c52\u5c53\u5c54\u5c55\u5c56\u5c57\u5c58\u5c59\u5c5a\u5c5b\u5c5c\u5c5d' + '\u5c5e\u5c5f\u5c60\u5c61\u5c6f\u5c70\u5c71\u5c72\u5c73\u5c74\u5c75\u5c76\u5c77\u5c78\u5c79\u5c7a\u5c7b\u5c62\u5c7c\u5c7d\u5c7e\u5c7f\u5c80\u5c81\u5c82\u5c83\u5c90\u5c91\u5c92\u5c93\u5c94\u5c95\u5c96\u5c97\u5c98\u5c99\u5c9a\u5c9b\u5c9c\u5c9d\u5c9e\u5ca3\u5ca4\u5ca5\u5ca6\u5ca7\u5ca8\u5ca9\u5caa\u5cab\u5cac\u5cad\u5cae\u5caf\u5cb0\u5cb1\u5cb8\u5cb9\u5cba\u5cbb\u5cbc\u5cbd\u5cbe\u5cbf\u5cc0\u5cc1\u5cc2\u5cc3\u5cc4\u5cc5\u5cc6\u5cc7\u5cc8\u5cc9\u5cca\u5ccb\u5ccc\u5ccd\u5cd8\u5cd9\u5cda\u5cdb\u5cdc\u5cdd\u5cde\u5cdf\u5ce0\u5ce1\u5ce6\u5ce7\u5ce2\u5ce8\u5ce9\u5cf0\u5cf1\u5cf2\u5cf3\u5cf4\u5cf5\u5cf8\u5cf9\u5cfa\u5cfb\u5cfc\u5cfd\u5cff\u5d02\u5d03\u5d04\u5d06\u5d07\u5d08\u5d0a\u5d0b\u5d0c\u5d0d\u5d0f\u5d10\u5d11\u5d12\u5d13\u5d15\u5d14\u5d16\u5d17\u5c41\u5d18\u5d19' + '\u412a\u5d1a\u5d1b\u5d1c\u5d1d\u5d1e\u5d1f\u5d22\u5d23\u5d24\u5d25\u5d26\u5d27\u5d28\u5d2c\u5d2d\u5d2e\u7fa9\u5d2f\u5d30\u5d31\u5d32\u5d35\u5d36\u5d37\u5d38\u5d39\u5d3a\u5d3d\u5d3e\u5d3f\u5d40\u5d43\u8074\u5d45\u5d4c\u5d4d\u80e6\u5d50\u5d51\u5d52\u5d53\u5d54\u5d55\u5d56\u5d57\u5d58\u5d59\u5d5a\u5d5b\u5d5c\u5d5d\u5d5e\u5d5f\u5d60\u5d61\u5d62\u5d63\u5d64\u5d65\u5d66\u5d67\u5d68\u5d69\u5d6a\u5d6b\u5d6c\u5d6d\u5d6f\u5d70\u5d71\u5d72\u5d73\u5d74\u5d75\u5d76\u5d77\u5d78\u5d79\u5d7a\u5d7b\u5d7c\u5d7d\u5d7e\u5d7f\u5d80\u5d81\u5d82\u5d83\u5d84\u5d85\u5d86\u5d87\u5d88\u5d89\u5d8a\u5d8b\u5d8c\u5d8d\u5d8e\u5d8f\u5d90\u5d91\u5d92\u5d93\u5d94\u5d9b\u5d9c\u5d9d\u5d9e\u5d9f\u5da0\u5da1\u5da2\u5da3\u5da4\u5da5\u5da6\u5da7\u5da8\u5da9\u5daa\u5dab\u5dac\u5dad\u5dae\u5daf\u5db0' + '\u5db1\u5d95\u5db2\u5db3\u5db4\u5db5\u5db6\u5db7\u5db8\u5db9\u5dba\u5dbb\u5dbc\u5dbd\u5dbe\u5dbf\u5dc0\u5dc1\u5dc2\u5dc3\u5dc4\u5dc5\u5dc6\u5dc7\u5dc8\u5dc9\u5dca\u5dcb\u5dcc\u5dcd\u5dce\u5dcf\u5dd0\u5dd1\u5dd2\u5dd3\u5dd4\u5dd5\u5dd6\u5dd7\u5dd8\u5dd9\u5dda\u5ddb\u5ddc\u5ddd\u5de8\u5de9\u5dea\u5deb\u5dec\u5ded\u5dee\u5def\u5df0\u5df1\u5df2\u5df3\u5df4\u5df5\u5df6\u5df7\u5df8\u5df9\u5dfa\u5dfb\u5dfc\u5dfd\u5dfe\u5dff\u5e00\u5e01\u5e02\u5e03\u5e04\u5e05\u5e06\u5e07\u5e08\u5e09\u5e0a\u5e0b\u5e0c\u5e0d\u5e0e\u5e0f\u5e10\u5e11\u5e12\u5e13\u5e14\u5e15\u5e16\u5e17\u5e18\u5e19\u5e1a\u5e1b\u5e1c\u5e1d\u5e1e\u5e1f\u5e20\u5e21\u5e22\u5e23\u5e24\u5e25\u5e26\u5e27\u5e28\u5e29\u5e2a\u5e2b\u5e2c\u5e2d\u5e2e\u5e2f\u5e30\u5e31\u5e32\u5e33\u5e34\u5e35\u5e36\u5e37\u5e38\u5e39' + '\u5e3a\u5e3b\u5e3c\u5e3d\u5e3e\u5e3f\u5e40\u5e41\u5e42\u5e43\u5e44\u5e45\u5e46\u5e47\u5e48\u5e49\u5e4a\u5e4b\u5e53\u5e54\u5e55\u5e56\u5e57\u5e58\u5e59\u5e5a\u5e5b\u5e5c\u5e5d\u5e5e\u5e5f\u5e60\u5e61\u5e62\u5e63\u5e64\u5e65\u5e66\u5e67\u5e68\u5e69\u5e6a\u5e6b\u5e6c\u5e6d\u5e6e\u5e6f\u5e70\u5e71\u5e72\u5e73\u5e74\u5e75\u5e76\u5e77\u5e78\u5e79\u5e7a\u5e7b\u5e7c\u5e7d\u5e7e\u5e7f\u5e80\u5e81\u5e82\u5e83\u5e84\u5e85\u5e86\u5e87\u5e88\u5e89\u5e8a\u5e8b\u5e8c\u5e8d\u5e8e\u5e8f\u5e90\u5e91\u5e92\u5e93\u5e94\u5e95\u5e96\u5e97\u5e98\u5e99\u5e9a\u5e9b\u5e9c\u5e9d\u5e9e\u5e9f\u5ea0\u5ea1\u5ea2\u5ea3\u5ea4\u5ea5\u5ea6\u5ea7\u5ea8\u5ea9\u5eaa\u5eab\u5ebd\u5ebe\u5ebf\u5ec0\u5ec1\u5ec2\u5ec3\u5ec4\u5ec5\u5ec6\u5ec7\u5ec8\u5ec9\u5eca\u5ecb\u5ecc\u5ecd\u5ece\u5ecf\u5ed0\u5ed1' + '\u5ed2\u5ed3\u5ed4\u5ed5\u5ed6\u5ed7\u5ed8\u5ed9\u5eda\u5edb\u5edc\u5edd\u5ede\u5edf\u5ee0\u5ee1\u5ee2\u5ee3\u5ee4\u5ee5\u5ee6\u5ee7\u5ee8\u5ee9\u5eea\u5eeb\u5eec\u5eed\u5eee\u5eef\u5ef0\u5ef1\u5ef2\u5ef3\u5ef4\u5ef5\u5ef6\u5ef7\u5ef8\u5ef9\u5efa\u5efb\u5efc\u5efd\u5efe\u5eff\u5f00\u5f01\u5f02\u5f03\u5f04\u5f05\u5f06\u5f07\u5f08\u5f09\u5f0a\u5f0b\u5f0c\u5f0d\u5f0e\u5f0f\u5f10\u5f11\u5f12\u5f13\u5f14\u5f24\u5f25\u5f26\u5f27\u5f28\u5f29\u5f2a\u5f2b\u5f2c\u5f2d\u5f2e\u5f2f\u5f30\u5f31\u5f32\u5f33\u5f34\u5f35\u5f36\u5f37\u5f38\u5f39\u5f3a\u5f3b\u5f3c\u5f3d\u5f3e\u5f3f\u5f40\u5f41\u5f42\u5f43\u5f44\u5f45\u5f46\u5f47\u5f48\u5f49\u5f4a\u5f4b\u5f4c\u5f4d\u5f4e\u5f4f\u5f50\u5f51\u5f52\u5f53\u5f54\u5f55\u5f56\u5f57\u5f58\u5f59\u5f5a\u5f5b\u5f5c\u5f5d\u5f5e\u5f5f\u5f60' + '\u5f61\u5f62\u5f63\u5f64\u5f65\u5f66\u5f67\u5f68\u5f69\u5f6a\u5f6b\u5f6c\u5f6d\u5f6e\u5f6f\u5f70\u5f71\u5f72\u5f73\u5f74\u5f75\u5f76\u5f77\u5f78\u5f79\u5f7a\u5f7b\u5f7c\u5f7d\u5f7e\u5f7f\u5f80\u5f81\u5f82\u5f83\u5f84\u5f85\u5f86\u5f87\u5f88\u5f89\u5f8a\u5f8b\u5f8c\u5f8d\u5f8e\u5f8f\u5fa4\u5fa5\u5fa6\u5fa7\u5fa8\u5fa9\u5faa\u5fab\u5fac\u5fad\u5fae\u5faf\u5fb0\u5fb1\u5fb2\u5fb3\u5fb4\u5fb5\u5fb6\u5fb7\u5fb8\u5fb9\u5fba\u5fbb\u5fbc\u5fbd\u5fbe\u5fbf\u5fc0\u5fc1\u5fc2\u5fc3\u5fc4\u5fc5\u5fc6\u5fc7\u5fc8\u5fc9\u5fca\u5fcb\u5fcc\u5fcd\u5fce\u5fcf\u5fd0\u5fd1\u5fd2\u5fd3\u5fd4\u5fd5\u5fd6\u5fd7\u5fd8\u5fd9\u5fda\u5fdb\u5fdc\u5fdd\u5fde\u5fdf\u5fe0\u5fe1\u5fe2\u5fe3\u5fe4\u5fe5\u5fe6\u5fe7\u5fe8\u5fe9\u5fea\u5feb\u5fec\u5fed\u5fee\u5fef\u5ff0\u5ff1\u5ff2\u5ff3\u5ff4' + '\u5ff5\u5ff6\u5ff7\u5ff8\u5ff9\u5ffa\u5ffb\u5ffc\u5ffd\u5ffe\u601c\u5fff\u6000\u601d\u601e\u601f\u6020\u6021\u6022\u6023\u6001\u6024\u6025\u6026\u6002\u6027\u6028\u6029\u602a\u602b\u602c\u602d\u602e\u602f\u6030\u6031\u6032\u6033\u6034\u6035\u6036\u6037\u6038\u6039\u603a\u603b\u603c\u603d\u603e\u603f\u6040\u6041\u6042\u6043\u6044\u6045\u6046\u6047\u6048\u6049\u604a\u604b\u604c\u604d\u604e\u604f\u6050\u6051\u6052\u6053\u6054\u6055\u6056\u6057\u6058\u6059\u605a\u605b\u605c\u605d\u605e\u605f\u6060\u6061\u6062\u6063\u6064\u6065\u6066\u6067\u6068\u6069\u606a\u606b\u606c\u606d\u606e\u606f\u608d\u608e\u608f\u6090\u6091\u6092\u6093\u6070\u6094\u6095\u6096\u6097\u6098\u6099\u609a\u609b\u609c\u609d\u609e\u609f\u60a0\u60a1\u60a2\u60a3\u60a4\u60a5\u60a6\u60a7\u60a8\u60a9' + '\u60aa\u60ab\u60ac\u60ad\u60ae\u60af\u60b0\u60b1\u60b2\u60b3\u60b4\u60b5\u60b6\u60b7\u60b8\u60b9\u60ba\u60bb\u60bc\u60bd\u60be\u60bf\u60c0\u60c1\u60c2\u60c3\u60c4\u60c5\u60c6\u60c7\u60c8\u60c9\u60ca\u60cb\u60cc\u60cd\u60ce\u60cf\u60d0\u60d1\u60d2\u60d3\u60d4\u60d5\u60d6\u60d7\u6071\u60d8\u60d9\u60da\u60f2\u60f3\u60f4\u60f5\u60f6\u60f7\u60f8\u60f9\u60fa\u60fb\u60fc\u60fd\u60fe\u60ff\u6100\u6101\u6102\u6103\u6104\u6105\u6106\u6107\u6108\u6109\u610a\u610b\u610c\u610d\u610e\u610f\u6110\u6111\u6112\u6113\u6114\u6115\u6116\u6117\u6118\u6119\u611a\u611b\u611c\u611d\u611e\u611f\u6120\u6121\u6122\u6123\u6124\u60db\u6125\u6126\u6127\u6128\u6129\u612a\u612b\u612c\u612d\u612e\u612f\u6130\u6131\u6132\u60dc\u6133\u6134\u6135\u6136\u6137\u6138\u6139\u613a\u6152\u6153\u6154' + '\u6155\u6156\u6157\u6158\u6159\u615a\u615b\u615c\u615d\u615e\u615f\u6160\u6161\u6162\u6163\u6164\u6165\u6166\u6167\u6168\u6169\u616a\u616b\u616c\u616d\u616e\u616f\u6170\u6171\u6172\u6173\u6174\u6175\u6176\u6177\u6178\u6179\u617a\u617b\u617c\u617d\u617e\u617f\u618d\u618e\u618f\u6190\u6191\u6192\u6193\u6194\u6195\u6196\u6197\u6198\u6199\u619a\u619b\u619c\u619d\u619e\u619f\u61a0\u61a1\u61a2\u61a3\u61a4\u61a5\u61a6\u61a7\u61a8\u61a9\u61aa\u61ab\u61ac\u61b4\u61b5\u61b6\u61b7\u61b8\u61b9\u61ba\u61bb\u61bc\u61bd\u61be\u61bf\u61c0\u61c1\u61c2\u61c3\u61c4\u61c5\u61c6\u61c7\u61c8\u61c9\u61ca\u61cb\u61cc\u61cd\u61ce\u61cf\u61dd\u61de\u61df\u61e0\u61d0\u61e1\u61d1\u61e2\u61e3\u61e4\u61e5\u61e6\u61e7\u61e8\u61e9\u61ea\u6208\u61f7\u61f8\u61f9\u61fa\u61fb\u61fc\u61fd\u61fe' + '\u61ff\u6200\u6201\u6202\u6203\u6204\u6209\u620a\u620b\u620c\u620d\u620e\u6205\u620f\u6210\u6213\u6214\u6215\u6216\u621b\u621c\u621d\u621e\u621f\u6220\u6221\u6222\u6223\u6224\u6225\u6227\u6228\u6229\u622a\u622b\u622f\u622c\u6230\u6231\u6232\u6237\u6238\u6239\u6240\u6241\u6242\u6243\u6244\u6245\u6246\u624d\u624e\u624f\u6250\u6251\u6252\u6253\u6258\u6259\u625a\u625b\u625c\u625d\u625e\u6265\u6266\u6267\u6268\u6269\u626a\u626b\u626c\u626d\u6274\u6275\u6276\u6277\u6278\u627c\u627d\u627e\u627f\u6280\u6281\u6284\u6285\u6286\u6287\u6288\u6289\u628a\u628d\u628e\u628f\u6294\u6295\u6296\u6299\u629d\u629f\u62a0\u62a2\u62a5\u62a6\u62a7\u62a8\u62a9\u62aa\u62ae\u62af\u62b0\u62b1\u62b4\u62b5\u62b6\u62b7\u62b8\u62ba\u62bb\u62bc\u62bd\u62bf\u62c0\u62c1\u62c3\u62c4\u62c5\u62c6' + '\u62c7\u62c8\u62cd\u62ce\u62cf\u62d0\u62d1\u62d2\u62d6\u62d7\u62d8\u62d9\u62dc\u62dd\u62de\u62df\u62e0\u62e1\u62e2\u62e3\u62e6\u62e7\u62e8\u62e9\u62ea\u62eb\u62ec\u62f3\u62f4\u62fa\u62fb\u62fc\u62fd\u62fe\u6303\u6304\u6305\u6306\u6307\u630a\u630b\u630c\u630d\u630e\u6312\u6313\u6314\u6316\u6317\u6318\u631c\u631e\u6320\u6322\u6323\u6324\u6327\u6328\u6329\u632a\u632c\u632d\u6331\u6332\u6333\u6334\u6335\u6337\u6338\u633a\u633b\u633c\u633d\u6343\u6344\u6345\u6346\u6347\u6348\u6349\u634a\u634b\u634c\u634d\u634e\u634f\u6350\u6351\u6352\u6354\u6355\u6356\u6358\u6359\u635a\u635b\u6361\u6362\u6364\u6365\u6366\u6367\u6368\u6369\u636a\u636b\u636c\u636e\u636f\u6370\u6371\u6379\u637a\u637b\u637c\u637d\u637e\u637f\u6380\u6385\u6386\u6387\u6388\u6389\u638a\u638b\u6391\u6398' + '\u6399\u639a\u639b\u639c\u639d\u639e\u639f\u63a0\u63a6\u63a7\u63a8\u63a9\u63ac\u63ae\u63af\u63b1\u63b2\u63b3\u63b4\u63b5\u63b7\u63b8\u63b9\u63ba\u63bb\u63bc\u63bd\u63be\u63bf\u63c0\u63c2\u63c3\u63c4\u63c5\u63c6\u63c7\u63c8\u63c9\u63ca\u63cb\u63cc\u63cd\u63ce\u63cf\u63d1\u63d2\u63d3\u63d4\u63d5\u63d6\u63d7\u63d8\u63dc\u63dd\u63df\u63e0\u63e1\u63e2\u63de\u63e4\u63e5\u40f0\u63e6\u63e7\u63e8\u63e9\u63ea\u63eb\u63ec\u63ed\u63ee\u63ef\u63f0\u63f1\u63f6\u63f7\u63f8\u63f9\u63fa\u63fb\u63fc\u63fd\u63fe\u63ff\u6400\u6401\u6402\u6403\u6404\u6405\u6406\u6407\u6408\u6409\u640a\u640b\u640c\u640d\u640e\u640f\u6410\u6414\u6415\u6416\u6417\u6418\u6419\u641a\u641b\u641c\u641d\u641e\u641f\u6420\u6421\u6422\u6423\u6424\u6425\u6426\u6427\u6428\u6429\u642a\u642b\u642c\u642d\u642e' + '\u642f\u6430\u6431\u6432\u6433\u6434\u6435\u6436\u6437\u6438\u6439\u643a\u643b\u643c\u643d\u643e\u643f\u6440\u6441\u6442\u6443\u6444\u6445\u6446\u6447\u6448\u6449\u644a\u644b\u644c\u644d\u644e\u644f\u6450\u6451\u6452\u6453\u6454\u6455\u6456\u6457\u6458\u6459\u6465\u6466\u6467\u6468\u6469\u646a\u646b\u646c\u646d\u646e\u646f\u6470\u6471\u6472\u6473\u6474\u6475\u6476\u6477\u6478\u6479\u647a\u647b\u647c\u647d\u647e\u647f\u6480\u6481\u6482\u6483\u6484\u6485\u6486\u6487\u6488\u6489\u648a\u648b\u648c\u648d\u648e\u648f\u6490\u6491\u6492\u6493\u64c2\u6494\u6495\u6496\u6497\u6498\u6499\u649a\u649b\u649c\u649d\u649e\u649f\u64a0\u64a1\u64a2\u64a3\u64a4\u64a5\u64a6\u64a7\u64a8\u64a9\u64aa\u64ab\u64ac\u64ad\u7396\u64ae\u64af\u64b0\u64b1\u64b2\u64b3\u64b4\u64b5\u64b6\u64c3' + '\u64c4\u64c5\u64c6\u64c7\u64c8\u64c9\u64ca\u64cb\u64cc\u64cd\u64ce\u64cf\u64d0\u6526\u64d1\u64d2\u64d3\u64d4\u64d5\u64d6\u64d7\u64d8\u6527\u64d9\u64da\u64db\u64dc\u64dd\u64de\u64df\u64e0\u64e1\u64e2\u64e3\u64e4\u64e5\u64e6\u64e7\u64e8\u64e9\u64ea\u64eb\u64ec\u64ed\u64ee\u64ef\u64f0\u64f1\u64f2\u64f3\u64f4\u64f5\u64f6\u64f7\u64f8\u64f9\u64fa\u64fb\u64fc\u64fd\u64fe\u64ff\u6500\u6501\u6502\u6503\u6504\u6505\u6506\u6507\u6508\u6509\u650a\u650b\u650c\u650d\u650e\u650f\u6510\u6511\u6512\u6513\u6514\u6515\u6516\u6517\u6528\u6529\u652a\u652b\u652c\u652d\u652e\u652f\u6530\u6531\u6532\u6533\u6534\u6535\u6536\u6537\u6538\u6539\u653a\u653b\u653c\u653d\u653e\u653f\u6540\u6541\u6542\u6543\u6544\u6545\u6546\u6547\u6548\u6549\u654a\u654b\u654c\u654d\u654e\u654f\u6550\u6551' + '\u6552\u6553\u6554\u6555\u6556\u6557\u6558\u6559\u655a\u655b\u655c\u655d\u655e\u655f\u6560\u6561\u6562\u6563\u6564\u6565\u6566\u6567\u6568\u6569\u656a\u658b\u656b\u656c\u656d\u656e\u656f\u6570\u6571\u6572\u6573\u6574\u6575\u6576\u6577\u6578\u6579\u657a\u658c\u658d\u658e\u658f\u6590\u6591\u6592\u6593\u6594\u6595\u6596\u6597\u6598\u6599\u659a\u659b\u659c\u659d\u659e\u659f\u65a0\u65a1\u65a2\u65a3\u65a4\u65a5\u65a6\u65a7\u65a8\u65a9\u65aa\u65ab\u65ac\u65ad\u65ae\u65af\u65b0\u65b1\u65b2\u65b3\u65b4\u65b5\u65b6\u65b7\u65b8\u65b9\u65ba\u65bb\u65bc\u65bd\u65be\u65bf\u65c0\u65c1\u65c2\u65c3\u65c4\u65c5\u65c6\u65c7\u65c8\u65c9\u65ca\u65cb\u65cc\u65cd\u65ce\u65cf\u65d0\u65d1\u65d2\u65d3\u65d4\u65d5\u65d6\u65d7\u65d8\u65d9\u65da\u65db\u65dc\u65dd\u65de\u65df\u65e0\u65e1' + '\u65e2\u65e3\u65e4\u6616\u65e5\u65e6\u65e7\u65e8\u65e9\u65ea\u65eb\u65ec\u65ed\u65ee\u65ef\u65f0\u65f1\u65f2\u65f3\u65f4\u65f5\u65f6\u65f7\u65f8\u6617\u6618\u65f9\u6619\u661a\u661b\u661c\u661d\u661e\u661f\u6620\u6621\u6622\u6623\u6624\u6625\u6626\u6627\u6628\u6629\u662a\u662b\u662c\u662d\u662e\u662f\u6630\u6631\u6632\u6633\u6634\u6635\u6636\u6637\u6638\u6639\u663a\u663b\u663c\u663d\u663e\u663f\u6640\u6641\u6642\u6643\u6644\u6645\u6646\u6647\u6648\u6649\u664a\u664b\u664c\u664d\u664e\u664f\u6650\u6651\u6652\u6653\u6654\u6655\u6656\u6657\u6658\u6659\u665a\u665b\u665c\u665d\u665e\u665f\u6660\u6661\u6662\u6663\u6664\u6665\u6666\u6667\u6668\u6669\u666a\u666b\u666c\u666d\u666e\u666f\u6670\u6671\u65fa\u6672\u6673\u6674\u6675\u6676\u6677\u6678\u6679\u667a\u667b\u667c' + '\u667d\u667e\u667f\u6680\u6681\u6682\u6683\u6684\u6685\u6686\u6687\u6688\u6689\u66a3\u66a4\u66a5\u66a6\u66a7\u66a8\u66a9\u66aa\u66ab\u66ac\u66ad\u66ae\u66af\u66b0\u66b1\u66b2\u66b3\u66b4\u66b5\u66b6\u66b7\u66b8\u66b9\u66ba\u66bb\u66bc\u66bd\u66be\u66bf\u66c0\u66c1\u66c2\u66c3\u66c4\u66c5\u66c6\u66c7\u66c8\u66c9\u66ca\u66cb\u66cc\u66cd\u66ce\u66cf\u66d0\u66d1\u66d2\u66d3\u66d4\u66d5\u66d6\u66d7\u66d8\u66d9\u66da\u66db\u66dc\u66dd\u66de\u66df\u66e0\u668a\u6715\u66e1\u66e2\u66e3\u66e4\u66e5\u66e6\u66e7\u66e8\u66e9\u66ea\u66eb\u66ec\u66ed\u6716\u66ee\u66ef\u66f0\u668b\u66f1\u66f2\u66f3\u66f4\u66f5\u66f6\u66f7\u66f8\u66f9\u66fa\u66fb\u66fc\u6717\u6718\u6719\u671a\u671b\u671c\u671d\u671e\u671f\u6720\u6721\u6722\u6723\u6724\u6725\u6726\u6727\u6728\u6729\u672a\u672b' + '\u672c\u672d\u672e\u672f\u6730\u6731\u6732\u6733\u6734\u6735\u6736\u6785\u6737\u6738\u6739\u673a\u673b\u673c\u673d\u66fd\u673e\u673f\u6740\u6741\u6742\u6743\u6744\u6745\u6746\u6747\u6748\u6749\u674a\u674b\u674c\u674d\u674e\u674f\u6750\u6751\u6752\u6753\u6754\u6755\u6756\u6757\u6758\u6759\u675a\u675b\u675c\u675d\u675e\u675f\u6760\u6761\u6762\u6763\u6764\u6765\u6766\u6786\u6767\u6768\u6769\u676a\u676b\u676c\u676d\u676e\u676f\u6770\u6771\u6772\u6773\u6774\u6775\u6776\u6787\u6788\u6789\u678a\u678b\u678c\u678d\u678e\u678f\u6790\u6791\u6792\u6793\u6794\u6795\u6796\u6797\u6798\u6799\u679a\u679b\u679c\u679d\u679e\u679f\u67a0\u67a1\u67a2\u67a3\u67a4\u67a5\u67a6\u67a7\u67a8\u67a9\u67aa\u67ab\u67ac\u67ad\u67ae\u67af\u67b0\u67b1\u67b2\u67b3\u67b4\u67b5\u67b6\u67b7\u67b8' + '\u6833\u67b9\u67ba\u67bb\u67bc\u67bd\u67be\u67bf\u67c0\u67c1\u67c2\u67c3\u67c4\u67c5\u67c6\u67c7\u67c8\u67c9\u67ca\u67cb\u67cc\u67cd\u67ce\u67cf\u67d0\u67ea\u67d1\u67d2\u67d3\u67d4\u67eb\u67ec\u67ed\u67ee\u67ef\u67f0\u67f1\u67f2\u67f3\u67f4\u67f5\u67f6\u67f7\u67f8\u67f9\u67fa\u67fb\u67fc\u67fd\u67fe\u67ff\u6800\u6801\u6802\u6803\u6804\u6805\u6806\u6807\u6808\u6809\u680a\u680b\u680c\u680d\u680e\u680f\u6810\u6811\u6812\u6813\u6814\u6815\u6816\u6817\u6818\u6819\u681a\u681b\u681c\u67d5\u681d\u681e\u681f\u6834\u6835\u6820\u6836\u6837\u6838\u6839\u683a\u683b\u683c\u683d\u683e\u683f\u6840\u6841\u6842\u6843\u6844\u6845\u6846\u6847\u6848\u6849\u684a\u684b\u684c\u684d\u684e\u684f\u6850\u6851\u6888\u6852\u6853\u6854\u6855\u6856\u6865\u6866\u6867\u6868\u6869\u686a\u686b' + '\u686c\u686d\u686e\u686f\u6870\u6871\u6872\u6873\u6874\u6875\u6876\u6877\u6878\u6879\u687a\u687b\u687c\u687d\u687e\u687f\u6880\u6889\u688a\u688b\u688c\u688d\u688e\u688f\u6890\u6891\u6892\u6893\u6894\u6895\u6896\u6897\u6898\u6899\u689a\u689b\u689c\u689d\u689e\u689f\u68a0\u68a1\u68a2\u68ab\u68ac\u68ad\u68ae\u68af\u68b0\u68b1\u68b2\u68b3\u68b4\u68b5\u68b6\u68b7\u68b8\u68b9\u68ba\u68bb\u68bc\u68bd\u68c4\u68c5\u68c6\u68c7\u68c8\u68c9\u68ca\u68cb\u68cc\u68cd\u68ce\u68cf\u68f3\u68d0\u68d1\u68d9\u68da\u68db\u68dc\u68dd\u68de\u68df\u68e0\u68e3\u68e4\u68e5\u68e6\u68ea\u68eb\u68ec\u68ed\u68ee\u68f1\u68f2\u68f4\u68f5\u68f6\u68f8\u68f9\u68fa\u68fb\u68fc\u68fd\u68fe\u68ff\u6900\u6901\u6902\u6903\u6904\u6908\u6909\u690a\u690b\u690c\u690d\u690e\u690f\u6910\u6911\u6912\u6913' + '\u6914\u6918\u6919\u691a\u691b\u691c\u691d\u6905\u691e\u691f\u6920\u6921\u6922\u6923\u6924\u6925\u6926\u6927\u6928\u6929\u692a\u692b\u692c\u692d\u692e\u692f\u6930\u6931\u6932\u6933\u6934\u693a\u693b\u693c\u693d\u693e\u693f\u6940\u6941\u6942\u6943\u6944\u6945\u6946\u6947\u6948\u6949\u694a\u694b\u694c\u694d\u694e\u694f\u6950\u6951\u6952\u6953\u6954\u6955\u6956\u6957\u6958\u6959\u695a\u695b\u695c\u695d\u695e\u6967\u6968\u6969\u696a\u696b\u696c\u696d\u696e\u696f\u6970\u6971\u6972\u6973\u6974\u6975\u6976\u6977\u6978\u6979\u697a\u697b\u697c\u697d\u697e\u697f\u6980\u6981\u6982\u6983\u6984\u6985\u6986\u6987\u6988\u6989\u698a\u698b\u698c\u698d\u698e\u698f\u6990\u6991\u6998\u6999\u699a\u699b\u699c\u699d\u699e\u699f\u69a0\u69a1\u69a2\u69a3\u69a4\u69a5\u69a6\u69a7\u69a8' + '\u69a9\u69aa\u69ab\u69ac\u69ad\u69ae\u69af\u69b0\u69b1\u69b2\u69b3\u69b4\u69b5\u69b6\u69b7\u69b8\u69b9\u69ba\u69bb\u69bc\u69ca\u69bd\u69be\u69bf\u69c0\u69cb\u69cc\u69cd\u69ce\u69cf\u69d0\u69d1\u69d2\u69d3\u69d4\u69d5\u69d6\u69d7\u69d8\u69d9\u69da\u69db\u69dc\u69dd\u69de\u69df\u69e0\u69e1\u69e2\u69e3\u69e4\u69e5\u69e6\u69e7\u69e8\u69e9\u69ea\u69eb\u69ec\u69ed\u69ee\u69ef\u69f0\u69f1\u69f2\u6a00\u6a01\u6a02\u6a03\u6a04\u6a05\u6a06\u6a07\u6a08\u6a09\u6a0a\u6a0b\u6a0c\u6a0d\u6a0e\u6a0f\u6a10\u6a11\u6a12\u6a13\u6a14\u6a15\u6a16\u6a17\u6a18\u6a19\u6a1a\u6a1b\u6a1c\u6a1d\u6a1e\u6a1f\u6a20\u6a21\u6a22\u6a23\u6a24\u6a25\u6a26\u6a27\u6a28\u6a29\u6a2a\u6a2b\u6a2c\u69f3\u6a2d\u6a2e\u6a2f\u6a30\u6a31\u6a32\u6a33\u6a34\u6a35\u6a36\u6a4a\u6a37\u6a4b\u6a4c\u6a4d\u6a4e\u6a4f' + '\u6a50\u6a51\u6a52\u6a53\u6a54\u6a55\u6a56\u6a57\u6a58\u6a59\u6a5a\u6a5b\u6a5c\u6a5d\u6a5e\u6a5f\u6a60\u6a61\u6a62\u6a63\u6a64\u6a65\u6a66\u6a67\u6a68\u6a69\u6a78\u6a79\u6a7a\u6a7b\u6a7c\u6a7d\u6a7e\u6a7f\u6a80\u6a81\u6a82\u6a83\u6a6a\u6a84\u6a85\u6a86\u6a87\u6a88\u6a89\u6a8a\u6a8b\u6a8c\u6a8d\u6a8e\u6a8f\u6a90\u6a91\u6a92\u6a9e\u6a9f\u6aa0\u6aa1\u6aa2\u6aa3\u6aa4\u6aa5\u6aa6\u6aa7\u6aa8\u6aa9\u6aaa\u6aab\u6aac\u6aad\u6aae\u6aaf\u6ab0\u6ab1\u6ab2\u6ab3\u6ab4\u6ab5\u6ab6\u6ab7\u6ab8\u6ab9\u6aba\u6abb\u6abc\u6abd\u6abe\u6abf\u6ac0\u6ac1\u6ac2\u6ac3\u6ac4\u6ac5\u6ac6\u6ad2\u6ad3\u6ad4\u6ad5\u6ad6\u6ad7\u6ad8\u6ad9\u6ada\u6adb\u6adc\u6add\u6ade\u6adf\u6ae0\u6ae1\u6ae2\u6ae3\u6ae4\u6ae5\u6ae6\u6ae7\u6ae8\u6ae9\u6aea\u6af2\u6af3\u6af4\u6af5\u6af6\u6af7\u6af8\u6af9' + '\u6afa\u6afb\u6afc\u6afd\u6b00\u6b01\u6b02\u6b03\u6b04\u6b05\u6b06\u6b0e\u6b07\u6b08\u6b09\u6b0f\u6b10\u6b11\u6b12\u6b13\u6b14\u6b0a\u6b15\u6b16\u6b17\u6b1c\u6b1d\u6b1e\u6b20\u6b21\u6b22\u6b23\u6b24\u6b26\u6b27\u6b2a\u6b2b\u6b2c\u6b2d\u6b2f\u6b30\u6b31\u6b32\u6b33\u6b34\u6b35\u6b38\u6b39\u6b3a\u6b3b\u6b3d\u6b3e\u6b41\u6b42\u6b43\u6b44\u6b45\u6b47\u6b4a\u6b4c\u6b4e\u6b4f\u6b50\u6b52\u6b53\u6b54\u6b56\u6b58\u6b59\u6b5a\u6b5b\u6b5c\u6b5d\u6b60\u6b61\u6b65\u6b66\u6b67\u6b68\u6b69\u6b6a\u6b6b\u6b6c\u6b6d\u6b6e\u6b70\u6b71\u6b72\u6b75\u6b77\u6b7a\u6b7b\u6b7c\u6b7d\u6b7e\u6b7f\u6b81\u6b82\u6b83\u6b84\u6b85\u6b88\u6b89\u6b8a\u6b8b\u6b8c\u6b8d\u6b8e\u6b8f\u6b95\u6b96\u6b97\u6b98\u6b99\u6b9a\u6b9b\u6b9c\u6b9d\u6ba3\u6ba4\u6ba5\u6ba6\u6ba7\u6bac\u6bad\u6bae\u6baf\u6bb0' + '\u6bba\u6bb1\u6bbb\u6bbc\u6bbd\u6bbe\u6bbf\u6bc0\u6bc1\u6bc2\u6bc3\u6bc4\u6bc8\u6bc9\u6bca\u6bcb\u6bcc\u6bcd\u6bd2\u6bd3\u6bd4\u6bd5\u6bd6\u6bd7\u6bdc\u6bdd\u6bde\u6bdf\u6be5\u6be6\u6be7\u6be8\u6bec\u6bf2\u6bf3\u6bf4\u6bf5\u6bf6\u6bf7\u6bf9\u6bfa\u6bfc\u6bfe\u6bff\u6c00\u6c01\u6c02\u6c03\u6c04\u6c05\u6c06\u6c07\u6c08\u6c09\u6c0a\u6c0b\u6c0c\u6c0d\u6c0e\u6c0f\u6c10\u6c11\u6c12\u6c13\u6c14\u6c15\u6c16\u6c17\u6c18\u6c19\u6c1a\u6c1b\u6c1c\u6c22\u6c23\u6c24\u6c25\u6c26\u6c27\u6c28\u6c29\u6c2a\u6c2b\u6c2c\u6c2d\u6c2e\u6c2f\u6c30\u6c31\u6c32\u6c33\u6c34\u6c35\u6c36\u6c37\u6c42\u6c43\u6c44\u6c45\u6c46\u6c47\u6c48\u6c49\u6c4a\u6c4b\u6c4c\u6c4d\u6c4e\u6c4f\u6c50\u6c51\u6c52\u6c53\u6c54\u6c55\u6c5c\u6c5d\u6c5e\u6c5f\u6c60\u6c61\u6c62\u6c63\u6c64\u6c65\u6c66\u6c67\u6c68' + '\u6c69\u6c6a\u6c6b\u6c6c\u6c75\u6c76\u6c77\u6c78\u6c79\u6c7a\u6c7b\u6c7c\u6c7d\u6c7e\u6c7f\u6c80\u6c81\u6c82\u6c83\u6c84\u6c85\u6c86\u6c87\u6c88\u6c89\u6c8a\u6c8b\u6c8c\u6c8d\u6c8e\u6c8f\u6c90\u6c91\u6c92\u6c9d\u6c9e\u6c9f\u6ca0\u6ca1\u6ca2\u6ca3\u6ca4\u6c93\u6c94\u6ca5\u6ca6\u6ca7\u6ca8\u6ca9\u6caa\u6cab\u6cac\u6cad\u6cae\u6caf\u6cb0\u6cb1\u6cb2\u6cba\u6cbb\u6cbc\u6cbd\u6cbe\u6cbf\u6cc0\u6cb3\u6cc1\u6cc2\u6cd0\u6cc3\u6cc4\u6cc5\u6cc6\u6cc7\u6cc8\u6ce1\u6cd1\u6cd2\u6cd3\u6cd4\u6cd5\u6cd6\u6cd7\u6cd8\u6cd9\u6cda\u6ce2\u6ce3\u6ce4\u6ce5\u6ce6\u6ce7\u6ce8\u6ce9\u6cea\u6ceb\u6cec\u6ced\u6cee\u6cef\u6cf0\u6cf7\u6cf8\u6cf9\u6cfa\u6cfb\u6cfc\u6cfd\u6cfe\u6cff\u6d03\u6d04\u6d05\u6d06\u6d07\u6d08\u6d09\u6d0d\u6d0e\u6d0f\u6d10\u6d12\u6d13\u6d14\u6d17\u6d18\u6d1d\u6d1e' + '\u6d1f\u6d20\u6d21\u6d22\u6d24\u6d25\u6d26\u6d27\u6d28\u6d29\u6d2b\u6d2a\u6d2c\u6d2d\u6d2e\u6d2f\u6d30\u6d31\u6d36\u6d37\u6d38\u6d39\u6d3a\u6d3b\u6d3c\u6d3d\u6d3e\u6d3f\u6d44\u6d45\u6d46\u6d47\u6d48\u6d49\u6d4a\u6d4b\u6d4c\u6d4d\u6d4e\u6d4f\u6d50\u6d51\u6d52\u6d53\u6d54\u6d55\u6d56\u6d57\u6d58\u6d59\u6d62\u6d63\u6d64\u6d65\u6d66\u6d67\u6d68\u6d69\u6d6a\u6d6b\u6d6c\u6d6d\u6d6e\u6d6f\u6d70\u6d71\u6d72\u6d73\u6d74\u6d75\u6d76\u6d77\u6d78\u6d79\u6d7a\u6d7b\u6d7c\u6d7d\u6d7e\u6d7f\u6d80\u6d81\u6d8a\u6d8b\u6d8c\u6d8d\u6d8e\u6d8f\u6d90\u6d91\u6d92\u6d93\u6d94\u6d95\u6d96\u6d97\u6d98\u6d99\u6d9a\u6d9b\u6d9c\u6d9d\u6d9e\u6d9f\u6da0\u6da1\u6da2\u6da3\u6da4\u6da5\u6da6\u6da7\u6da8\u6da9\u6daa\u6db6\u6db7\u6db8\u6db9\u6ddd\u6dba\u6dbb\u6dbc\u6dbd\u6dbe\u6dbf\u6dc0\u6dc1' + '\u6dc2\u6dc3\u6dc4\u6dc5\u6dc6\u6dc7\u6dc8\u6dc9\u6dca\u6dab\u6dcb\u6dcc\u6dcd\u6dce\u6dcf\u6dd0\u6dd1\u6dd2\u6dd3\u6dd4\u6dde\u6ddf\u6de0\u6de1\u6de2\u6de3\u6de4\u6de5\u6de6\u6de7\u6e12\u6de8\u6de9\u6dea\u6deb\u6dec\u6ded\u6dee\u6def\u6df0\u6df1\u6df2\u6df3\u6df4\u6df5\u6df6\u6df7\u6df8\u6df9\u6dfa\u6dfb\u6dfc\u6dfd\u6dfe\u6dff\u6e00\u6e01\u6e02\u6e03\u6e04\u6e05\u6e13\u6e14\u6e15\u6e16\u6e17\u6e18\u6e19\u6e1a\u6e1b\u6e1c\u6e1d\u6e1e\u6e1f\u6e20\u6e21\u6e22\u6e23\u6e24\u6e25\u6e26\u6e27\u6e28\u6e29\u6e2a\u6e2b\u6e2c\u6e2d\u6e2e\u6e2f\u6e30\u6e31\u6e32\u6e33\u6e34\u6e35\u6e40\u6e41\u6e42\u6e43\u6e44\u6e45\u6e46\u6e47\u6e48\u6e49\u6e4a\u6e4b\u6e4c\u6e4d\u6e4e\u6e4f\u6e50\u6e51\u6e52\u6e53\u6e54\u6e55\u6e56\u6e57\u6e58\u6e5d\u6e5e\u6e5f\u6e60\u6e61\u6e62\u6e63' + '\u6e64\u6e65\u6e66\u6e67\u6e68\u6e69\u6e6a\u6e6b\u6e6c\u6e6d\u6e6e\u6e6f\u6e70\u6e7d\u6e71\u6e7e\u6e7f\u6e80\u6e81\u6e72\u6e82\u6e83\u6e84\u6e85\u6e86\u6e87\u6e88\u6e89\u6e8a\u6e8b\u6e8c\u6e8d\u6e8e\u6e8f\u6e9a\u6e90\u6e91\u6e9b\u6e9c\u6e9d\u6e9e\u6e9f\u6ea0\u6ea1\u6ea2\u6ea3\u6ea4\u6ea5\u6ea6\u6ea7\u6ea8\u6ea9\u6eaa\u6eb1\u6eb2\u6eb3\u6eb4\u6eb5\u6eb6\u6eb7\u6eb8\u6eb9\u6eba\u6ebb\u6ebc\u6ebd\u6ebe\u6ebf\u6ec0\u6ec1\u6ec2\u6ec3\u6ec4\u6ec5\u6ec6\u6ec7\u6ecc\u6ecd\u6ece\u6ecf\u6ed0\u6ed1\u6ed2\u6ed4\u6ed5\u6ed6\u6ed7\u6ed8\u6ed9\u6eda\u6edb\u6edd\u6ede\u6edf\u6ee2\u6ee3\u6ee6\u6eea\u6ef0\u6ef2\u6ef3\u6ef4\u6ef6\u6ef7\u6ef9\u6efa\u6efd\u6efe\u6eff\u6f00\u6f01\u6f02\u6f03\u6f04\u6f05\u6f08\u6f09\u6f0a\u6f10\u6f11\u6f12\u6f19\u6f1a\u6f1b\u6f1c\u6f21\u6f22\u6f23' + '\u6f24\u6f25\u6f2d\u6f2e\u6f2f\u6f30\u6f31\u6f38\u6f39\u6f3a\u6f3e\u6f3f\u6f40\u6f41\u6f42\u6f47\u6f48\u6f49\u6f4a\u6f52\u6f53\u6f54\u6f57\u6f5a\u6f5e\u6f5f\u6f60\u6f62\u6f63\u6f64\u6f65\u6f6a\u6f6b\u6f6c\u6f6d\u6f6e\u6f6f\u6f70\u6f71\u6f73\u6f76\u6f77\u6f78\u6f79\u6f7a\u6f7b\u6f7c\u6f7d\u6f7e\u6f7f\u6f80\u6f81\u6f82\u6f83\u6f84\u6f85\u6f86\u6f87\u6f88\u6f8d\u6f89\u6f8e\u6f8f\u6f90\u6f91\u6f92\u6f93\u6f94\u6f95\u6f96\u6f97\u6f98\u6f99\u6f9a\u6f9b\u6f9c\u6f9d\u6f9e\u6f9f\u6fa0\u6fa1\u6fa2\u6fa3\u6fa4\u6fa8\u6fa9\u6faa\u6fab\u6fac\u6fad\u6fae\u6faf\u6fb0\u6fb1\u6fb2\u6fb3\u715f\u6fb6\u6fb7\u6fb8\u6fb9\u6fba\u6fbb\u6fbc\u7a11\u6fbd\u6fc1\u6fc2\u6fc3\u6fc4\u6fc5\u6fc6\u6fbe\u6fd6\u6fc7\u6fc8\u6fc9\u6fcc\u6fcd\u6fce\u6fcf\u6fd0\u6fd1\u6fd7\u6fd8\u6fd9\u6fdb\u6fdc' + '\u6fe0\u6fe1\u6fe2\u6fe4\u6fe5\u6fe7\u6fea\u6feb\u6fed\u6fef\u6ff0\u6ff2\u6ff3\u6ff4\u6ff5\u6ff6\u6ff8\u6ff9\u6ffa\u6ffb\u6ffc\u6ffd\u6ffe\u6fff\u7002\u7003\u7004\u7005\u7006\u7007\u7008\u7009\u700a\u700f\u7010\u7011\u7012\u7013\u7014\u7015\u7016\u7017\u7018\u7019\u701a\u701b\u701c\u701d\u7025\u7026\u7027\u7028\u7029\u702a\u702b\u702c\u702d\u702e\u701e\u702f\u7030\u7031\u7032\u7033\u7034\u7035\u7036\u7037\u7038\u7039\u703a\u703b\u703c\u703d\u704b\u704c\u704d\u704e\u704f\u7050\u7051\u7052\u7053\u7054\u7055\u7056\u7057\u7061\u7062\u7063\u7064\u7065\u7066\u7067\u7068\u7069\u706a\u706b\u706c\u706d\u706e\u706f\u7070\u7071\u7072\u7073\u7074\u7075\u7085\u7086\u7087\u7088\u7089\u708a\u708b\u708c\u708d\u708e\u708f\u7090\u7091\u7092\u7093\u7094\u7095\u7096\u7097\u7098' + '\u7099\u709a\u709b\u709c\u709d\u709e\u709f\u70a8\u70a9\u70aa\u70ab\u70ac\u70ad\u70ae\u70af\u70b0\u70b1\u70b2\u70b3\u70b4\u70b5\u70b6\u70b7\u70b8\u70b9\u70c8\u70c9\u70ca\u70cb\u70cc\u70cd\u70ba\u70ce\u70cf\u70d0\u70d1\u70d2\u70d3\u70d4\u70bb\u70d5\u70d6\u70d7\u70d8\u70e5\u70e6\u70e7\u70e8\u70e9\u70ea\u70eb\u70ec\u70ed\u70ee\u70ef\u70f0\u70f1\u70f2\u70f3\u70f4\u70f5\u70f6\u70f7\u70f8\u7101\u7102\u7103\u7104\u7105\u7106\u7107\u7108\u7109\u710a\u70f9\u710b\u710c\u710d\u710e\u7111\u7112\u7113\u7114\u7115\u7116\u7117\u7118\u7119\u711a\u711b\u711c\u711d\u711e\u711f\u7120\u7127\u7128\u7129\u712e\u712a\u712f\u7130\u7131\u7133\u7134\u7135\u7136\u7137\u713b\u713c\u713d\u713f\u7140\u7142\u7143\u7146\u7147\u7149\u714a\u714b\u714c\u714d\u714e\u714f\u7150\u7151\u7152\u7153' + '\u7154\u7155\u7156\u7157\u7159\u715a\u715b\u715c\u715d\u7160\u7161\u7162\u7163\u7164\u7166\u7167\u7168\u7169\u716c\u716d\u716e\u716f\u7170\u7171\u7172\u7173\u7177\u7178\u7179\u717a\u717b\u717d\u717e\u717f\u7181\u7182\u7183\u7184\u7185\u7186\u7187\u7188\u718a\u718b\u718c\u718e\u7190\u7191\u7195\u7196\u7199\u719c\u719d\u719f\u71a3\u71a4\u71a5\u71a6\u71a9\u71ac\u71ae\u71af\u71b1\u71b3\u71b4\u71b5\u71b6\u71b8\u71b9\u71ba\u71bb\u71bc\u71bd\u71c0\u71c1\u71c2\u71c3\u71c4\u71c5\u71c6\u71c7\u71c8\u71cc\u71cd\u71ce\u71cf\u71d0\u71d1\u71d2\u71d6\u71d7\u71d3\u71d8\u71da\u71db\u71dc\u71df\u71e0\u71e1\u71e2\u71e4\u71e5\u71e6\u71e7\u71ea\u71eb\u71ec\u71ee\u71ef\u71f1\u71f5\u71f6\u71f9\u71fa\u71fb\u71fc\u71fd\u71fe\u7204\u7205\u7206\u7207\u7208\u7209\u720a\u720b\u720c\u720d' + '\u720e\u720f\u7210\u7211\u7212\u7213\u7214\u7215\u7216\u7217\u7218\u7219\u721a\u721b\u7226\u7227\u7228\u7229\u722a\u722b\u722c\u722d\u722e\u722f\u7230\u7231\u7232\u7233\u7234\u7235\u7236\u7237\u7238\u7239\u723a\u723b\u723c\u723d\u723e\u723f\u7240\u7241\u7242\u7243\u7244\u724e\u724f\u7250\u7251\u7252\u7253\u7254\u7255\u7256\u7257\u7258\u7259\u725a\u725b\u725c\u725d\u725e\u725f\u7245\u7269\u7260\u726a\u726b\u726c\u726d\u726e\u726f\u7270\u7271\u7272\u7273\u7274\u7275\u7276\u7277\u7278\u7279\u728d\u728e\u728f\u7290\u7291\u7292\u7293\u7294\u7295\u7296\u7297\u7298\u7299\u729a\u729b\u72b1\u729c\u729d\u729e\u729f\u72a0\u72a1\u72a2\u72a3\u72a4\u72a5\u72a6\u72a7\u72b2\u72b3\u72b4\u72b5\u72b6\u72b7\u72b8\u72b9\u72ba\u72bb\u72bc\u72bd\u72be\u72bf\u72c0\u72c1\u72c2\u72c3' + '\u72c4\u72c5\u72c6\u72c7\u72c8\u72c9\u72ca\u72d8\u72d9\u72da\u72db\u72dc\u72dd\u72de\u72df\u72e0\u72e1\u72e2\u72e3\u72e4\u72f0\u72f1\u72f2\u72f3\u72f4\u72f5\u72f6\u72f7\u72f8\u72f9\u72fa\u72fb\u72fc\u72fd\u72fe\u72ff\u7309\u730a\u730b\u730c\u730d\u730e\u730f\u7310\u7311\u7312\u7313\u7314\u7315\u7316\u7317\u7318\u7319\u731a\u731b\u731c\u7326\u7327\u7328\u7329\u732a\u732b\u732c\u732d\u732e\u732f\u7330\u7338\u7339\u733a\u733b\u733c\u733d\u733e\u733f\u7340\u7341\u7342\u7343\u7344\u7349\u734a\u734b\u734c\u7350\u7353\u7358\u7354\u7355\u7356\u7359\u735b\u735d\u735f\u7361\u7362\u7363\u736a\u736b\u736c\u736d\u736e\u736f\u7370\u7371\u7372\u7375\u7376\u7379\u737a\u737c\u737f\u7380\u7381\u7382\u7383\u7385\u7386\u7387\u7389\u738a\u738b\u738c\u738d\u738e\u738f\u7390\u7391' + '\u7392\u7393\u7397\u7398\u7399\u739a\u739b\u739c\u739d\u739e\u739f\u73a0\u73a1\u73a2\u73a3\u73a4\u73a5\u73a6\u73a7\u73a8\u73a9\u73aa\u73ab\u73ac\u73ad\u73ae\u73af\u73b0\u73b1\u73b7\u73b8\u73b9\u73ba\u73bb\u73bc\u73bd\u73be\u73bf\u73c0\u73c1\u73c2\u73c3\u73c4\u73c5\u73c6\u73c7\u73c8\u73c9\u73ca\u73cb\u73cc\u73cd\u73ce\u73cf\u73d0\u73d1\u73d2\u73d3\u73d4\u73d5\u73d6\u73d7\u73d8\u73d9\u73da\u73db\u73e7\u73e8\u73e9\u73ea\u73eb\u73ec\u73ed\u73ee\u73ef\u73f0\u73f1\u73f2\u73f3\u73f4\u73f5\u73f6\u73f7\u73f8\u73f9\u73fa\u73fb\u73fc\u73fd\u73fe\u73ff\u7400\u7409\u740a\u740b\u740c\u740d\u740e\u740f\u7410\u7411\u7412\u7413\u7414\u7415\u7416\u7417\u7418\u7419\u741a\u741b\u741c\u741d\u741e\u741f\u7420\u7421\u7422\u7423\u7424\u742c\u742d\u742e\u742f\u7430\u7431\u7462\u7432' + '\u7433\u7434\u7435\u7436\u7437\u7438\u7439\u743a\u743b\u743c\u743d\u743e\u743f\u7440\u7441\u7442\u7443\u7444\u7445\u7446\u7447\u7448\u7449\u744a\u744b\u744c\u744d\u744e\u744f\u7463\u7464\u7465\u7466\u7467\u7468\u7469\u746a\u746b\u746c\u746d\u746e\u746f\u7470\u7471\u7472\u7473\u7474\u7475\u7450\u7476\u7477\u7478\u7479\u747a\u747b\u747c\u747d\u747e\u7489\u748a\u748b\u748c\u748d\u748e\u748f\u747f\u7490\u7491\u7492\u7493\u7494\u7495\u7496\u7497\u7498\u7499\u749a\u749b\u749c\u749d\u749e\u749f\u74a0\u74a1\u74a2\u74a3\u74a4\u74a5\u74a6\u74a7\u74b1\u74b2\u74a8\u74b3\u74b4\u74b5\u74b6\u74b7\u74b8\u74b9\u74a9\u74ba\u74bb\u74bc\u74bd\u74be\u74bf\u74c0\u74c1\u74c2\u74c3\u74cc\u74cd\u74ce\u74cf\u74d0\u74d1\u74d2\u74d3\u74d4\u74d5\u74d6\u74d7\u74d8\u74d9\u74da\u74db\u74dc' + '\u74dd\u74de\u74df\u74e0\u74e1\u74e2\u74ec\u74ed\u74ee\u74ef\u74f0\u74f1\u74f2\u74f3\u74f4\u74f5\u74f6\u74f7\u74f8\u74f9\u74fa\u74fb\u74fc\u7504\u7505\u7506\u7507\u7508\u7509\u750a\u750b\u750c\u750d\u750e\u7510\u7511\u7512\u7513\u7514\u7515\u7516\u7517\u7518\u7519\u751a\u751e\u751f\u7520\u7521\u7522\u7523\u7524\u7525\u752a\u752d\u752e\u752f\u7531\u7533\u7534\u7535\u7536\u7538\u7539\u753a\u753b\u753c\u753d\u753e\u753f\u7540\u7541\u7542\u7543\u7544\u7545\u7546\u7547\u7548\u754f\u7550\u7551\u7552\u7553\u7554\u7555\u7556\u7557\u7558\u7559\u755a\u755b\u755c\u755d\u755e\u755f\u7560\u7561\u7562\u7566\u7567\u7568\u7575\u7569\u756a\u756b\u756c\u756d\u756e\u756f\u7570\u7571\u7576\u7577\u7578\u7579\u757a\u757b\u757c\u757d\u757e\u7585\u7586\u7587\u7588\u7589\u758a\u758b' + '\u758c\u758d\u758e\u758f\u757f\u7590\u7591\u759a\u759b\u759c\u759d\u759e\u759f\u75a0\u75a1\u75a2\u75a3\u75a4\u75a5\u75a6\u75a7\u75a8\u75a9\u75aa\u75ab\u75ac\u75b2\u75b3\u75b4\u75b5\u75b6\u75b7\u75b8\u75b9\u75ba\u75bb\u75be\u75bf\u75c0\u75c6\u75c7\u75c8\u75c9\u75ca\u75cc\u75cd\u75ce\u75cf\u75d3\u75d4\u75d6\u75d9\u75da\u75db\u75dc\u75dd\u75df\u75e0\u75e1\u75e2\u75e3\u75e4\u75e6\u75e7\u75e8\u75e9\u75ea\u75eb\u75ee\u75ef\u75f0\u75f1\u75f2\u75f3\u75f4\u75fb\u75fc\u75fd\u75fe\u75ff\u7600\u7601\u7602\u7603\u7604\u7605\u7606\u7607\u7610\u7611\u7612\u7613\u7614\u7615\u7616\u7617\u7618\u7619\u761a\u761b\u761c\u761d\u761e\u761f\u7620\u7621\u7622\u7623\u7624\u7625\u7626\u7627\u7628\u762d\u762e\u762f\u7630\u7631\u7632\u7633\u7634\u7635\u7636\u7637\u7638\u7639\u763a\u764d' + '\u764e\u764f\u7650\u7651\u7652\u7653\u763b\u7654\u7655\u7656\u7657\u7658\u7659\u765a\u765b\u7666\u7667\u7668\u7669\u766a\u766b\u766c\u766d\u766e\u766f\u7670\u7671\u7672\u7673\u7674\u7675\u7676\u7677\u7678\u7679\u767a\u767b\u767c\u7689\u768a\u768b\u768c\u768d\u768e\u768f\u7690\u7691\u7692\u7693\u7694\u7695\u7696\u76a4\u76a5\u76a6\u76a7\u76a8\u76a9\u76aa\u76ab\u76ac\u76ad\u76ae\u76af\u76b0\u76b1\u76b2\u76b3\u76bf\u76c0\u76c1\u76c2\u76c3\u76d3\u7697\u76c4\u76c5\u76c6\u76c7\u76c8\u76c9\u76ca\u76cb\u76d4\u76d5\u76d6\u76d7\u76d8\u76d9\u76da\u76db\u76dc\u76dd\u76de\u76df\u76e3\u76e4\u76e5\u76e6\u76e7\u76ef\u76f0\u76f1\u76f2\u76f3\u76f4\u76f5\u76f6\u76f7\u76f8\u76f9\u76fa\u7702\u7706\u7707\u7703\u7709\u770a\u770b\u770c\u770e\u770f\u7710\u7711\u7713\u7714\u7715\u7716' + '\u7717\u7718\u7719\u771a\u771f\u7720\u7721\u7722\u7723\u7724\u7725\u7726\u7727\u7728\u7729\u772d\u772e\u772f\u7730\u7731\u7732\u7733\u773b\u773c\u773d\u773e\u773f\u7740\u7741\u7742\u7748\u7749\u774a\u774b\u774c\u774d\u774e\u774f\u7750\u7751\u7756\u7757\u7758\u7759\u775a\u775b\u775e\u775f\u7760\u7761\u7762\u7763\u7764\u7768\u7769\u776a\u776b\u776c\u776d\u776e\u776f\u7770\u7777\u7778\u7779\u777a\u777b\u777c\u7784\u7785\u7788\u778b\u778d\u778e\u778f\u7791\u7793\u7794\u7795\u7796\u7799\u779a\u779b\u779c\u779d\u779e\u779f\u77a0\u77a3\u77a4\u77a5\u77a6\u77a7\u77a8\u77a9\u9dc4\u9dc5\u77ae\u77b0\u77b1\u77b2\u77b3\u77b4\u77b5\u77b8\u77b9\u77ba\u77bb\u77c0\u77c1\u77c4\u77c2\u77c3\u77c5\u77c7\u77c8\u77c9\u77cb\u77ce\u77cf\u77d0\u77d1\u77d2\u77d3\u77d4\u77d5\u77d6\u77d7' + '\u77d8\u77d9\u77da\u77db\u7827\u77dd\u77de\u77df\u77e0\u77e1\u77e2\u77e3\u77e4\u77e5\u77e6\u77e7\u77e8\u77e9\u77ea\u77eb\u77ec\u77ed\u77f5\u77f6\u77f7\u77f8\u77f9\u77fa\u77fb\u77fc\u77fd\u77fe\u77ff\u7800\u7801\u7802\u7803\u7804\u7805\u7806\u7807\u7808\u7809\u780a\u780b\u780c\u780d\u780e\u780f\u7810\u7811\u7812\u7813\u7814\u7815\u7816\u7817\u7818\u7819\u781a\u781b\u781c\u781d\u7828\u7829\u782a\u782b\u782c\u782d\u782e\u782f\u7830\u7831\u7832\u7833\u7834\u7835\u7836\u7837\u7838\u7839\u783a\u783b\u783c\u783d\u783e\u783f\u7840\u7841\u7842\u7843\u7844\u7845\u7846\u7855\u7856\u7857\u7858\u7859\u785a\u785b\u785c\u785d\u785e\u785f\u7860\u7861\u7862\u7863\u7864\u7865\u7866\u7867\u7868\u7869\u786a\u786b\u786c\u786d\u786e\u786f\u7870\u7871\u7872\u7873\u7874\u7875\u7876' + '\u7877\u7885\u7886\u7887\u7888\u7889\u788a\u788b\u788c\u788d\u788e\u788f\u7890\u7891\u7892\u7893\u7894\u7895\u7896\u7897\u7898\u7899\u789a\u789b\u789c\u789d\u789e\u789f\u78a0\u78a1\u78a2\u78a3\u78a4\u78a5\u78a6\u78a7\u78a8\u78a9\u78aa\u78ab\u78ac\u78ad\u78ae\u78af\u78bd\u78be\u78bf\u78c0\u78c1\u78c2\u78c3\u78c4\u78c5\u78c6\u78c7\u78c8\u78c9\u78ca\u78cb\u78cc\u78cd\u78ce\u78cf\u78d0\u7878\u78d1\u78d2\u78d3\u78d4\u78d5\u78d6\u78d7\u78d8\u78ff\u78d9\u78da\u78db\u78dc\u78dd\u78de\u78df\u78e0\u78e1\u78e2\u7900\u7901\u7902\u7903\u7904\u7905\u7906\u7907\u7908\u7909\u790a\u790b\u790c\u790d\u790e\u790f\u7910\u7911\u7912\u7913\u7914\u7915\u7916\u7917\u7918\u7919\u791a\u791b\u792c\u792d\u792e\u792f\u7930\u7931\u7932\u7933\u7934\u7935\u7936\u7937\u7938\u7939\u793a\u793b' + '\u793c\u793d\u793e\u793f\u7940\u7941\u7942\u7943\u7944\u7945\u7946\u7947\u7948\u7949\u794a\u794b\u794c\u791c\u794d\u794e\u794f\u791d\u7950\u7951\u7962\u7963\u7964\u7965\u7966\u7967\u7968\u7969\u796a\u796b\u796c\u796d\u796e\u796f\u7970\u7971\u7972\u7973\u7974\u7975\u7976\u7977\u7978\u7979\u797a\u797b\u797c\u7990\u7991\u7992\u7993\u7994\u7995\u7996\u7997\u7998\u7999\u799a\u799b\u799c\u799d\u799e\u799f\u79aa\u79ab\u79ac\u79ad\u79ae\u79af\u79b0\u79b1\u79b2\u79b3\u79b4\u79b5\u79b6\u79ba\u79bb\u79bc\u79bd\u79be\u79b7\u79b8\u79c7\u79c8\u79c9\u79ca\u79cb\u79cc\u79cd\u79ce\u79cf\u79d0\u79d1\u79d6\u79d7\u79d8\u79d9\u79da\u79db\u79dc\u79e2\u79e0\u79e3\u79e4\u79e5\u79e6\u79e7\u79e8\u79eb\u79ed\u79ee\u79ef\u79f0\u79f1\u79f3\u79f4\u79f5\u79f6\u79f7\u79f8\u79f9\u79fa\u79fb' + '\u79fc\u79fd\u79fe\u7a00\u7a01\u7a02\u7a03\u7a04\u7a05\u7a06\u7a07\u7a08\u7a09\u7a0a\u7a0b\u7a0c\u7a0d\u7a0e\u7a12\u7a13\u7a14\u7a15\u7a16\u7a17\u7a18\u7a19\u7a1a\u7a1b\u7a1c\u7a1d\u7a23\u7a24\u7a25\u7a26\u7a27\u7a1e\u7a28\u7a29\u7a2a\u7a2b\u7a2c\u7a2d\u7a2e\u7a2f\u7a30\u7a31\u7a38\u7a39\u7a3a\u7a3b\u7a3c\u7a3d\u7a3e\u7a3f\u7a47\u7a48\u7a49\u7a4a\u7a4b\u7a4c\u7a4d\u7a4e\u7a4f\u7a50\u7a40\u7a51\u7a58\u7a59\u7a5a\u7a5b\u7a5c\u7a5d\u7a5e\u7a5f\u7a60\u7a61\u7a62\u7a63\u7a64\u7a6c\u7a6d\u7a6e\u7a6f\u7a70\u7a71\u7a72\u7a73\u7a74\u7a75\u7a7a\u7a7b\u7a7c\u7a7d\u7a7e\u7a7f\u7a80\u7a81\u7a82\u7a83\u7a8c\u7a8d\u7a8e\u7a8f\u7a90\u7a84\u7a98\u7a99\u7a9a\u7a9b\u7a9c\u7aa0\u7aa1\u7aa2\u7aa7\u7aa5\u7aa8\u7aa9\u7aab\u7aae\u7ab1\u7ab2\u7ab3\u7ab4\u7ab5\u7ab6\u7ab7\u7ab8\u7ab9' + '\u7abb\u7abc\u7abd\u7abe\u7abf\u7ac0\u7ac1\u7ac2\u7ac3\u7ac4\u7ac9\u7aca\u7acb\u7acc\u7acd\u7ace\u7acf\u7ad0\u7ad1\u7ad2\u7ad3\u7ad4\u7ad5\u7ad6\u7ad7\u7ad8\u7ad9\u7ada\u7adb\u7adc\u7add\u7ade\u7adf\u7ae0\u7ae1\u7ae2\u7ae3\u7ae4\u7ae5\u7ae6\u7af5\u7af6\u7af7\u7af8\u7af9\u7afa\u7afb\u7afc\u7afd\u7afe\u7aff\u7b00\u7b01\u7b02\u7b03\u7b04\u7b05\u7b06\u7b07\u7b08\u7b09\u7b0a\u7b0b\u7b0c\u7b0d\u7b0e\u7b0f\u7b10\u7b11\u7b12\u7b13\u7b14\u7b15\u7b16\u7b17\u7b18\u7b19\u7b27\u7b28\u7b29\u7b2a\u7b2b\u7b2c\u7b2d\u7b2e\u7b2f\u7b30\u7b31\u7b32\u7b33\u7b34\u7b5b\u7b35\u7b36\u7b37\u7b38\u7b39\u7b3a\u7b3b\u7b3c\u7b3d\u7b3e\u7b3f\u7b40\u7b41\u7b42\u7b43\u7b44\u7b45\u7b46\u7b47\u7b48\u7b49\u7b4a\u7b4b\u7b4c\u7b4d\u7b4e\u7b4f\u7b50\u7b5c\u7b5d\u7b5e\u7b5f\u7b60\u7b61\u7b62\u7b63' + '\u7b64\u7b65\u7b66\u7b67\u7b68\u7b69\u7b6a\u7b6b\u7b6c\u7b6d\u7b6e\u7b6f\u7b70\u7b71\u7b72\u7b73\u7b74\u7b75\u7b76\u7b77\u7b78\u7b79\u7b7a\u7b7b\u7b7c\u7b7d\u7b7e\u7b7f\u7b89\u7b8a\u7b8b\u7b8c\u7b8d\u7b8e\u7b8f\u7b90\u7b91\u7b92\u7b93\u7b94\u7b95\u7b96\u7b97\u7b98\u7b99\u7b9a\u7b9b\u7b9c\u7b9d\u7b9e\u7b9f\u7ba0\u7ba1\u7ba2\u7ba3\u7ba4\u7ba5\u7ba6\u7ba7\u7ba8\u7ba9\u7baa\u7bab\u7bac\u7bad\u7bae\u7baf\u7bb0\u7bb1\u7bb2\u7bb3\u7bb4\u7bb5\u7bb6\u7bb7\u7bb8\u7bb9\u7bba\u7bbb\u7bbc\u7b80\u7bbd\u7bbe\u7bcd\u7bbf\u7bc0\u7bce\u7bcf\u7bd0\u7bd1\u7bd2\u7bd3\u7bd4\u7bd5\u7bd6\u7bd7\u7bd8\u7bd9\u7bda\u7bdb\u7bdc\u7bdd\u7bde\u7bdf\u7be0\u7be1\u7be2\u7be3\u7be4\u7be5\u7be6\u7be7\u7be8\u7be9\u7bea\u7beb\u7bec\u7bed\u7bee\u7bef\u7bf0\u7bf1\u7bf2\u7bf3\u7bf4\u7bf5\u7bf6\u7bf7' + '\u7bf8\u7bf9\u7bfa\u7bfb\u7bfc\u7bfd\u7bfe\u7bff\u7c12\u7c13\u7c14\u7c15\u7c16\u7c17\u7c18\u7c19\u7c1a\u7c1b\u7c1c\u7c1d\u7c1e\u7c1f\u7c20\u7c21\u7c22\u7c23\u7c24\u7c25\u7c26\u7c27\u7c28\u7c29\u7c2a\u7c2b\u7c2c\u7c2d\u7c2e\u7c2f\u7c30\u7c31\u7c32\u7c3a\u7c3b\u7c3c\u7c3d\u7c3e\u7c3f\u7c40\u7c41\u7c42\u7c43\u7c44\u7c45\u7c46\u7c47\u7c48\u7c49\u7c4a\u7c4b\u7c4c\u7c4d\u7c4e\u7c4f\u7c50\u7c51\u7c52\u7c53\u7c54\u7c55\u7c56\u7c57\u7c58\u7c67\u7c59\u7c5a\u7c88\u7c5b\u7c5c\u7c68\u7c69\u7c6a\u7c6b\u7c6c\u7c6d\u7c6e\u7c6f\u7c70\u7c71\u7c72\u7c73\u7c74\u7c75\u7c76\u7c77\u7c78\u7c79\u7c7a\u7c7b\u7c7c\u7c7d\u7c7e\u7c7f\u7c89\u7c80\u7c8a\u7c8b\u7c8c\u7c8d\u7c8e\u7c8f\u7c90\u7c91\u7c92\u7c81\u7c93\u7c94\u7c95\u7c96\u7c97\u7c98\u7c99\u7c9a\u7c9b\u7ca3\u7ca4\u7ca5\u7ca6\u7ca7' + '\u7ca8\u7ca9\u7caa\u7cab\u7cb1\u7cb2\u7cb3\u7cb4\u7cb5\u7cb6\u7cb7\u7cb8\u7cb9\u7cba\u7cbb\u7cbc\u7cbd\u7cc0\u7cc1\u7cc6\u7cc7\u7cc8\u7cc9\u7ccb\u7cd0\u7cd1\u7cd2\u7cd3\u7cd6\u7cd7\u7cd9\u7cda\u7cdb\u7cdc\u7cdd\u7cde\u7cdf\u7ce0\u7ce1\u7ce2\u7ce3\u7ce4\u7ce5\u7ce6\u7ce9\u7cea\u7ceb\u7cec\u7ced\u7cee\u7cef\u7cf0\u7cf1\u7cf2\u7ce7\u7cf3\u7cf4\u7cf5\u7cf6\u7cf7\u7cf8\u7cf9\u7cfa\u7cfc\u7cfd\u7cfe\u7cff\u7d00\u7d01\u7d02\u7d03\u7d04\u7d05\u7d06\u7d07\u7d08\u7d09\u7d0a\u7d0b\u7d0c\u7d0d\u7d10\u7d11\u7d12\u7d13\u7d14\u7d15\u7d16\u7d17\u7d18\u7d19\u7d1a\u7d1b\u7d1c\u7d1d\u7d1e\u7d21\u7d22\u7d23\u7d24\u7d25\u7d26\u7d27\u7d28\u7d29\u7d2b\u7d2c\u7d2d\u7d2e\u7d2f\u7d30\u7d31\u7d32\u7d33\u7d34\u7d35\u7d36\u7d37\u7d38\u7d39\u7d3a\u7d3b\u7d3c\u7d3d\u7d3e\u7d3f\u7d40\u7d41' + '\u7d42\u7d43\u7d45\u7d46\u7d47\u7d48\u7d49\u7d4a\u7d4b\u7d4c\u7d4d\u7d4e\u7d4f\u7d50\u7d51\u7d52\u7d53\u7d54\u7d55\u7d56\u7d57\u7d58\u7d59\u7d5a\u7d5b\u7d5e\u7d5f\u7d60\u7d61\u7d62\u7d63\u7d64\u7d65\u7d66\u7d67\u7d68\u7d69\u7d6b\u7d6c\u7d6d\u7d6e\u7d6f\u7d70\u7d71\u7d72\u7d73\u7d74\u7d75\u7d76\u7d77\u7d78\u7d79\u7d7a\u7d7c\u7d7d\u7d7e\u7d7f\u7d81\u7d82\u7d85\u7d83\u7d86\u7d8d\u7d8e\u7d8f\u7d91\u7d92\u7d95\u7d97\u7d98\u7d99\u7d9a\u7d9b\u7d9c\u7d9d\u7d9e\u7d9f\u7da0\u7da1\u7da2\u7da4\u7da5\u7da6\u7da7\u7da9\u7daa\u7dab\u7dac\u7daf\u7db0\u7db1\u7db5\u7db6\u7db7\u7db8\u7db9\u7dba\u7dbb\u7dbc\u7dc0\u7dc2\u7dc3\u7dc4\u7dc7\u7dc8\u7dc9\u7dca\u7dcb\u7dcc\u7dcd\u7dce\u7dd4\u7dd5\u7dd6\u7dcf\u7dd7\u7dd8\u7dda\u7ddb\u7ddc\u7ddd\u7dde\u7ddf\u7de0\u7de1\u7de4\u7de5\u7de6' + '\u7de7\u7de8\u7dea\u7dec\u7ded\u7dee\u7def\u7df2\u7df3\u7df4\u7df7\u7df8\u7df9\u7dfa\u7dfb\u7dfc\u7dfd\u7dfe\u7dff\u7e00\u7e01\u7e09\u7e02\u7e03\u7e04\u7e05\u7e0a\u7e0b\u7e0c\u7e0d\u7e0e\u7e0f\u7e14\u7e15\u7e16\u7e1a\u7e1b\u7e1c\u7e1d\u7e1e\u7e1f\u7e20\u7e21\u7e23\u7e29\u7e2a\u7e2b\u7e2c\u7e2d\u7e2f\u7e30\u7e34\u7e35\u7e36\u7e39\u7e3a\u7e3b\u7e3c\u7e3d\u7e3e\u7e3f\u7e41\u7e42\u7e43\u7e44\u7e45\u7e46\u7e47\u7e48\u7e49\u7e4a\u7e4d\u7e4e\u7e4f\u7e50\u7e51\u7e52\u7e53\u7e54\u7e55\u7e56\u7e57\u7e58\u7e60\u7e61\u7e62\u7e63\u7e64\u7e65\u7e66\u7e67\u7e6c\u7e6d\u7e6e\u7e73\u7e74\u7e75\u7e76\u7e77\u7e78\u7e79\u7e7f\u7e80\u7e81\u7e82\u7e83\u7e84\u7e85\u7e86\u7e87\u7e88\u7e89\u7e8a\u7e8b\u7e8e\u7e8f\u7e90\u7e91\u7e92\u7e94\u7e95\u7e96\u7e97\u7e98\u7e93\u7e9c\u7e9d\u7e9e' + '\u7e9f\u7ea2\u7ea3\u7ea4\u7ea6\u7ea7\u7ea8\u7ea9\u7eaa\u7eab\u7eac\u7ead\u7eb1\u7eb2\u7eb3\u7eb4\u7eb5\u7eb6\u7eba\u7ebb\u7ebc\u7ebe\u7ebf\u7ec0\u7ec1\u7ec2\u7ec3\u7ec4\u7ec5\u7ec6\u7ec7\u7ec8\u7eca\u7ecb\u7ecc\u7ecf\u7ed0\u7ed1\u7ed7\u7ed8\u7edb\u7edc\u7edd\u7ede\u7edf\u7ee3\u7ee4\u7ee6\u7ee7\u7ee9\u7eea\u7eeb\u7eec\u7eee\u7eef\u7ef0\u7ef1\u7ef2\u7ef3\u7ef4\u7ef5\u7ef6\u7ef7\u7ef8\u7ef9\u7efa\u7efb\u7efe\u7eff\u7f00\u7f01\u7f02\u7f03\u7f04\u7f05\u7f06\u7f07\u7f08\u7f0b\u7f0c\u7f0d\u7f0e\u7f0f\u7f10\u7f11\u7f14\u7f15\u7f16\u7f17\u7f1a\u7f1b\u7f1c\u7f1d\u7f1e\u7f1f\u7f20\u7f12\u7f21\u7f22\u7f23\u7f2a\u7f2b\u7f2c\u7f2d\u7f2e\u7f2f\u7f30\u7f31\u7f35\u7f36\u7f43\u7f3a\u7f3b\u7f3c\u7f3d\u7f3e\u7f44\u7f45\u7f46\u7f47\u7f4a\u7f4b\u7f4c\u7f4d\u7f4e\u7f50\u7f51\u7f53' + '\u7f54\u7f55\u7f56\u7f57\u7f58\u7f59\u7f5a\u7f5c\u7f5d\u7f5e\u7f5f\u7f60\u7f61\u7f62\u7f63\u7f64\u7f67\u7f68\u7f69\u7f6a\u7f6b\u7f6c\u7f6d\u7f6e\u7f6f\u7f70\u7f71\u7f72\u7f73\u7f74\u7f75\u7f76\u7f77\u7f7a\u7f7b\u7f7c\u7f7d\u7f7e\u7f7f\u7f80\u7f81\u7f82\u7f83\u7f84\u7f85\u7f86\u7f87\u7f88\u7f89\u7f8a\u7f8b\u7f8c\u7f8d\u7f8e\u7f8f\u7f90\u7f91\u7f92\u7f93\u7f94\u7f95\u7f96\u7f97\u7f98\u7f99\u7f9a\u7faa\u7fab\u7fac\u7fad\u7fae\u7faf\u7fb0\u7fb1\u7fb2\u7fb3\u7fb4\u7fb5\u7fb6\u7fb7\u7fb8\u7fb9\u7fba\u7fbb\u7fbc\u7fbd\u7fbe\u7fbf\u7fc0\u7fc1\u7fc2\u7fc3\u7fc4\u7fc5\u7fc6\u7fc7\u7fc8\u7fc9\u7fca\u7fcb\u7fcc\u7fcd\u7fce\u7fcf\u7fd0\u7fd1\u7fd2\u7fd3\u7fd4\u7fde\u7fdf\u7fe0\u7fe1\u7fe2\u7fe3\u7fe4\u7fe5\u7fe6\u7fe7\u7fe8\u7fe9\u7fea\u7feb\u7fec\u7fed\u7fee\u7fef\u7ff0' + '\u7ff1\u7ff2\u7ff3\u7ff4\u7ff5\u7ff6\u7ff7\u7ff8\u7ff9\u7fd5\u7ffa\u7ffb\u7ffc\u7ffd\u7ffe\u7fff\u8000\u8001\u8002\u8003\u8004\u800e\u800f\u8010\u8011\u8012\u8013\u8014\u8015\u8016\u8017\u8018\u8019\u801a\u801b\u801c\u801d\u801e\u801f\u8020\u8021\u8022\u8023\u8024\u8025\u8026\u8027\u8028\u8029\u802a\u802b\u802c\u802d\u802e\u802f\u8030\u8031\u803f\u8040\u8041\u8042\u8043\u8044\u8045\u8046\u8047\u8048\u8049\u804a\u804b\u804c\u804d\u804e\u804f\u8050\u8051\u8052\u8053\u8054\u8055\u8056\u8057\u8058\u8059\u805a\u805b\u805c\u805d\u805e\u805f\u8060\u8075\u8076\u8077\u8078\u8079\u807a\u807b\u807c\u807d\u807e\u807f\u8080\u8081\u8082\u8083\u8084\u8085\u8086\u8087\u8088\u8089\u808a\u808b\u808c\u808d\u808e\u808f\u8090\u8091\u8092\u8093\u8094\u8095\u8096\u8097\u8098\u80a8' + '\u80a9\u80aa\u80ab\u80ac\u80ad\u80ae\u80af\u80b0\u80b1\u80b2\u80b3\u80b4\u80b5\u80b6\u80b7\u80b8\u80b9\u80ba\u80ca\u80cb\u80cc\u80cd\u80ce\u80cf\u80d0\u80d1\u80d2\u80d3\u80d4\u80d5\u80d6\u80d7\u80d8\u80d9\u80da\u80db\u5d48\u80e7\u80e8\u80e9\u80ea\u80eb\u80ec\u80ed\u80ee\u80ef\u80f0\u80f1\u80f2\u80f3\u80f4\u80f5\u80f6\u80f7\u80f8\u8102\u8103\u8104\u8105\u8106\u8107\u8108\u8109\u810a\u810b\u810c\u810d\u810e\u810f\u8110\u8111\u8112\u8113\u8114\u8115\u8116\u8117\u811c\u811d\u811e\u811f\u8120\u8121\u8122\u8127\u8128\u812e\u8129\u812a\u812f\u8130\u8131\u8132\u8135\u813b\u813c\u813e\u813f\u8140\u8141\u8142\u8143\u8145\u8146\u8147\u8148\u814a\u814b\u814c\u814d\u814e\u814f\u8150\u8151\u8152\u8153\u8154\u8156\u8157\u8158\u8159\u815a\u815c\u815d\u815e\u815f\u8160\u8161' + '\u8162\u8163\u8165\u8167\u8168\u8169\u816e\u816a\u816c\u816f\u8171\u8172\u8173\u8174\u8175\u8176\u8177\u817a\u817c\u817d\u817e\u817f\u8180\u8181\u8183\u8184\u8185\u8186\u8187\u8188\u8189\u818d\u818e\u8190\u8191\u8192\u8193\u8197\u8198\u8199\u819a\u819b\u819c\u819d\u819e\u819f\u81a0\u81a1\u81a2\u81a3\u81a6\u81a7\u81a8\u81a9\u81aa\u81ab\u81ac\u81ad\u81ae\u81af\u81b4\u81b5\u81b6\u81b7\u81bd\u81be\u81bf\u81c0\u81c1\u81c2\u81c3\u81c4\u81c5\u81c6\u81c9\u81ca\u81cb\u81cc\u81d5\u81d6\u81d7\u81d8\u81d9\u81da\u81db\u81df\u81e0\u81e1\u81e2\u81e3\u81e7\u81e8\u81e9\u81ea\u81f2\u81f3\u81f4\u81f8\u81f9\u81fa\u81fb\u81fc\u81fd\u81fe\u81ff\u8200\u8202\u8203\u8204\u8205\u8206\u8207\u8208\u8209\u820b\u820d\u820e\u8210\u8215\u8217\u8218\u8219\u821b\u821d\u821e\u821f\u8220\u8221' + '\u8222\u8223\u8224\u8228\u8229\u822a\u822b\u822c\u822d\u822e\u822f\u8230\u8231\u8232\u8233\u8234\u8235\u8236\u8237\u8238\u8239\u823a\u823b\u823c\u8242\u8243\u8244\u8245\u8246\u8247\u8248\u8249\u824a\u824b\u824c\u824d\u824e\u824f\u8250\u8251\u8252\u8253\u8254\u8255\u8256\u8257\u8258\u8259\u825a\u825b\u825c\u825d\u825e\u825f\u8260\u8261\u8262\u8263\u8264\u8265\u8266\u8267\u8268\u8286\u8269\u826a\u826b\u826c\u826d\u826e\u826f\u8270\u8271\u8272\u8273\u8274\u8275\u8276\u8277\u8278\u8287\u8288\u8289\u828a\u828b\u828c\u828d\u828e\u828f\u8290\u8291\u8292\u8293\u8294\u8295\u8296\u8297\u8298\u8299\u829a\u829b\u829c\u829d\u829e\u829f\u82a0\u82a1\u82a2\u82a3\u82a4\u82a5\u82a6\u82a7\u82a8\u82a9\u82aa\u82ab\u82ac\u82ad\u82ae\u82af\u82b0\u82b1\u82b2\u82b3\u82b4\u82b5\u82b6' + '\u82b7\u82b8\u82b9\u82ba\u82bb\u82bc\u82bd\u82be\u82bf\u82c0\u82c1\u82c2\u82c3\u82c4\u82c5\u82c6\u82c7\u82c8\u82d6\u82c9\u82ca\u82cb\u82d7\u82d8\u82d9\u82da\u82db\u82dc\u82dd\u8340\u82de\u82df\u82e0\u82e1\u82e2\u8341\u82e3\u82e4\u82e5\u82e6\u82e7\u82e8\u82e9\u82ea\u82eb\u82ec\u82ed\u82ee\u82ef\u82f0\u82f1\u82f2\u82f3\u82f4\u82f5\u82f6\u82f7\u82f8\u82f9\u82fa\u82fb\u82fc\u8279\u82fd\u82fe\u82ff\u8300\u8301\u8302\u8303\u8304\u8305\u8306\u8307\u8308\u8309\u830a\u830b\u830c\u830d\u830e\u830f\u8310\u83a4\u8311\u8312\u8313\u8314\u8315\u8316\u8317\u8318\u8319\u831a\u831b\u831c\u831d\u831e\u831f\u8320\u8321\u8322\u8323\u8324\u8325\u8326\u8327\u8328\u8329\u832a\u832b\u832c\u8342\u8343\u8344\u8345\u8346\u8347\u8348\u8349\u834a\u834b\u834c\u834d\u834e\u834f\u8350\u8351' + '\u8352\u8353\u8354\u8355\u8356\u8357\u8358\u8359\u835a\u835b\u835c\u835d\u835e\u835f\u8360\u8361\u8362\u8363\u8364\u8365\u8366\u8367\u8368\u8369\u836a\u836b\u836c\u836d\u836e\u836f\u8370\u8371\u8372\u8373\u8374\u8375\u8376\u8377\u8378\u8379\u837a\u837b\u837c\u837d\u837e\u842a\u837f\u8380\u8381\u8382\u8383\u8384\u8385\u8386\u8387\u8388\u8389\u838a\u838b\u838c\u838d\u838e\u83a5\u83a6\u83a7\u83a8\u83a9\u83aa\u83ab\u83ac\u83ad\u83ae\u83af\u83b0\u83b1\u83b2\u83b3\u83b4\u83b5\u83b6\u83b7\u83b8\u83b9\u83ba\u83bb\u83bc\u83bd\u83be\u83bf\u83c0\u83c1\u83c2\u83c3\u83c4\u83c5\u83c6\u83c7\u83c8\u83c9\u83ca\u83cb\u83cc\u83cd\u83ce\u83cf\u83d0\u83d1\u83d2\u83d3\u83d4\u83d5\u83d6\u83d7\u83d8\u83d9\u83da\u83db\u83dc\u83dd\u83de\u83df\u83e0\u83e1\u83e2\u83e3\u83e4\u83e5\u83e6' + '\u83e7\u83e8\u83e9\u83ea\u83eb\u83ec\u83ed\u83ee\u83ef\u83f0\u83f1\u83f2\u83f3\u83f4\u83f5\u83f6\u83f7\u83f8\u83f9\u83fa\u83fb\u83fc\u83fd\u83fe\u83ff\u8400\u8401\u8402\u8403\u8404\u8405\u8406\u8407\u8408\u8409\u840a\u840b\u840c\u840d\u840e\u840f\u842b\u842c\u842d\u75e5\u842e\u842f\u8430\u8431\u8432\u8433\u8434\u8435\u8436\u8437\u8438\u8439\u843a\u843b\u843c\u843d\u843e\u843f\u8440\u8441\u8442\u8443\u8444\u8445\u8446\u8447\u8448\u8449\u844a\u844b\u844c\u844d\u844e\u844f\u8450\u8451\u8452\u8453\u8454\u8455\u8456\u8457\u8410\u8458\u8459\u845a\u845b\u845c\u845d\u845e\u845f\u8460\u8461\u8462\u8463\u8464\u8465\u8466\u8467\u8468\u8469\u846a\u846b\u846c\u846d\u846e\u846f\u8470\u8471\u8472\u8473\u8474\u8475\u8476\u8477\u8478\u8479\u847a\u847b\u847c\u847d\u847e\u847f' + '\u8480\u8481\u8482\u8483\u8484\u8485\u8486\u8487\u8488\u8489\u848a\u848b\u848c\u848d\u848e\u848f\u849f\u84a0\u84a1\u84a2\u84a3\u84a4\u84a5\u84a6\u84a7\u84a8\u84a9\u84aa\u84ab\u84ac\u84ad\u84ae\u84af\u84b0\u84b1\u84b2\u84b3\u84b4\u84b5\u84b6\u84b7\u84b8\u84b9\u84ba\u84bb\u84bc\u84bd\u84be\u84bf\u84c0\u84c1\u84c2\u84c3\u84c4\u84c5\u84c6\u6a6b\u84c7\u84c8\u84c9\u84ca\u84cb\u84cc\u84cd\u84ce\u84cf\u84d0\u84d1\u84d2\u84d3\u84d4\u84d5\u84d6\u84d7\u84d8\u84d9\u84da\u84db\u84dc\u84dd\u84de\u84df\u84e0\u84e1\u84e2\u84e3\u84e4\u84e5\u84e6\u84e7\u84e8\u84e9\u84ea\u84eb\u84ec\u84ed\u84ee\u84ef\u84f0\u84f1\u84f2\u8506\u84f3\u8507\u8508\u8509\u850a\u850b\u850c\u850d\u850e\u850f\u8510\u8511\u8512\u8513\u8514\u8515\u8516\u8517\u8518\u8519\u851a\u851b\u851c\u851d\u851e\u851f' + '\u8520\u8521\u8522\u8523\u8524\u8525\u8526\u8527\u8528\u8529\u852a\u852b\u852c\u852d\u852e\u852f\u8530\u8531\u8532\u8533\u8534\u8535\u8536\u8537\u8538\u8539\u853a\u853b\u853c\u853d\u853e\u853f\u8540\u8541\u8542\u8543\u8544\u8545\u8546\u8547\u8548\u8549\u854a\u854b\u854c\u854d\u854e\u854f\u8550\u8551\u8552\u8553\u8554\u8555\u8556\u8557\u8558\u8559\u855a\u855b\u855c\u857c\u857d\u857e\u857f\u8580\u8581\u8582\u8583\u8584\u8585\u8586\u8587\u8588\u8589\u858a\u858b\u858c\u858d\u858e\u858f\u8590\u8591\u8592\u8593\u8594\u8595\u8596\u8597\u8598\u8599\u859a\u859b\u859c\u859d\u859e\u859f\u85a0\u85a1\u85a2\u85a3\u85a4\u85a5\u85a6\u85a7\u85a8\u85a9\u85aa\u85ab\u85ac\u85ad\u85ae\u85af\u85b0\u85b1\u85b2\u85b3\u85b4\u85cd\u85ce\u85cf\u85d0\u85d1\u85d2\u85d3\u85d4\u85d5\u85d6' + '\u85d7\u85d8\u85d9\u85da\u85db\u85dc\u85dd\u85de\u85df\u85e0\u85e1\u85e2\u85e3\u85e4\u85e5\u85e6\u85e7\u85e8\u85e9\u85ea\u85eb\u85ec\u85ed\u85ee\u85ef\u85f0\u85f1\u85f2\u85f3\u85f4\u85f5\u85f6\u85f7\u85f8\u85f9\u85fa\u85fb\u85fc\u85fd\u85fe\u85ff\u8613\u8600\u8601\u8602\u8614\u8603\u8615\u8616\u8617\u8618\u8619\u861a\u861b\u861c\u861d\u861e\u861f\u8620\u8621\u8622\u8623\u8624\u8625\u8626\u8627\u8628\u8629\u862a\u862b\u862c\u862d\u862e\u862f\u8630\u8631\u8632\u8633\u8634\u8635\u8636\u8637\u8638\u8639\u8647\u8648\u8649\u864a\u864b\u864c\u864d\u864e\u864f\u8650\u8651\u8652\u8653\u8654\u8655\u8656\u8657\u8658\u8659\u865a\u865b\u865c\u865d\u865e\u865f\u8660\u8670\u8661\u8662\u8663\u8664\u8665\u8666\u8667\u8671\u8672\u8673\u8674\u8675\u8676\u8677\u8678\u8679\u867a' + '\u867b\u867c\u867d\u867e\u867f\u8680\u8681\u8682\u8683\u8684\u8685\u8686\u8687\u8688\u8689\u868a\u868b\u868c\u869d\u868d\u868e\u869e\u869f\u86a0\u86a1\u86a2\u86a3\u86a4\u86a5\u86a6\u86a7\u86a8\u86a9\u86aa\u868f\u86ab\u863a\u86ac\u86ad\u86ae\u86af\u86b0\u86b1\u86b2\u86b3\u86b4\u86b5\u86b6\u86b7\u86c8\u86bd\u86be\u86bf\u86c0\u86c1\u86c2\u86c9\u86ca\u86cb\u86cc\u86cd\u86ce\u86cf\u86d0\u86d1\u86d2\u86d6\u86d7\u86d8\u86d9\u86db\u86dc\u86dd\u86de\u86e2\u86e8\u86e9\u86eb\u86ec\u86ed\u86f0\u86f2\u43c5\u86f3\u86f4\u86f9\u86fa\u86fb\u86fc\u86fd\u86fe\u8701\u8702\u8703\u8706\u8707\u870d\u870e\u870f\u8710\u8712\u8713\u8714\u8716\u8717\u8719\u871d\u871e\u871f\u8721\u8722\u8723\u8724\u8725\u8726\u8727\u8728\u8729\u872a\u872b\u872c\u872d\u872e\u872f\u8730\u8731\u8732\u8733' + '\u8734\u8735\u8736\u8737\u873b\u873c\u873d\u873e\u8793\u873f\u8740\u8741\u8742\u8743\u8744\u8745\u8746\u8747\u8748\u8749\u874a\u874b\u874c\u874d\u874e\u874f\u8750\u8751\u8752\u8753\u8754\u8755\u8756\u8757\u8758\u8759\u875a\u875b\u875c\u875d\u875e\u875f\u8760\u8765\u8761\u8766\u8767\u8768\u8769\u876a\u876b\u876c\u876d\u876e\u876f\u8770\u8771\u8772\u8773\u8774\u8775\u8776\u8777\u8778\u8779\u877a\u877b\u877c\u877d\u877e\u877f\u8780\u8781\u8782\u8783\u8784\u8785\u8786\u8787\u8788\u8794\u8795\u8796\u8797\u8798\u8799\u87c1\u879a\u879b\u879c\u879d\u879e\u879f\u87a0\u87a1\u87a2\u87a3\u87a4\u87a5\u87a6\u87a7\u87a8\u87a9\u87aa\u87ab\u87ac\u87ad\u87ae\u87af\u87b0\u87b1\u87b2\u87b3\u87b4\u87b5\u87b6\u87b7\u87c2\u87c3\u87c4\u87c5\u87c6\u87c7\u87c8\u87c9\u87ca\u87cb\u87cc' + '\u87cd\u87ce\u87cf\u87d0\u87d1\u87d2\u87d3\u87d4\u87d5\u87d6\u87d7\u87d8\u87d9\u87da\u87db\u87dc\u87dd\u87de\u87df\u87e0\u87e1\u87e2\u87e3\u87e4\u87f0\u87f1\u87f2\u87f3\u87f4\u87f5\u87f6\u87f7\u87f8\u87f9\u87fa\u87fb\u87fc\u87fd\u87fe\u87ff\u8800\u8801\u8802\u87e5\u8803\u8804\u8805\u8806\u8807\u8808\u8809\u880a\u880b\u880c\u880d\u880e\u880f\u8810\u8811\u8812\u8813\u8814\u8815\u8816\u8817\u8818\u8819\u881a\u881b\u881c\u87e6\u881d\u881e\u881f\u8820\u8821\u882f\u8830\u8831\u8832\u8833\u8834\u8835\u8836\u8837\u8838\u8839\u883a\u883b\u883c\u883d\u883e\u883f\u8840\u8841\u8842\u8843\u8844\u8845\u8846\u8847\u8848\u8849\u884a\u884b\u884c\u884d\u884e\u884f\u8850\u8851\u8852\u8853\u8854\u8855\u8856\u8857\u8858\u8859\u885a\u885b\u886f\u885c\u885d\u885e\u885f\u8860\u8861' + '\u8862\u8870\u8871\u8872\u8873\u8874\u8875\u8876\u8877\u8878\u8879\u887a\u887b\u887c\u887d\u887e\u887f\u8880\u8881\u8882\u8883\u8884\u8885\u8886\u8887\u8888\u8889\u888a\u888b\u888c\u888d\u888e\u888f\u8890\u8891\u8892\u8893\u8894\u8895\u8896\u8897\u8898\u88a2\u88a3\u88a4\u88a5\u88a6\u88a7\u88a8\u88a9\u88aa\u88ab\u88ac\u88ad\u88ae\u88af\u88b0\u88b1\u88b2\u88b3\u88b4\u88b5\u88b6\u88b7\u88b8\u88b9\u88ba\u88bb\u88bc\u88bd\u88be\u88bf\u88c0\u88c1\u88c2\u88c3\u88c4\u88c5\u88c6\u88c7\u88c8\u88c9\u88ca\u88dc\u88dd\u88de\u88df\u8899\u88e0\u88e1\u88e2\u88e3\u88e4\u88e5\u88e6\u88e7\u88e8\u8863\u88e9\u88ea\u88eb\u88ec\u88ed\u88ee\u88ef\u88f0\u88f1\u88f2\u88f3\u88f4\u88f5\u88f6\u88f7\u88f8\u88f9\u88fa\u88fb\u88fc\u8903\u8904\u8905\u8906\u8907\u8908\u8909\u890a\u890b\u890c' + '\u890d\u88cb\u890e\u890f\u8910\u8911\u8912\u8913\u8914\u8915\u8916\u8917\u8918\u8919\u88fd\u891a\u8923\u8924\u8925\u8926\u8927\u8928\u8929\u892a\u892b\u892c\u8933\u8934\u8935\u8936\u8937\u8938\u8939\u893a\u893b\u893c\u893d\u8942\u8943\u8944\u8945\u8946\u8947\u8948\u8949\u894f\u8950\u8951\u8952\u8953\u8954\u8955\u893e\u8959\u895a\u895b\u895c\u895d\u895e\u895f\u8961\u8962\u8963\u8964\u8966\u8967\u8968\u896a\u896b\u896d\u896f\u8970\u8971\u8972\u8976\u8977\u8978\u8979\u897a\u897b\u897d\u897e\u897f\u8980\u8981\u8982\u8983\u8984\u8985\u8987\u8988\u8989\u898a\u898b\u898c\u898d\u898e\u898f\u8993\u8994\u8995\u8996\u8999\u899a\u899b\u899c\u899d\u899e\u899f\u89a3\u89a4\u89a5\u89a6\u89a7\u89a8\u89a9\u89aa\u89ab\u89ac\u89ad\u89ae\u89af\u89b0\u89b1\u89b2\u89b3\u89b4\u89b5' + '\u89b6\u89b7\u89b8\u89b9\u89ba\u89bb\u89bc\u89bd\u89c1\u89c2\u89c3\u89c4\u89c5\u89c6\u89c7\u89c8\u89c9\u89ca\u89cb\u89cc\u89cd\u89ce\u89cf\u89d0\u89d1\u89d2\u89d3\u89d4\u89d5\u89d6\u89d7\u89d8\u89d9\u89da\u89db\u89dc\u89dd\u89de\u89df\u89e0\u89e1\u89e2\u89e3\u89e4\u89e5\u89e6\u89e7\u89ef\u89e8\u89f0\u89f1\u89f2\u89f3\u89f4\u89f5\u89f6\u89f7\u89f8\u89f9\u89fa\u89fb\u89fc\u89fd\u89fe\u89ff\u8a00\u8a01\u8a02\u8a03\u8a04\u8a05\u8a06\u8a07\u8a08\u8a10\u8a11\u8a12\u8a13\u8a14\u8a15\u8a16\u8a17\u8a18\u8a19\u8a1a\u8a1b\u8a1c\u8a1d\u8a1e\u8a1f\u8a20\u8a21\u8a22\u8a23\u8a24\u8a25\u8a26\u8a27\u8a28\u8a29\u8a2a\u8a2b\u8a5e\u8a30\u8a31\u8a32\u8a33\u8a34\u8a35\u8a36\u8a37\u8a38\u8a39\u8a3a\u8a3b\u8a3c\u8a3d\u8a3e\u8a3f\u8a40\u8a41\u8a42\u8a43\u8a44\u8a45\u8a46\u8a47\u8a48' + '\u8a49\u8a4a\u8a4b\u8a4c\u8a4d\u8a5f\u8a60\u8a61\u8a62\u8a63\u8a64\u8a65\u8a66\u8a67\u8a68\u8a69\u8a6a\u8a6b\u8a6c\u8a6d\u8a6e\u8a6f\u8a70\u8a71\u8a72\u8a73\u8a74\u8a75\u8a76\u8a77\u8a83\u8a84\u8a85\u8a86\u8a87\u8a88\u8a89\u8a8a\u8a8b\u8a8c\u8a8d\u8a8e\u8a8f\u8a90\u8a91\u8a92\u8a93\u8a94\u8a95\u8a96\u8a97\u8a9f\u8a98\u8aa0\u8aa1\u8aa2\u8aa3\u8aa4\u8aa5\u8aa6\u8aa7\u8aa8\u8aa9\u8aaa\u8aab\u8aac\u8aad\u8aae\u8aaf\u8ab0\u8abc\u8abd\u8abe\u8abf\u8ac0\u8ac1\u8ac2\u8ac3\u8ac4\u8ac5\u8ac6\u8ac7\u8ac8\u8ac9\u8ab1\u8aca\u8ad2\u8ad3\u8ad4\u8ad5\u8ad6\u8ad7\u8ad8\u8ad9\u8ada\u8adb\u8adc\u8add\u8ade\u8ae1\u8ae2\u8ae3\u8ae4\u8ae5\u8ae6\u8aeb\u8aec\u8aed\u8aee\u8aef\u8af0\u8af2\u8af3\u8af4\u8af5\u8af7\u8af8\u8afc\u8afd\u8afe\u8b01\u8b02\u8b03\u8b04\u8b05\u8af9\u8b08\u8b09' + '\u8b0a\u8b0b\u8b0e\u8b10\u8b11\u8b14\u8b15\u8b16\u8b17\u8b18\u8b19\u8b1a\u8b1b\u8b1d\u8b1e\u8b21\u8b22\u8b23\u8b24\u8b25\u8b26\u8b2a\u7580\u8b2b\u8b2c\u8b1c\u8b2d\u8b32\u8b33\u8b36\u8b37\u8b38\u8b39\u8b3a\u8b3d\u8b3e\u8b3f\u8b40\u8b43\u8b44\u8b45\u8b46\u8b47\u8b4c\u8b4d\u8b4e\u8b4f\u8b50\u8b54\u8b55\u8b56\u8b57\u8b5a\u8b5b\u8b5c\u8b5d\u8b5e\u8b64\u8b65\u8b66\u8b67\u8b68\u8b6a\u8b6b\u8b6c\u8b6f\u8b70\u8b71\u8b72\u8b73\u7549\u8b74\u8b75\u8b76\u8b77\u8b78\u8b79\u8b7a\u8b7b\u8b7c\u8b7d\u8b7e\u8b7f\u8b80\u8b81\u8b82\u8b83\u8b84\u8b85\u8b86\u8b88\u8b89\u8b8c\u8b8a\u8b8b\u8b8d\u8b8e\u8b8f\u8b90\u8b91\u8b92\u8b93\u8b94\u8b95\u8b99\u8b9a\u8b9b\u8b9c\u8b9e\u8b9f\u8ba0\u8ba1\u8ba7\u8ba8\u8bad\u8bae\u8bb1\u8bb4\u8bb5\u8bb9\u8bba\u8bbb\u8bbe\u8bbf\u8bc0\u8bc1\u8bc2\u8bc3' + '\u8bc5\u8bc6\u8bc7\u8bc8\u8bc9\u8bca\u8bcb\u8bcc\u8bcd\u8bd1\u8bd2\u8bd3\u8bd4\u8bd5\u8bd6\u8bd7\u8bd8\u8bd9\u8bda\u8bdb\u8bdc\u8bdd\u8bde\u8bdf\u8be0\u8be1\u8be2\u8be5\u8be6\u8be7\u8be8\u8be9\u8bea\u8beb\u8bec\u8bed\u8bee\u8bef\u8bf0\u8bf1\u8bf2\u8bf3\u8bf4\u8bf5\u8bf6\u8bf7\u8bf8\u8bf9\u8bfa\u8bfb\u8bfc\u8bfd\u8c0f\u8c10\u8c11\u8c12\u8c13\u8c14\u8c15\u8c16\u8c17\u8c18\u8c19\u8c1a\u8c1b\u8c1c\u8c1d\u8c1e\u8c1f\u8c20\u8c21\u8c22\u8c23\u8c24\u8c25\u8c26\u8c27\u8c28\u8c29\u8c2a\u8c2b\u8c2c\u8c2d\u8c2e\u8c2f\u8c30\u8c31\u8c32\u8c33\u8c34\u8c35\u8c36\u8c37\u8c38\u8c39\u8c3a\u8c3b\u8c4c\u8c4d\u8c4e\u8c4f\u8c50\u8c51\u8c52\u8c53\u8c54\u8c55\u8c56\u8c57\u8c58\u8c59\u8c5a\u8c5b\u8c5c\u8c5d\u8c5e\u8c5f\u8c60\u8c61\u8c62\u8c63\u8c64\u8c65\u8c66\u8c67\u8c68\u8c69\u8c6a' + '\u8c6b\u8c6c\u8c6d\u8c6e\u8c6f\u8c70\u8c71\u8c72\u8c73\u8c74\u8c75\u8c81\u8c82\u8c83\u8c84\u8c85\u8c86\u8c87\u8c88\u8c89\u8c8a\u8c8b\u8c8c\u8c8d\u8c8e\u8c8f\u8c90\u8c91\u8c92\u8c93\u8c94\u8c95\u8c76\u8c96\u8c97\u8c98\u8c99\u8c9a\u8c9b\u8c9c\u8c9d\u8c9e\u8c9f\u8ca0\u8ca1\u8ca2\u8ca3\u8cb0\u8cb1\u8cb2\u8cb3\u8cb4\u8cb5\u8cb6\u8cb7\u8cb8\u8cb9\u8cba\u8cbb\u8cbc\u8cbd\u8cbe\u8cbf\u8cc0\u8cc1\u8cc2\u8cc3\u8cc4\u8cc5\u8cc6\u8cc7\u8cc8\u8cc9\u8cca\u8ccb\u8ccc\u8ccd\u8cce\u8ccf\u8cd0\u8cd1\u8cd2\u8cd3\u8cd4\u8cd5\u8cd6\u8cd7\u8cd8\u8cd9\u8cda\u8cdb\u8ced\u8cee\u8cef\u8cf0\u8cf1\u8cf2\u8cf3\u8cf4\u8cf5\u8cf6\u8cf7\u8cf8\u8cf9\u8cfa\u8cdc\u8cfb\u8cfc\u8cfd\u8cfe\u8cff\u8d00\u8d01\u8d02\u8d03\u8d04\u8d05\u8d06\u8d07\u8d08\u8d09\u8d0a\u8d0b\u8d0c\u8d0d\u8d0e\u8d0f\u8d10' + '\u8d11\u8d12\u8d13\u8d14\u8d1a\u8d1b\u8d1c\u8d1d\u8d1e\u8d1f\u8d20\u8d21\u8d22\u8d23\u8d24\u8d25\u8d26\u8d27\u8d28\u8d29\u8d2a\u8d2b\u8d2c\u8d2d\u8d2e\u8d2f\u8d30\u8d31\u8d32\u8d33\u8d34\u8d35\u8d36\u8d37\u8d38\u8d3e\u8d3f\u8d40\u8d41\u8d42\u8d43\u8d44\u8d45\u8d46\u8d47\u8d48\u8d49\u8d4a\u8d4b\u8d4c\u8d4d\u8d4e\u8d4f\u8d50\u8d51\u8d52\u8d53\u8d54\u8d55\u8d56\u8d57\u8d58\u8d59\u8d62\u8d63\u8d64\u8d65\u8d66\u8d67\u8d68\u8d69\u8d6a\u8d6b\u8d6c\u8d6d\u8d6e\u8d6f\u8d87\u8d70\u8d71\u8d72\u8d73\u8d74\u8d75\u8d76\u8d77\u8d78\u8d79\u8d7a\u8d7b\u8d7c\u8d7d\u8d7e\u8d88\u8d89\u8d8a\u8d8b\u8d8c\u8d8d\u8d8e\u8d8f\u8d90\u8d91\u8d92\u8d93\u8d94\u8d95\u8d96\u8d97\u8d98\u8d99\u8d9a\u8d9b\u8d9c\u8d9d\u8da5\u8da6\u8da7\u8da8\u8da9\u8daa\u8dab\u8dac\u8dad\u8dae\u8daf\u8db6\u8db7' + '\u8db8\u8db9\u8dba\u8dbb\u8dbc\u8dbd\u8dc1\u8dc2\u8dc3\u8dc4\u8dc5\u8dc6\u8dc7\u8dc8\u8dc9\u8dca\u8dcb\u8dcd\u8dce\u8dcf\u8dd0\u8dd1\u8dd2\u8dd3\u8dd4\u8dd5\u8dd6\u8dd7\u8dd8\u8dd9\u8dda\u8ddb\u8ddc\u8ddd\u8dde\u8ddf\u8de0\u8de1\u8de2\u8de3\u8de4\u8de5\u8de6\u8de7\u8de8\u8de9\u8dea\u8deb\u8dec\u8ded\u8dee\u8def\u8df0\u8df1\u8df2\u8df3\u8df4\u8df5\u8df6\u8df7\u8df8\u8df9\u8dfa\u8dfb\u8dfc\u8dfe\u8dff\u8e00\u8e01\u8e02\u8e03\u8e04\u8e05\u8e06\u8e07\u8e08\u8e09\u8e0a\u8e0b\u8e0c\u8e0d\u8e0e\u8e0f\u8e10\u8e11\u8e12\u8e13\u8e14\u8e15\u8e16\u8e17\u8e18\u8e19\u8e1a\u8e1b\u8e1c\u8e1d\u8e1e\u8e1f\u8e20\u8e21\u8e22\u8e23\u8e24\u8e25\u8e26\u8e28\u8e29\u8e2a\u8e2b\u8e2c\u8e2d\u8e2e\u8e2f\u8e30\u8e31\u8e32\u8e33\u8e34\u8e35\u8e36\u8e37\u8e38\u8e39\u8e3a\u8e3b\u8e3c\u8e3d' + '\u8e3e\u8e3f\u8e40\u8e41\u8e42\u8e43\u8e44\u8e45\u8e46\u8e47\u8e48\u8e4a\u8e4b\u8e4c\u8e4d\u8e4e\u8e4f\u8e50\u8e51\u8e52\u8e53\u8e54\u8e55\u8e56\u8e57\u8e58\u8e59\u8e5a\u8e5b\u8e5c\u8e5d\u8e5e\u8e5f\u8e60\u8e61\u8e62\u8e63\u8e64\u8e65\u8e66\u8e69\u8e6a\u8e6b\u8e6c\u8e6d\u8e6f\u8e70\u8e71\u8e72\u8e73\u8e74\u8e75\u8e76\u8e77\u8e79\u8e7a\u8e7c\u8e7e\u8e7f\u8e80\u8e83\u8e84\u8e86\u8e88\u8e89\u8e8a\u8e8c\u8e8e\u8e8f\u8e91\u8e92\u8e94\u8e95\u8e96\u8e99\u8e9a\u8ea0\u8ea1\u8ea2\u8ea9\u8ead\u8eae\u8eb0\u8eb2\u8eb3\u8eb4\u8eb5\u8eb6\u8eb8\u8eb9\u8eba\u8ebb\u8ebc\u8ebd\u8ec0\u8ec1\u8ec2\u8ec3\u8ec5\u8ec6\u8ec7\u8ec8\u8ec9\u8ecb\u8ecc\u8ecd\u8ece\u8ed2\u8ed3\u8ed4\u8ed5\u8ed8\u8ed9\u8eda\u8edb\u8edc\u8edd\u8ede\u8ee3\u8ee0\u8ee8\u8ee9\u8eea\u8eeb\u8eec\u8eed\u8ef2\u8ef3' + '\u8ef4\u8ef5\u8ef6\u8ef7\u8efa\u8efb\u8efc\u8efd\u8efe\u8eff\u8f00\u8f01\u8f02\u8f03\u8f05\u8f06\u8f09\u8f0a\u8f0b\u8f0c\u8f0e\u8f0f\u8f10\u8f12\u8f13\u8f14\u8f17\u8f1c\u8f1d\u8f1e\u8f1f\u8f20\u8f21\u8f22\u8f23\u8f24\u8f25\u8f26\u8f27\u8f28\u8f29\u8f2a\u8f2b\u8f2c\u8f2d\u8f2e\u8f2f\u8f32\u8f33\u8f34\u8f35\u8f36\u8f37\u8f38\u8f39\u8f3a\u8f3b\u8f3c\u8f3d\u8f3e\u8f3f\u8f40\u8f41\u8f42\u8f43\u8f44\u8f4c\u8f4d\u8f4e\u8f4f\u8f50\u8f51\u8f52\u8f53\u8f54\u8f55\u8f56\u8f57\u8f58\u8f5c\u8f5d\u8f5e\u8f5f\u8f60\u8f61\u8f62\u8f63\u8f64\u8f65\u8f6a\u8f6b\u8f6c\u8f6d\u8f6e\u8f6f\u8f70\u8f71\u8f72\u8f73\u8f74\u8f75\u8f76\u8f77\u8f78\u8f79\u8f7a\u8f7b\u8f7c\u8f7d\u8f88\u8f89\u8f8a\u8f8b\u8f8c\u8f8d\u8f8e\u8f8f\u8f90\u8f96\u8f97\u8f98\u8f99\u8f9a\u8f9b\u8f9c\u8f9d\u8fa0\u8fa1' + '\u8fa2\u5b15\u8fa3\u8fa4\u8fa5\u8fa6\u8fa8\u8fa9\u8faa\u8fab\u8fac\u8fad\u8fae\u8fb0\u8fb1\u8fb2\u8fb4\u8fb5\u8fb6\u8fb7\u8fb8\u8fb9\u8fba\u8fbb\u8fbc\u8fbe\u8fbf\u8fc1\u8fc2\u8fc3\u8fc4\u8fc5\u8fc6\u8fc7\u8fc8\u8fc9\u8fca\u8fcb\u8fcc\u8fcd\u8fce\u8fcf\u8fd0\u8fd1\u8fd2\u8fd3\u8fd4\u8fd5\u8fd6\u8fd7\u8fd8\u8fd9\u8fda\u8fdb\u8fdc\u8fdd\u8fde\u8fdf\u8fe0\u8fe1\u8fe2\u8fe3\u8fe4\u8fe5\u8fe6\u8fe7\u8fe8\u8fe9\u8fea\u8feb\u8fec\u8fee\u8fef\u8ff0\u8ff1\u8ff2\u8ff3\u8ff4\u8ff5\u8ff6\u8ff7\u8ff8\u8ff9\u8ffa\u8ffb\u8ffc\u8fff\u9000\u9003\u9004\u9005\u9006\u9007\u9008\u9009\u900a\u900b\u900c\u900d\u900e\u900f\u9011\u9012\u9013\u9014\u9015\u9016\u9018\u901b\u901c\u901d\u901e\u9020\u9021\u9022\u9023\u9024\u9025\u9027\u9028\u9029\u902d\u902e\u902f\u9030\u9031\u9032\u9033' + '\u9039\u903a\u903b\u903c\u903d\u903e\u903f\u9040\u9041\u9042\u9043\u9044\u904d\u904e\u904f\u9050\u9051\u9052\u9053\u9054\u9055\u905c\u905d\u905e\u905f\u9060\u9061\u906a\u906b\u906c\u906d\u906e\u906f\u9070\u9071\u9072\u9073\u907a\u907b\u907c\u9081\u908c\u908d\u908e\u908f\u9090\u9092\u9097\u9098\u909d\u90a1\u90a2\u90a3\u90a6\u90a7\u90a8\u90a9\u90ac\u90ad\u90ae\u90e9\u90af\u90b0\u90b1\u90b2\u90b3\u90b4\u90b5\u90b6\u90bf\u90c0\u90c1\u90c2\u90c3\u90c4\u90c5\u90c6\u90c7\u90c8\u90c9\u90ca\u90cb\u90cc\u90cd\u90ce\u90cf\u90d0\u90d1\u90d2\u90d3\u90d4\u90d5\u90d6\u90d7\u90d8\u90ea\u90eb\u90ec\u90ed\u90ee\u90ef\u90f0\u90f1\u90f2\u90f3\u90f4\u90f5\u90f6\u90f7\u90f8\u90f9\u90fa\u90fb\u90fc\u90fd\u90fe\u90ff\u90d9\u9100\u9101\u9102\u9103\u9104\u9105\u910c\u910d\u910e\u910f' + '\u9110\u9111\u9112\u9113\u9114\u9115\u9116\u9117\u9118\u9119\u911a\u911b\u911c\u911d\u911e\u9128\u9129\u912a\u912b\u912c\u912d\u912e\u912f\u9130\u9131\u9132\u9133\u9134\u9135\u9136\u9137\u9138\u9139\u913a\u913b\u913c\u913d\u913e\u913f\u9140\u9141\u9142\u9143\u9159\u9144\u9145\u9146\u9147\u915a\u915b\u915c\u915d\u915e\u915f\u9160\u9161\u9162\u9163\u9148\u9164\u9165\u9166\u9167\u9168\u9169\u916a\u916b\u916c\u916d\u916e\u9179\u917a\u917b\u917c\u917d\u917e\u917f\u9180\u9181\u9182\u9183\u9184\u9185\u9186\u918e\u918f\u9190\u9191\u9192\u9193\u9194\u9195\u9196\u9197\u9198\u9199\u919a\u919b\u919c\u919d\u919e\u919f\u91a0\u91a1\u91a9\u91aa\u91ab\u91ac\u91ad\u91ae\u91a2\u91af\u91b0\u91b1\u91b2\u91b3\u91b4\u91b5\u91b6\u91b7\u91b8\u91b9\u91ba\u91bb\u91bc\u91bd\u91be\u91bf' + '\u91a3\u91c5\u91c6\u91c7\u91c8\u91c9\u91ca\u91cb\u91cc\u91cd\u91d0\u91d1\u91d2\u91d3\u91d4\u91d5\u91d8\u91d9\u91da\u91db\u91dc\u91dd\u91de\u91e0\u91e1\u91e2\u91e3\u91e4\u91e5\u91e8\u91e9\u91ea\u91eb\u91ed\u91ee\u91ef\u91f0\u91f1\u91f3\u91f4\u91f7\u91f5\u91f6\u91f9\u91fa\u91fb\u91fc\u91fd\u91fe\u9204\u9205\u920a\u920b\u920c\u920d\u920e\u920f\u9210\u9211\u9212\u9213\u9215\u9216\u9218\u921b\u921c\u921d\u921e\u921f\u9220\u9222\u9224\u9226\u9227\u9228\u9229\u922a\u922b\u922f\u9230\u9231\u9232\u9233\u9234\u9235\u9236\u9238\u9239\u923a\u923b\u923c\u923d\u923e\u923f\u9240\u9241\u9242\u9243\u9244\u9245\u924f\u9250\u9251\u9252\u9253\u9254\u9255\u9256\u9257\u926d\u9258\u9259\u925a\u925b\u925c\u925d\u925e\u925f\u9260\u9261\u9262\u9263\u9264\u9265\u9266\u9267\u926e\u926f' + '\u9270\u9271\u9272\u9273\u9274\u9275\u9276\u9277\u9278\u9279\u927a\u927b\u927c\u9282\u9283\u9284\u9285\u9286\u9287\u9288\u9289\u928a\u928f\u9290\u9291\u9292\u9293\u9294\u9295\u9296\u9297\u9298\u9299\u929a\u929b\u929c\u929d\u929e\u929f\u92a0\u92a1\u92a2\u92a3\u92a4\u92a5\u92aa\u92ab\u92ac\u92ad\u92ae\u92af\u92b0\u92b1\u92b2\u92b3\u92b4\u92b5\u92b6\u92b7\u92b8\u92b9\u92bf\u92c0\u92c1\u92c2\u92c3\u92c4\u92c5\u92c6\u92c7\u92ce\u92cf\u92d0\u92d1\u92d2\u92d3\u92d4\u92dd\u92de\u92df\u92e0\u92e1\u92e2\u92e3\u92e4\u92e9\u92ea\u92eb\u92ec\u92ed\u92ee\u92f0\u92f1\u92f2\u92f3\u92f4\u92f8\u92f9\u92fa\u92fd\u92fe\u9301\u9304\u9305\u9306\u9307\u9308\u9309\u930b\u930c\u930d\u930e\u930f\u9311\u9312\u9313\u9314\u9315\u9316\u9317\u9318\u9319\u931a\u931b\u931d\u931e\u931f\u9320' + '\u9321\u9322\u9323\u9324\u9325\u9326\u9327\u9328\u9329\u932a\u932b\u932c\u932d\u932e\u932f\u9330\u9331\u9332\u9333\u9334\u9335\u9336\u9337\u9338\u9339\u933a\u933b\u933c\u933d\u933e\u933f\u9340\u9341\u9342\u9343\u9344\u9345\u9347\u9348\u9349\u934a\u934b\u934c\u934d\u934e\u934f\u9350\u9352\u9353\u9354\u9355\u9358\u935a\u935d\u935e\u935f\u9360\u9361\u9362\u9363\u9364\u9365\u9367\u9368\u9369\u936a\u936b\u936c\u936d\u936e\u936f\u9370\u9371\u9372\u9375\u9376\u9377\u9378\u9379\u937a\u937b\u937c\u937d\u937e\u937f\u9380\u9381\u9382\u9383\u9384\u9385\u9386\u9387\u9388\u9389\u938a\u9391\u9392\u9393\u9394\u9395\u9396\u9397\u9398\u9399\u939a\u939b\u939c\u938b\u939d\u939e\u939f\u93a0\u93a1\u93a2\u93a3\u93a6\u93a7\u93a8\u93a9\u93aa\u93ab\u93ac\u93ad\u93ae\u93af\u93b0\u93b1' + '\u93b2\u93b3\u93b4\u93b5\u93b6\u93b7\u93b8\u93b9\u93ba\u93bb\u93bc\u93c4\u93c5\u93c6\u93c7\u93c8\u93c9\u93ca\u93cb\u93cc\u93cd\u93ce\u93cf\u93d0\u93d1\u93d2\u93d3\u93d4\u93d5\u93d6\u93d7\u93d8\u93d9\u93da\u93db\u93dc\u93dd\u93de\u93df\u93e0\u93e4\u93e5\u93e6\u93e7\u93e8\u93e9\u93ea\u93eb\u93ec\u93ed\u93ee\u93ef\u93f0\u93f1\u93f2\u93f3\u93f4\u93f5\u93f6\u93f7\u93fd\u93fe\u93ff\u9400\u9401\u9402\u9403\u9404\u9405\u9406\u9407\u9408\u9409\u940a\u940b\u940c\u940d\u940e\u940f\u9410\u9411\u9412\u9413\u9414\u9415\u9416\u9417\u9418\u941a\u941b\u941c\u941d\u941e\u941f\u9420\u9421\u9422\u9423\u9424\u9425\u9426\u9427\u942c\u942d\u942e\u942f\u9430\u9431\u9432\u9433\u9434\u9435\u9436\u9437\u943d\u9438\u943e\u943f\u9440\u9441\u9442\u9443\u9444\u9445\u9446\u944c\u944d\u944e' + '\u944f\u9450\u9451\u9452\u9453\u9454\u9447\u9457\u9458\u9455\u945b\u945c\u945d\u945f\u9460\u9461\u9462\u9464\u9465\u9466\u9468\u9469\u946a\u946b\u946c\u946d\u946e\u946f\u9470\u9471\u9473\u9474\u9475\u9476\u9477\u9478\u9479\u947a\u947b\u947c\u947d\u947e\u947f\u9480\u9481\u9485\u9486\u9487\u9488\u9489\u948a\u948b\u948c\u948d\u948e\u948f\u9490\u9491\u9492\u9493\u9497\u9498\u9499\u949a\u949b\u949c\u949d\u949e\u949f\u94a0\u94a1\u94a2\u94a3\u94a4\u94a5\u94a6\u94a7\u94a8\u94a9\u94aa\u94ab\u94ac\u94b6\u94ad\u94b7\u94b8\u94b9\u94ba\u94bb\u94bc\u94bd\u94be\u94bf\u94c0\u94c1\u94c2\u94c3\u94c4\u94c5\u94c6\u94c7\u94c8\u94c9\u94ca\u94d2\u94d3\u94d4\u94d5\u94d6\u94d7\u94d8\u94d9\u94da\u94db\u94dc\u94dd\u94de\u94df\u94e0\u94e1\u94e2\u94e9\u94ea\u94eb\u94ec\u94ed\u94ee\u94ef' + '\u94f0\u94f1\u94f2\u94f3\u94f4\u94f5\u94f6\u94f7\u94f8\u94f9\u94fa\u94fe\u94ff\u9500\u9501\u9502\u9503\u9504\u9505\u9506\u9507\u9508\u9509\u950a\u9510\u9511\u9512\u9513\u9514\u9515\u9516\u9517\u9518\u9519\u951a\u951b\u951c\u951d\u9523\u9524\u9525\u9526\u9527\u9528\u9529\u952a\u952b\u952c\u952d\u952e\u952f\u9534\u9535\u9536\u9537\u9538\u953a\u953b\u953d\u953e\u953f\u9540\u9541\u9542\u9543\u9545\u9544\u9546\u9547\u9548\u9549\u954a\u954b\u954e\u954f\u9550\u9553\u9554\u9555\u9556\u9557\u9558\u9559\u955c\u955d\u955e\u955f\u9560\u9561\u9562\u9563\u9564\u9565\u9566\u9567\u956d\u956e\u956f\u9570\u9571\u9572\u9573\u957a\u957b\u957c\u957d\u957e\u957f\u9580\u9581\u9582\u9583\u9584\u9585\u958c\u958d\u958e\u958f\u9590\u9591\u9592\u9593\u9594\u9595\u9596\u9597\u9598\u9599' + '\u959c\u959d\u959e\u959f\u95a0\u95a1\u95a2\u95a3\u95a4\u95a5\u95a6\u95a7\u95a8\u95ad\u95ae\u95af\u95b0\u95b1\u95b2\u95b3\u95b4\u95b5\u95b6\u95b7\u95c1\u95c2\u95c3\u95c4\u95c5\u95c6\u95c7\u95c8\u95c9\u95ca\u95cb\u95cc\u95cd\u95d2\u95d3\u95d4\u95d5\u95d6\u95d7\u95d8\u95d9\u95db\u95dc\u95dd\u95de\u95df\u95e5\u95e6\u95e7\u95e8\u95e9\u95ea\u95eb\u95ec\u95ed\u95ee\u95f3\u95f4\u95f5\u95f6\u95f7\u95fa\u95fb\u95fc\u95fd\u95fe\u9600\u9601\u9602\u9603\u9604\u9605\u9606\u9607\u9608\u960a\u960b\u960c\u960d\u960e\u960f\u9610\u9611\u9612\u9613\u9614\u9615\u9616\u9617\u9618\u9619\u961a\u961b\u961c\u961d\u961f\u9620\u9621\u9622\u9623\u9624\u9625\u9626\u9627\u9628\u9629\u962a\u962b\u962c\u962d\u962e\u962f\u9630\u9631\u9632\u9633\u9634\u9635\u9636\u9637\u9638\u963a\u963b\u963c' + '\u963d\u963e\u963f\u9640\u9641\u9642\u9643\u9644\u9645\u9646\u9647\u9648\u9649\u964a\u964b\u964c\u964d\u964e\u964f\u9650\u9651\u9652\u9653\u9654\u9655\u9656\u9657\u9658\u9659\u965a\u965b\u965c\u965d\u965e\u965f\u9660\u9661\u9662\u9663\u9664\u9665\u9666\u9667\u9668\u9669\u966e\u966f\u9670\u9671\u9672\u9673\u9674\u9675\u9676\u9677\u9678\u9679\u967a\u967b\u967c\u967d\u967e\u967f\u9680\u9681\u9682\u9683\u9684\u9685\u9686\u9687\u9688\u9689\u968a\u968b\u968c\u968d\u968e\u968f\u9690\u9691\u9692\u9693\u9694\u9695\u9696\u9697\u9698\u9699\u969a\u969b\u969c\u969d\u969e\u969f\u96a0\u96a1\u96a2\u96a3\u96a4\u96a5\u96a6\u96a7\u96a8\u96a9\u96aa\u96ab\u96ac\u96ad\u96ae\u96af\u96b0\u96b1\u96b2\u96b3\u96b4\u96b5\u96bb\u96bc\u96bd\u96be\u96bf\u96c0\u96c1\u974b\u96c2\u96c3\u96c4' + '\u96c5\u96c6\u96c7\u96c8\u96c9\u96ca\u96cb\u96cc\u96cd\u96ce\u96cf\u96d0\u96d1\u96d2\u96d3\u96b6\u96d4\u96d5\u96d6\u96d7\u96d8\u96d9\u96da\u96db\u96dc\u96dd\u96de\u96df\u96e0\u96e1\u96e2\u96e3\u96e4\u96e5\u96e6\u96e7\u96e8\u96e9\u96ea\u96eb\u96ec\u96ed\u96ee\u96ef\u96f0\u96f1\u96f2\u96f3\u96f4\u96f5\u96fd\u96fe\u96ff\u9700\u9701\u9702\u9703\u9704\u9705\u9706\u9707\u9708\u9709\u970a\u970b\u970c\u970d\u970e\u970f\u9710\u9711\u9712\u9713\u9714\u9715\u9716\u9717\u9718\u9719\u971a\u971b\u971c\u971d\u971e\u971f\u9720\u9721\u9722\u9723\u9724\u9725\u9726\u9727\u9728\u9729\u972a\u972b\u972c\u972d\u972e\u972f\u9730\u9731\u9732\u9733\u9734\u9735\u9736\u9737\u9738\u9739\u973a\u973b\u973c\u973d\u973e\u973f\u9740\u9741\u974c\u974d\u974e\u974f\u9750\u9751\u9752\u9753\u9754' + '\u9755\u9756\u9757\u9758\u9759\u975a\u975b\u975c\u975d\u975e\u975f\u9760\u9761\u9762\u9763\u9764\u9765\u9766\u9767\u9768\u9769\u976a\u976b\u976c\u976d\u976e\u976f\u9770\u9771\u9772\u9773\u9774\u9775\u9776\u9777\u9778\u9779\u977a\u977b\u977c\u97a2\u977d\u977e\u977f\u9780\u9781\u9782\u9783\u9784\u9785\u9786\u9787\u9788\u9789\u978a\u978b\u978c\u978d\u978e\u978f\u9790\u9791\u9792\u9793\u9794\u9795\u9796\u9797\u9798\u9799\u979a\u97a3\u979b\u97a4\u97a5\u97a6\u97a7\u97a8\u97a9\u97aa\u97ab\u97ac\u97ad\u97ae\u97af\u97b0\u97b1\u97b2\u97b3\u97b4\u97b5\u97b6\u97b7\u97b8\u97b9\u97ba\u97bb\u97bc\u97bd\u97be\u97bf\u97c0\u97c1\u97c2\u97c3\u97c4\u97c5\u97c6\u97c7\u97c8\u97c9\u97ca\u97cb\u97cc\u97cd\u97ce\u97cf\u97d0\u97d1\u97d2\u97d3\u97d4\u97d5\u97d6\u97d7\u97d8\u97d9\u97da' + '\u97db\u97dc\u97dd\u97de\u97df\u97e0\u97e1\u97e2\u97e9\u97ea\u97eb\u97ec\u97ed\u97ee\u97ef\u97f0\u97f1\u97f2\u97f3\u97f4\u97f5\u97f6\u97f7\u97f8\u97f9\u97fa\u97fb\u97fc\u97fd\u97fe\u97ff\u9800\u9801\u9802\u9803\u9804\u9805\u9806\u9807\u9808\u9809\u982c\u980a\u980b\u980c\u980d\u980e\u980f\u9810\u9811\u9812\u9813\u9814\u9815\u9816\u9817\u9818\u9819\u981a\u981b\u981c\u981d\u981e\u981f\u982d\u982e\u982f\u9830\u9831\u9832\u9833\u9834\u9835\u9836\u9837\u9838\u9839\u983a\u983b\u983c\u983d\u983e\u983f\u9840\u9841\u9842\u9843\u9844\u9845\u9846\u9847\u9848\u9849\u984a\u984b\u984c\u984d\u984e\u984f\u9850\u9851\u9852\u9853\u9854\u9855\u9856\u9857\u9858\u9859\u985a\u985b\u985c\u985d\u985e\u985f\u986d\u98aa\u986e\u986f\u9870\u9871\u9860\u9872\u9873\u9874\u9875\u9876\u9877' + '\u9878\u9879\u987a\u987b\u987c\u987d\u987e\u987f\u9880\u9881\u9882\u9883\u9884\u9885\u9886\u9887\u9888\u9889\u988a\u988b\u988c\u988d\u988e\u988f\u9890\u9891\u9892\u9893\u9894\u9895\u9896\u9897\u9898\u9899\u989a\u989b\u989c\u989d\u989e\u989f\u98a0\u98ab\u98ac\u98ad\u98ae\u98af\u98b0\u98b1\u98b2\u98b3\u98b4\u98b5\u98b6\u98b7\u98b8\u98b9\u98ba\u98bb\u98bc\u98bd\u98be\u98bf\u98c0\u98c1\u98c2\u98c3\u98ce\u98cf\u98d0\u98d1\u98d2\u98d3\u98d4\u98d5\u98d6\u98d7\u98d8\u98d9\u98da\u98db\u98dc\u98dd\u98de\u98df\u98e0\u98ea\u98eb\u98ec\u98ed\u98ee\u98ef\u98f0\u98f1\u98f2\u98f3\u98f4\u98f5\u98f6\u98f7\u98f8\u98f9\u98fa\u98fb\u98e1\u9902\u9903\u9904\u9905\u9906\u990a\u990b\u990c\u990d\u990e\u990f\u9910\u9912\u9913\u9914\u9915\u9916\u9917\u9918\u9919\u991a\u991b\u991c\u991d' + '\u991e\u991f\u9920\u9921\u9922\u9924\u9925\u9926\u9927\u9928\u9929\u992a\u992b\u992c\u992d\u992e\u992f\u9930\u9931\u9932\u9933\u9934\u9935\u9936\u9937\u9938\u9939\u993a\u993b\u993c\u993d\u993e\u993f\u9940\u9941\u9942\u9943\u9944\u9945\u9946\u9947\u9948\u9949\u994a\u994b\u994c\u994d\u994e\u9952\u9953\u9954\u9955\u9956\u9957\u9958\u9959\u995a\u995b\u995c\u995d\u995e\u995f\u9960\u9961\u9962\u9963\u9964\u9965\u9966\u9967\u9968\u9969\u996a\u996b\u996c\u996d\u996e\u996f\u9970\u9975\u9976\u9977\u9978\u9979\u997a\u997b\u997c\u997d\u997e\u997f\u9980\u9981\u9982\u9983\u9984\u9985\u9986\u9987\u9988\u9989\u998a\u998b\u998c\u998d\u998e\u998f\u9990\u9991\u9992\u9993\u9994\u9995\u9996\u9997\u9998\u9999\u999a\u999b\u999c\u999d\u999f\u99a0\u99a1\u99a2\u99a3\u99a4\u99a5\u99a6' + '\u99a7\u99a8\u99a9\u99aa\u99ab\u99ac\u99ad\u99ae\u99af\u99b0\u99b1\u99b2\u99b3\u99b4\u99b5\u99b6\u99b7\u99b8\u99b9\u99ba\u99bb\u99bc\u99bf\u99c0\u99c1\u99c2\u99c3\u99c4\u99c5\u99c6\u99c7\u99c8\u99c9\u99ca\u99cb\u99cc\u99cd\u99ce\u99cf\u99d0\u99d1\u99d2\u99d3\u99d4\u99d5\u99d6\u99d7\u99d8\u99d9\u99da\u99db\u99dc\u99dd\u99de\u99df\u99e0\u99e1\u99e2\u99e3\u99e4\u99e5\u99e6\u99e7\u99e8\u99e9\u99ea\u99eb\u99ec\u99ed\u99ee\u99ef\u99f0\u99f1\u99f2\u99f3\u99f4\u99f5\u99f6\u99f7\u99f8\u99f9\u99fa\u99fb\u99fc\u99fd\u99fe\u9a01\u9a02\u9a03\u9a04\u9a05\u9a06\u9a07\u9a08\u9a09\u9a0a\u9a0b\u9a0c\u9a0d\u9a0e\u9a0f\u9a10\u9a11\u9a12\u9a13\u9a14\u9a15\u9a16\u9a1a\u9a1b\u9a1c\u9a1d\u9a1e\u9a1f\u9a20\u9a21\u9a22\u9a23\u9a24\u9a26\u9a27\u9a28\u9a2a\u9a2b\u9a2f\u9a31\u9a32\u9a33' + '\u9a34\u9a35\u9a36\u9a37\u9a38\u9a39\u9a3a\u9a3b\u9a3c\u9a3d\u9a3e\u9a41\u9a42\u9a43\u9a44\u9a45\u9a46\u9a47\u9a48\u9a49\u9a4a\u9a4b\u9a4c\u9a4d\u9a52\u9a53\u9a54\u9a55\u9a56\u9a57\u9a58\u9a59\u9a5a\u9a5e\u9a5f\u9a60\u9a61\u9a62\u9a63\u9a64\u9a65\u9a66\u9a67\u9a6f\u9a70\u9a71\u9a72\u9a73\u9a74\u9a75\u9a76\u9a77\u9a78\u9a7d\u9a7e\u9a93\u9a7f\u9a80\u9a81\u9a82\u9a83\u9a84\u9a85\u9a86\u9a87\u9a88\u9a89\u9a94\u9a95\u9a96\u9a97\u9a98\u9a99\u9a9a\u9a9b\u9a9c\u9a9d\u9a9e\u9a9f\u9aa0\u9aa8\u9aa9\u9aaa\u9aab\u9aac\u9aad\u9aae\u9aaf\u9ab0\u9ab1\u9ab2\u9ab3\u9ab4\u9ab5\u9ab7\u9ab8\u9ab9\u9aba\u9abc\u9abd\u9abe\u9abf\u9ac0\u9ac4\u9ac6\u9ac7\u9ac8\u9ac9\u9aca\u9acb\u9acc\u9acd\u9ace\u9acf\u9ad0\u9ad1\u9ad2\u9ad3\u9ad4\u9ad5\u9ad6\u9ad7\u9ad8\u9ad9\u9ada\u9adb\u9adc\u9add' + '\u9ade\u9adf\u9ae0\u9ae2\u9ae3\u9ae4\u9ae5\u9ae7\u9ae8\u9ae9\u9aea\u9aeb\u9aec\u9aed\u9aee\u9aef\u9af0\u9af1\u9af2\u9af3\u9af4\u9af5\u9af7\u9af8\u9af9\u9afa\u9afb\u9afc\u9afd\u9afe\u9aff\u9b00\u9b03\u9b04\u9b05\u9b06\u9b07\u9b09\u9b0a\u9b0b\u9b0c\u9b0d\u9b0e\u9b0f\u9b10\u9b11\u9b12\u9b13\u9b14\u9b15\u9b16\u9b17\u9b18\u9b19\u9b1a\u9b20\u9b21\u9b22\u9b23\u9b24\u9b25\u9b26\u9b27\u9b28\u9b29\u9b2a\u9b2b\u9b2c\u9b2d\u9b2e\u9b2f\u9b30\u9b31\u9b32\u9b36\u9b37\u9b38\u9b39\u9b3a\u9b3b\u9b3c\u9b3d\u9b3e\u9b3f\u9b40\u9b41\u9b47\u9b48\u9b49\u9b4a\u9b61\u9b4b\u9b4c\u9b4d\u9b4e\u9b4f\u9b50\u9b51\u9b52\u9b53\u9b54\u9b55\u9b56\u9b57\u9b58\u9b59\u9b62\u9b63\u9b64\u9b65\u9b66\u9b67\u9b68\u9b69\u9b6a\u9b6b\u9b6c\u9b6d\u9b6e\u9b6f\u9b70\u9b71\u9b72\u9b7a\u9b7b\u9b7c\u9b7d\u9b7e' + '\u9b7f\u9b80\u9b81\u9b82\u9b83\u9b84\u9b85\u9b86\u9b87\u9b88\u9b89\u9b8a\u9b8b\u9b8c\u9b8d\u9b8e\u9b8f\u9b93\u9b94\u9b95\u9b96\u9b97\u9b98\u9b99\u9b9a\u9b9b\u9ba3\u9ba4\u9ba5\u9ba6\u9ba7\u9ba8\u9ba9\u9baa\u9baf\u9bb0\u9bb1\u9bb2\u9bb7\u9bb8\u9bb9\u9bba\u9bbb\u9bbc\u9bc0\u9bc1\u9bc2\u9bc3\u9bc4\u9bc5\u9bc6\u9bca\u9bcb\u9bcd\u9bd1\u9bd2\u9bd3\u9bd4\u9bd5\u9bd6\u9bd7\u9bd8\u9bd9\u9bdb\u9bdc\u9bdf\u9be0\u9be1\u9be2\u9be3\u9be4\u9be5\u9be6\u9bea\u9beb\u9bec\u9bed\u9bee\u9bef\u9bf0\u9bf5\u9bf6\u9bf7\u9bf9\u9bfc\u9bfd\u9c00\u9c03\u9c04\u9c05\u9c06\u9c07\u9c08\u9c09\u9c0a\u9c0b\u9c0c\u9c0e\u9c0f\u9c10\u9c15\u9c17\u9c18\u9c1a\u9c1c\u9c1d\u9c1e\u9c1f\u9c21\u9c22\u9c23\u9c24\u9c25\u9c26\u9c27\u9c28\u9c2b\u9c2c\u9c2d\u9c2e\u9c2f\u9c30\u9c31\u9c32\u9c33\u9c34\u9c35\u9c37' + '\u9c38\u9c39\u9c42\u9c43\u9c44\u9c45\u9c46\u9c47\u9c48\u9c49\u9c4a\u9c4e\u9c4f\u9c50\u9c51\u9c52\u9c53\u9c54\u9c55\u9c56\u9c57\u9c58\u9c59\u9c5a\u9c5f\u9c60\u9c61\u9c62\u9c63\u9c64\u9c65\u9c66\u9c67\u9c6f\u9c70\u9c71\u9c72\u9c73\u9c7a\u9c7b\u9c7c\u9c7d\u9c7e\u9c7f\u9c80\u9c81\u9c87\u9c88\u9c89\u9c8a\u9c8b\u9c8c\u9c8d\u9c90\u9c91\u9c92\u9c93\u9c94\u9c95\u9c96\u9c97\u9c98\u9c99\u9c9a\u9c9b\u9c9f\u9ca2\u9ca3\u9ca4\u9ca5\u9ca6\u9ca7\u9ca8\u9caa\u9cac\u9cad\u9cae\u9caf\u9cb0\u9cb3\u9cb5\u9cb7\u9cb8\u9cb9\u9cba\u9cbb\u9cbc\u9cbd\u9cbe\u9cbf\u9cc0\u9cc1\u9cc2\u9cc3\u9cc5\u9cc8\u9cca\u9ccc\u9cce\u9ccf\u9cd3\u9cd7\u9cd8\u9cdd\u9ce1\u9ce3\u9ce4\u9ce5\u9ce6\u9ce7\u9ce8\u9ce9\u9cea\u9ceb\u9cef\u9cf0\u9cf1\u9cf2\u9cf3\u9cf4\u9cf5\u9cf6\u9cfd\u9cfe\u9cff\u9d00\u9d01\u9d02' + '\u9d03\u9d04\u9d05\u9d06\u9d07\u9d08\u9d09\u9d10\u9d11\u9d12\u9d13\u9d14\u9d15\u9d16\u9d17\u9d18\u9d19\u9d1a\u9d1b\u9d1d\u9d1e\u9d1f\u9d20\u9d21\u9d22\u9d23\u9d2c\u9d2d\u9d2e\u9d2f\u9d30\u9d31\u9d32\u9d33\u9d3b\u9d3c\u9d3d\u9d3e\u9d3f\u9d40\u9d41\u9d42\u9d43\u9d44\u9d45\u9d46\u9d47\u9d48\u9d49\u9d51\u9d52\u9d53\u9d54\u9d55\u9d56\u9d57\u9d5e\u9d5f\u9d60\u9d61\u9d65\u9d66\u9d67\u9d68\u9d6f\u9d70\u9d71\u9d72\u9d75\u9d76\u9d79\u9d7a\u9d7b\u9d7f\u9d83\u9d84\u9d85\u9d87\u9d88\u9d8d\u9d8e\u9d8f\u9d90\u9d92\u9d93\u9d94\u9d96\u9d97\u9d98\u9d99\u9d9a\u9da4\u9d9e\u9d9f\u9da0\u9da1\u9da5\u9da6\u9da7\u9da9\u9dac\u9dad\u9dae\u9daf\u9db0\u9db1\u9db2\u9db3\u9db4\u9db5\u9db6\u9db8\u9dba\u9dbb\u9dbd\u9dc3\u9dc9\u9dca\u9dcc\u9dcd\u9dcf\u9dd2\u9dd3\u9dd5\u9dd6\u9dd9\u9dda\u9ddb' + '\u9ddd\u9dde\u9ddf\u9de0\u9de1\u9de2\u9de3\u9de4\u9de5\u9de6\u9de9\u9dea\u9deb\u9dec\u9ded\u9dee\u9def\u9df0\u9df1\u9df2\u9df7\u9df8\u9df9\u9dfa\u9dfb\u9df3\u9dfc\u9e06\u9e07\u9e08\u9e09\u9e0a\u9e0b\u9e0c\u9e0d\u9e0e\u9e1a\u9e1b\u9e0f\u9e10\u9e11\u9e12\u9e13\u9e14\u9e15\u9e1c\u9e1d\u9e1e\u9e1f\u9e20\u9e21\u9e22\u9e23\u9e24\u9e25\u9e26\u9e27\u9e28\u9e29\u9e2a\u9e2b\u9e2c\u9e4a\u9e35\u9e36\u9e37\u9e38\u9e39\u9e3a\u9e3b\u9e3c\u9e3d\u9e3e\u9e3f\u9e40\u9e4b\u9e4c\u9e4d\u9e4e\u9e4f\u9e50\u9e51\u9e52\u9e53\u9e54\u9e55\u9e60\u9e61\u9e62\u9e63\u9e64\u9e65\u9e66\u9e67\u9e68\u9e73\u9e74\u9e75\u9e76\u9e77\u9e7c\u9e7d\u9e7e\u9e7f\u9e80\u9e87\u9e88\u9e89\u9e8d\u9e8e\u9e8f\u9e90\u9e91\u9e94\u9e95\u9e97\u9e98\u9e99\u9e9a\u9e9b\u9e9c\u9e9d\u9e9e\u9e9f\u9ea0\u9ea1\u9ea2\u9ea3' + '\u9ea4\u9ea5\u9ea6\u9ea7\u9ea8\u9ea9\u9eaa\u9eab\u9eac\u9ead\u9eae\u9eaf\u9eb0\u9eb1\u9eb2\u9eb3\u9eb4\u9eb5\u9eb6\u9eb7\u9eb8\u9eb9\u9eba\u9ebb\u9ebc\u9ebd\u9ebe\u9ebf\u9ec0\u9ec1\u9ec2\u9ec3\u9ec4\u9ec5\u9ec6\u9ec7\u9ec8\u9ec9\u9eca\u9ecb\u9ecc\u9ece\u9ecf\u9ed1\u9ed2\u9ed7\u9ed8\u9ed9\u9eda\u9edb\u9ee2\u9ee3\u9ee6\u9ee7\u9eed\u9eee\u9ef5\u9ef6\u9ef7\u9eff\u9f00\u9f01\u9f02\u9f03\u9f04\u9f08\u9f09\u9f0a\u9f0b\u9f0e\u9f0f\u9f10\u9f11\u9f12\u9f13\u9f15\u9f18\u9f19\u9f1a\u9f1b\u9f1c\u9f1d\u9f1e\u9f1f\u9f20\u9f22\u9f21\u9f23\u9f24\u9f25\u9f26\u9f27\u9f2a\u9f2b\u9f2c\u9f2d\u9f2e\u9f2f\u9f30\u9f31\u9f32\u9f35\u9f36\u9f37\u9f38\u9f3c\u9f3d\u9f3e\u9f3f\u9f40\u9f41\u9f42\u9f43\u9f44\u9f45\u9f4b\u9f4c\u9f4d\u9f4e\u9f4f\u9f50\u9f51\u9f61\u9f52\u9f53\u9f54\u9f55\u9f56' + '\u9f62\u9f63\u9f64\u9f65\u9f66\u9f67\u9f68\u9f69\u9f6a\u9f6b\u9f6c\u9f6d\u9f6e\u9f6f\u9f70\u9f71\u9f79\u9f7a\u9f7b\u9f7c\u9f7d\u9f7e\u9f7f\u9f80\u9f81\u9f82\u9f8b\u9f8c\u9f8d\u9f83\u9f8e\u9f8f\u9f90\u9f91\u9f92\u9f93\u9f94\u9f95\u9f96\u9f97\u9f98\u9f99\u9f9f\u9fa0\u9fa1\u9fa2\u9fa3\u9fa4\u9fa5\u9fa6\u9fa7\u9fa8\u9fa9\u9faa\u9fb4\u9fab\u9fb5\u9fb6\u9fb7\u9fb8\u9fb9\u9fba\u9fbb\u9fbc\u9fbd\u9fbe\u9fbf\u9fc0\u9fc6\u9fc7\u9fc8\u9fc9\u9fca\u9fcb\u9fcf\u9fd0\u9fd1\u9fd2\u9fd3\u9fd4\u9fd5\u9fd6\u9fd7\u9fd8\u9fde\u9fdf\u9fe0\u9fe1\u9fe2\u9fe3\u9fe8\u9fe9\u9fea\u9ff1\u9ff2\u9ff3\u9ff7\u9ff8\u9ffa\u9ffb\u9ffc\u9ffd\u9ffe\u9fff\ua000\ua001\ua002\ua003\ua004\ua005\ua006\ua007\ua008\ua009\ua00a\ua00b\ua00c\ua00d\ua00e\ua00f\ua010\ua011\ua012\ua013\ua014\ua015\ua016\ua017' + '\ua018\ua019\ua01a\ua01b\ua01c\ua01d\ua01e\ua01f\ua020\ua023\ua021\ua022\ua024\ua025\ua026\ua027\ua028\ua029\ua02a\ua02b\ua02c\ua02e\ua02f\ua030\ua033\ua036\ua037\ua038\ua039\ua03a\ua03c\ua03d\ua03e\ua03f\ua040\ua041\ua045\ua046\ua047\ua048\ua049\ua04a\ua04b\ua04c\ua04e\ua04f\ua050\ua052\ua053\ua054\ua055\ua056\ua057\ua058\ua05b\ua05c\ua05d\ua05e\ua05f\ua060\ua061\ua062\ua063\ua064\ua065\ua066\ua067\ua068\ua069\ua06a\ua06b\ua06c\ua075\ua076\ua077\ua078\ua079\ua07a\ua07b\ua07c\ua07d\ua07e\ua07f\ua080\ua081\ua082\ua083\ua084\ua085\ua086\ua087\ua088\ua089\ua08a\ua08b\ua08c\ua08d\ua095\ua096\ua097\ua098\ua099\ua09a\ua09b\ua09c\ua09d\ua09e\ua09f\ua0a0\ua0a1\ua0a2\ua0a3\ua0a4\ua0a5\ua0a6\ua0c4\ua0af\ua0b0\ua0b1\ua0b2\ua0b3\ua0b4\ua0b5\ua0b6\ua0b7\ua0b8\ua0b9\ua0ba' + '\ua0bb\ua0bc\ua0bd\ua0be\ua0c5\ua0c6\ua0c7\ua0c8\ua0c9\ua0ca\ua0cb\ua0cc\ua0cd\ua0ce\ua0cf\ua0d0\ua0d1\ua0d2\ua0d3\ua0d4\ua0de\ua0df\ua0e0\ua0e1\ua0e2\ua0e3\ua0e4\ua0e5\ua0e6\ua0e7\ua0e8\ua0e9\ua0ea\ua0eb\ua0ec\ua0ed\ua0ee\ua0ef\ua0f0\ua0f1\ua0f2\ua0fa\ua0fb\ua0fc\ua0fd\ua0fe\ua0ff\ua100\ua101\ua102\ua103\ua104\ua105\ua106\ua107\ua108\ua109\ua111\ua112\ua113\ua114\ua115\ua116\ua117\ua118\ua119\ua11a\ua11b\ua11c\ua11d\ua11e\ua11f\ua129\ua12a\ua12b\ua12c\ua12d\ua12e\ua12f\ua130\ua131\ua132\ua133\ua134\ua135\ua136\ua13c\ua13d\ua13e\ua13f\ua140\ua141\ua142\ua146\ua147\ua148\ua14d\ua14e\ua14f\ua150\ua152\ua153\ua154\ua155\ua158\ua159\ua15b\ua15d\ua15f\ua160\ua161\ua162\ua163\ua164\ua165\ua166\ua167\ua168\ua169\ua16a\ua16b\ua16c\ua16d\ua16e\ua16f\ua170\ua171\ua172' + '\ua173\ua174\ua175\ua176\ua177\ua178\ua179\ua17a\ua17b\ua17c\ua17e\ua17f\ua180\ua181\ua182\ua183\ua185\ua186\ua187\ua188\ua189\ua18a\ua18b\ua18c\ua18d\ua18e\ua18f\ua190\ua191\ua192\ua193\ua194\ua196\ua197\ua198\ua199\ua19a\ua19b\ua19c\ua19d\ua19e\ua1a0\ua1a2\ua1a3\ua1a4\ua1a5\ua1a6\ua1a7\ua1a8\ua1a9\ua1ac\ua1ad\ua1ae\ua1af\ua1b0\ua1b1\ua1b7\ua1b8\ua1b9\ua1ba\ua1bb\ua1c2\ua1c3\ua1ca\ua1cb\ua1cc\ua1cf\ua1d0\ua1d1\ua1d2\ua1d7\ua1d8\ua1d9\ua1da\ua1db\ua1dc\ua1dd\ua1df\ua1e0\ua1e1\ua1e3\ua1e5\ua1e6\ua1e7\ua1e8\ua1ea\ua1ec\ua1ee\ua1ef\ua1f0\ua1f3\ua1f5\ua1f6\ua1f8\ua1fa\ua1fc\ua1fd\ua200\ua201\ua202\ua203\ua204\ua205\ua206\ua207\ua208\ua209\ua210\ua211\ua212\ua213\ua214\ua215\ua216\ua217\ua218\ua219\ua21c\ua21d\ua21e\ua21f\ua220\ua221\ua222\ua226\ua227\ua228\ua229' + '\ua22a\ua22b\ua22c\ua231\ua232\ua233\ua234\ua223\ua235\ua23d\ua23e\ua23f\ua240\ua241\ua242\ua243\ua248\ua249\ua24a\ua24b\ua250\ua251\ua252\ua253\ua254\ua258\ua259\ua25a\ua25b\ua255\ua25d\ua25e\ua25f\ua260\ua261\ua266\ua26a\ua26c\ua26d\ua26e\ua26f\ua270\ua271\ua274\ua275\ua276\ua277\ua278\ua279\ua27a\ua27b\ua27f\ua281\ua282\ua283\ua284\ua285\ua286\ua287\ua288\ua28b\ua28c\ua28d\ua28e\ua28f\ua290\ua291\ua293\ua294\ua295\ua296\ua299\ua29c\ua29d\ua29e\ua29f\ua2a0\ua2a1\ua2a2\ua2a3\ua2aa\ua2ac\ua2ad\ua2ae\ua2af\ua2b0\ua2b1\ua2b6\ua2b7\ua2b8\ua2bc\ua2be\ua2bf\ua2c0\ua2c1\ua2c3\ua2c4\ua2c5\ua2c6\ua2ca\ua2cb\ua2cc\ua2cd\ua2ce\ua2cf\ua2d0\ua2d1\ua2d2\ua2d3\ua2d4\ua2d5\ua2d6\ua2d7\ua2d8\ua2d9\ua2da\ua2db\ua2dc\ua2dd\ua2de\ua2df\ua2e0\ua2e9\ua2ea\ua2eb\ua2ec\ua2ed\ua2ee' + '\ua2ef\ua2f0\ua2f1\ua2f2\ua2f3\ua2f4\ua2f5\ua2f6\ua2f7\ua2f8\ua2f9\ua2fa\ua2fb\ua2fc\ua2fd\ua2fe\ua2ff\ua300\ua301\ua302\ua303\ua304\ua305\ua306\ua307\ua314\ua315\ua316\ua317\ua318\ua319\ua31a\ua31b\ua31c\ua31d\ua308\ua31e\ua31f\ua320\ua321\ua322\ua323\ua324\ua325\ua326\ua327\ua328\ua329\ua32a\ua32b\ua32c\ua32d\ua32e\ua335\ua336\ua337\ua338\ua339\ua32f\ua33a\ua33b\ua33c\ua33d\ua33e\ua33f\ua340\ua341\ua342\ua343\ua344\ua345\ua346\ua347\ua348\ua349\ua34a\ua34b\ua34c\ua34d\ua34e\ua34f\ua350\ua351\ua352\ua35e\ua35f\ua360\ua361\ua362\ua363\ua364\ua365\ua366\ua367\ua368\ua369\ua36a\ua36b\ua36c\ua36d\ua36e\ua36f\ua370\ua371\ua372\ua373\ua374\ua375\ua376\ua377\ua378\ua379\ua37a\ua37b\ua37c\ua37d\ua37e\ua37f\ua393\ua394\ua395\ua396\ua397\ua380\ua398\ua353\ua399\ua39a' + '\ua39b\ua39c\ua39d\ua39e\ua39f\ua3a0\ua3a1\ua3a2\ua3a3\ua3a4\ua3a5\ua3a6\ua3a7\ua3a8\ua3a9\ua3aa\ua3ab\ua3ac\ua3ad\ua3ae\ua3af\ua3b0\ua3b1\ua3b2\ua3b3\ua3b4\ua3b5\ua3b6\ua3c2\ua3c3\ua3c4\ua3c5\ua3b7\ua3c6\ua3c7\ua3c8\ua3c9\ua3ca\ua3cb\ua3cc\ua3cd\ua3ce\ua3cf\ua3d0\ua3d1\ua3d2\ua3d3\ua3d4\ua3d5\ua3e0\ua3e1\ua3e2\ua3e3\ua3e4\ua3e5\ua3e6\ua3e7\ua3e8\ua3e9\ua3ea\ua3eb\ua3ec\ua3ed\ua3ee\ua3ef\ua3f0\ua3f1\ua3f2\ua3f3\ua3f4\ua3f5\ua3f6\ua3f7\ua405\ua406\ua407\ua408\ua409\ua40a\ua40b\ua40c\ua40d\ua40e\ua40f\ua410\ua411\ua412\ua413\ua414\ua415\ua416\ua417\ua41f\ua420\ua421\ua422\ua423\ua424\ua425\ua426\ua427\ua428\ua429\ua42a\ua434\ua42b\ua42c\ua42d\ua435\ua436\ua437\ua438\ua439\ua43d\ua43e\ua43f\ua440\ua441\ua442\ua444\ua445\ua448\ua44a\ua44b\ua44d\ua44e\ua44f\ua450' + '\ua451\ua452\ua453\ua454\ua457\ua458\ua459\ua45a\ua45b\ua45c\ua45d\ua45e\ua45f\ua460\ua461\ua462\ua463\ua467\ua468\ua469\ua46a\ua46b\ua46c\ua46d\ua46e\ua46f\ua470\ua471\ua472\ua473\ua474\ua475\ua476\ua477\ua478\ua479\ua47a\ua47b\ua47c\ua47d\ua47e\ua47f\ua480\ua481\ua482\ua485\ua486\ua487\ua488\ua489\ua48a\ua48b\ua48c\ua48d\ua48e\ua48f\ua490\ua491\ua492\ua493\ua494\ua495\ua4a6\ua496\ua497\ua498\ua499\ua49a\ua49b\ua49c\ua49d\ua49e\ua49f\ua4a0\ua4a1\ua4a2\ua4a7\ua4a8\ua4a9\ua4aa\ua4ab\ua4ac\ua4ad\ua4b1\ua4b2\ua4b3\ua4b4\ua4b5\ua4b6\ua4b7\ua4b8\ua4b9\ua4bc\ua4bd\ua4be\ua4bf\ua4c0\ua4c1\ua4c2\ua4c3\ua4c4\ua4c5\ua4c6\ua4c7\ua4c8\ua4c9\ua4ca\ua4cb\ua4cc\ua4cd\ua4ce\ua4cf\ua4d0\ua4d2\ua4d3\ua4d4\ua4d5\ua4d6\ua4d7\ua4de\ua4df\ua4e0\ua4e1\ua4e2\ua4e3\ua4e4\ua4e5\ua4e6' + '\ua4e7\ua4e8\ua4e9\ua4ea\ua4eb\ua4ec\ua4ed\ua4ee\ua4ef\ua4f0\ua502\ua4f1\ua4f2\ua4f3\ua4f4\ua503\ua504\ua505\ua506\ua507\ua508\ua509\ua50a\ua50b\ua50c\ua50d\ua50e\ua50f\ua510\ua511\ua512\ua513\ua514\ua515\ua516\ua517\ua518\ua519\ua51a\ua51b\ua51c\ua51d\ua51e\ua51f\ua520\ua533\ua534\ua535\ua536\ua537\ua538\ua539\ua53a\ua53b\ua53c\ua53d\ua53e\ua53f\ua540\ua541\ua542\ua543\ua544\ua545\ua546\ua547\ua548\ua549\ua54a\ua54b\ua54c\ua54d\ua54e\ua54f\ua55a\ua55b\ua55c\ua55d\ua55e\ua55f\ua560\ua561\ua562\ua563\ua564\ua565\ua566\ua567\ua568\ua569\ua56a\ua56b\ua56c\ua56d\ua56e\ua56f\ua570\ua571\ua572\ua573\u8bb2\ua574\ua57d\ua57e\ua57f\ua580\ua581\ua582\ua583\ua584\ua585\ua586\ua587\ua588\ua589\ua58a\ua58b\ua58c\ua58d\ua58e\ua58f\ua590\ua591\ua592\ua593\ua594\ua595\ua596' + '\ua597\ua598\ua599\ua59a\ua59b\ua59c\ua59d\ua59e\ua59f\ua5a0\ua5a1\ua5a2\ua5a3\ua5a4\ua5a5\ua5a6\ua5b1\ua5a7\ua5b2\ua5b3\ua5b4\ua5b5\ua5b6\ua5b7\ua5b8\ua5b9\ua5ba\ua5bb\ua5bc\ua5bd\ua5be\ua5bf\ua5c0\ua5c1\ua5c2\ua5c3\ua5c4\ua5c5\ua5c6\ua5c7\ua5c8\ua5c9\ua5ca\ua5cb\ua5d7\ua5d8\ua5d9\ua5da\ua5db\ua5dc\ua5dd\ua5de\ua5df\ua5e0\ua5e1\ua5e2\ua5e3\ua5e4\ua5e5\ua5e6\ua5e7\ua5e8\ua5e9\ua5ea\ua5eb\ua5ec\ua5ed\ua5ee\ua5ef\ua5f0\ua5f1\ua5f2\ua5f3\ua5f4\ua5f5\ua600\ua5f6\ua5f7\ua5f8\ua5f9\ua601\ua602\ua603\ua604\ua605\ua606\ua607\ua608\ua609\ua60a\ua60b\ua60c\ua60d\ua60e\ua60f\ua610\ua3f8\ua618\ua619\ua61a\ua61b\ua61c\ua61d\ua61e\ua61f\ua620\ua621\ua622\ua623\ua624\ua625\ua626\ua627\ua628\ua629\ua62a\ua62b\ua62c\ua62d\ua62e\ua62f\ua63c\ua630\ua631\ua632\ua63d\ua63e\ua63f' + '\ua640\ua641\ua642\ua643\ua644\ua645\ua646\ua647\ua648\ua649\ua64a\ua650\ua651\ua652\ua653\ua654\ua655\ua656\ua657\ua65a\ua65b\ua65d\ua65e\ua65f\ua661\ua662\ua663\ua664\ua665\ua666\ua667\ua66b\ua66c\ua66d\ua66e\ua66f\ua670\ua671\ua672\ua673\ua674\ua675\ua677\ua678\ua679\ua67a\ua67b\ua67c\ua67d\ua67e\ua67f\ua680\ua681\ua682\ua683\ua684\ua685\ua686\ua687\ua688\ua689\ua68a\ua68b\ua68c\ua68f\ua690\ua691\ua692\ua693\ua694\ua695\ua696\ua697\ua699\ua69a\ua69b\ua69c\ua69d\ua69e\ua69f\ua6a0\ua6a1\ua6a2\ua6a3\ua6a4\ua6a6\ua6a7\ua6a8\ua6ae\ua6a9\ua6aa\ua6ab\ua6ac\ua6af\ua6b0\ua6b1\ua6b2\ua6b3\ua6b4\ua6b5\ua6b6\ua6b8\ua6b9\ua6ba\ua6bb\ua6bc\ua6bd\ua6be\ua6bf\ua6c0\ua6c1\ua6c2\ua6c3\ua6c5\ua6c6\ua6c7\ua6c8\ua6c9\ua6ca\ua6cc\ua6ce\ua6cf\ua6d0\ua6d1\ua6d4\ua6d5\ua6d7\ua6d8' + '\ua6d9\ua6da\ua6db\ua6dd\ua6de\ua6e2\ua6e3\ua6e4\ua6e5\ua6e9\ua6ea\ua6eb\ua6ec\ua6ed\ua6ee\ua6ef\ua6f0\ua6f2\ua6f3\ua6f4\ua6f5\ua6f6\ua6f7\ua6f8\ua6fa\ua6fb\ua6fc\ua6fd\ua6fe\ua6ff\ua701\ua703\ua704\ua707\ua708\ua709\ua70a\ua70b\ua738\ua70c\ua710\ua711\ua712\ua713\ua716\ua717\ua718\ua71d\ua71e\ua720\ua721\ua725\ua726\ua72c\ua730\ua737\ua739\ua73a\ua73b\ua73c\ua73d\ua73e\ua73f\ua741\ua742\ua743\ua746\ua747\ua748\ua749\ua74a\ua74c\ua74d\ua74e\ua74f\ua750\ua757\ua758\ua759\ua75d\ua764\ua768\ua769\ua76d\ua770\ua771\ua772\ua773\ua774\u6a93\ua776\ua777\ua778\ua779\ua77a\ua77d\ua77e\ua77f\ua784\ua785\ua788\ua789\ua78a\ua78b\ua78c\ua78d\ua78e\ua792\ua793\ua794\ua795\ua796\ua79a\ua79b\ua79c\ua79d\ua79e\ua7a1\ua7a5\ua7a7\ua7a8\ua7a9\ua7aa\ua7ab\ua7ac\ua7ad\ua7be\ua7ae' + '\ua7af\ua7b0\ua7b1\ua7b3\ua7b4\ua7b6\ua7b8\ua7b9\ua7bb\ua7bc\ua7bd\ua7bf\ua7c0\ua7c1\ua7c2\ua7c3\ua7c4\ua7c5\ua7c6\ua7ca\ua7cb\ua7cc\ua7cd\ua7d1\ua7d3\ua7d4\ua7d5\ua7d6\ua7d8\ua7d9\ua7da\ua7db\ua7dc\ua7dd\ua7df\ua7e0\ua7e1\ua7e3\ua7e4\ua7e5\ua7e6\ua7e7\ua7e8\ua7e9\ua7ea\ua7ee\ua7f0\ua7f1\ua7f2\ua7f3\ua7f5\ua7f6\ua7f7\ua7f8\ua7fa\ua7fb\ua7fc\ua7fd\ua800\ua801\ua802\ua803\ua804\ua805\ua808\ua809\ua80e\ua80f\ua810\ua811\ua812\ua813\ua814\ua817\ua818\ua819\ua81c\ua81d\ua81e\ua81f\ua820\ua821\ua822\ua823\ua824\ua825\ua827\ua828\ua829\ua82c\ua82d\ua82e\ua82f\ua830\ua831\ua832\ua833\ua834\ua835\ua836\ua83a\ua83b\ua83c\ua83d\ua83e\ua83f\ua842\ua843\ua844\ua847\ua848\ua849\ua84a\ua84b\ua84e\ua84f\ua850\ua851\ua852\ua853\ua857\ua858\ua859\ua85a\ua860\ua861\ua865\ua867' + '\ua868\ua869\ua86a\ua86b\ua86c\ua86d\ua86e\ua86f\ua870\ua871\ua872\ua873\ua874\ua875\ua876\ua877\u526c\ua878\ua879\ua87a\ua87b\ua87c\ua87e\ua87f\ua880\ua881\ua884\ua885\ua886\ua889\ua88c\ua88d\ua88e\ua88f\ua891\ua892\ua894\ua895\u6a94\u5cce\u4336\u8604\u9026\u9268\u979c\ua120\ua156\u96b7\u629e\u47d6\u9820\u4a1b\u3d38\u56f4\u4824\u821c\u4e6c\u4100\u436c\u8d7f\u4a2e\u6a95\u71a0\u8411\u86c3\u8c77\u92d5\u727a\u5eac\u75d0\u754a\u3ec8\u5333\u5334\u838f\u8acb\u668c\u48ca\u7401\u99bd\ua3d6\u415c\u832d\u8490\u99ff\ua455\u3cfa\u3cfd\u3fef\u401c\u408d\u4191\u5a80\u6226\u6319\u765c\u76fd\u7df6\u7f24\u7f32\u7f48\u820a\u86c4\u9bd0\u9cb1\ua449\u6aeb\u63db\u73dc\u9971\u523d\u7a76\u67d6\u6d5a\u8e9c\ua3f9\ua464\ua483\ua484\ua4a3\ua4ba\ua4bb\ua698\ua7eb\ua7ec\u0000\u0000\u0000' + '\u3813\u3814\u3815\u3816\u3817\u3818\u3819\u381a\u381b\u381c\u381d\u381e\u381f\u3820\u3821\u3822\u3823\u3824\u3825\u3826\u3827\u3828\u3829\u382a\u382b\u382c\u382d\u382e\u382f\u3830\u3831\u3832\u3833\u3834\u3835\u3836\u3837\u3838\u3839\u383a\u383b\u383c\u383d\u383e\u383f\u3840\u3841\u3842\u3843\u3844\u3845\u3846\u3847\u3848\u3849\u384a\u384b\u384c\u384d\u384e\u384f\u3850\u3851\u3852\u3853\u3854\u3855\u3856\u3857\u3858\u3859\u385a\u385b\u385c\u385d\u385e\u385f\u3860\u3861\u3862\u3863\u3864\u3865\u3866\u3867\u3868\u3869\u386a\u386b\u386c\u386d\u386e\u386f\u3870\u3871\u3872\u3873\u3874\u3875\u3876\u3877\u3878\u3879\u387a\u387b\u387c\u387d\u387e\u387f\u3880\u3881\u3882\u3883\u3884\u3885\u3886\u3887\u3888\u3889\u388a\u388b\u388c\u388d\u388e\u388f\u3890\u3891\u3892' + '\u3893\u3894\u3895\u3896\u3897\u3898\u3899\u389a\u389b\u389c\u389d\u389e\u389f\u38a0\u38a1\u38a2\u38a3\u38a4\u38a5\u38a6\u38a7\u38a8\u38a9\u38aa\u38ab\u38ac\u38ad\u38ae\u38af\u38b0\u38b1\u38b2\u38b3\u38b4\u38b5\u38b6\u38b7\u38b8\u38b9\u38ba\u38bb\u38bc\u38bd\u38be\u38bf\u38c0\u38c1\u38c2\u38c3\u38c4\u38c5\u38c6\u38c7\u38c8\u38c9\u38ca\u38cb\u38cc\u38cd\u38ce\u38cf\u38d0\u38d1\u38d2\u38d3\u38d4\u38d5\u38d6\u38d7\u38d8\u38d9\u38da\u38db\u38dc\u38dd\u38de\u38df\u38e0\u38e1\u38e2\u38e3\u38e4\u38e5\u38e6\u38e7\u38e8\u38e9\u38ea\u38eb\u38ec\u38ed\u38ee\u38ef\u38f0\u38f1\u38f2\u38f3\u38f4\u38f5\u38f6\u38f7\u38f8\u38f9\u38fa\u38fb\u38fc\u38fd\u38fe\u38ff\u3900\u3901\u3902\u3903\u3904\u3905\u3906\u3907\u3908\u3909\u390a\u390b\u390c\u390d\u390e\u390f\u3910\u3911\u3912' + '\u3913\u3914\u3915\u3916\u3917\u3918\u3919\u391a\u391b\u391c\u391d\u391e\u391f\u3920\u3921\u3922\u3923\u3924\u3925\u3926\u3927\u3928\u3929\u392a\u392b\u392c\u392d\u392e\u392f\u3930\u3931\u3932\u3933\u3934\u3935\u3936\u3937\u3938\u3939\u393a\u393b\u393c\u393d\u393e\u393f\u3940\u3941\u3942\u3943\u3944\u3945\u3946\u3947\u3948\u3949\u394a\u394b\u394c\u394d\u394e\u394f\u3950\u3951\u3952\u3953\u3954\u3955\u3956\u3957\u3958\u3959\u395a\u395b\u395c\u395d\u395e\u395f\u3960\u3961\u3962\u3963\u3964\u3965\u3966\u3967\u3968\u3969\u396a\u396b\u396c\u396d\u396e\u396f\u3970\u3971\u3972\u3973\u3974\u3975\u3976\u3977\u3978\u3979\u397a\u397b\u397c\u397d\u397e\u397f\u3980\u3981\u3982\u3983\u3984\u3985\u3986\u3987\u3988\u3989\u398a\u398b\u398c\u398d\u398e\u398f\u3990\u3991\u3992' + '\u3993\u3994\u3995\u3996\u3997\u3998\u3999\u399a\u399b\u399c\u399d\u399e\u399f\u39a0\u39a1\u39a2\u39a3\u39a4\u39a5\u39a6\u39a7\u39a8\u39a9\u39aa\u39ab\u39ac\u39ad\u39ae\u39af\u39b0\u39b1\u39b2\u39b3\u39b4\u39b5\u39b6\u39b7\u39b8\u39b9\u39ba\u39bb\u39bc\u39bd\u39be\u39bf\u39c0\u39c1\u39c2\u39c3\u39c4\u39c5\u39c6\u39c7\u39c8\u39c9\u39ca\u39cb\u39cc\u39cd\u39ce\u39cf\u39d0\u39d1\u39d2\u39d3\u39d4\u39d5\u39d6\u39d7\u39d8\u39d9\u39da\u39db\u39dc\u39dd\u39de\u39df\u39e0\u39e1\u39e2\u39e3\u39e4\u39e5\u39e6\u39e7\u39e8\u39e9\u39ea\u39eb\u39ec\u39ed\u39ee\u39ef\u39f0\u39f1\u39f2\u39f3\u39f4\u39f5\u39f6\u39f7\u39f8\u39f9\u39fa\u39fb\u39fc\u39fd\u39fe\u39ff\u3a00\u3a01\u3a02\u3a03\u3a04\u3a05\u3a06\u3a07\u3a08\u3a09\u3a0a\u3a0b\u3a0c\u3a0d\u3a0e\u3a0f\u3a10\u3a11\u3a12' + '\u3a13\u3a14\u3a15\u3a16\u3a17\u3a18\u3a19\u3a1a\u3a1b\u3a1c\u3a1d\u3a1e\u3a1f\u3a20\u3a21\u3a22\u3a23\u3a24\u3a25\u3a26\u3a27\u3a28\u3a29\u3a2a\u3a2b\u3a2c\u3a2d\u3a2e\u3a2f\u3a30\u3a31\u3a32\u3a33\u3a34\u3a35\u3a36\u3a37\u3a38\u3a39\u3a3a\u3a3b\u3a3c\u3a3d\u3a3e\u3a3f\u3a40\u3a41\u3a42\u3a43\u3a44\u3a45\u3a46\u3a47\u3a48\u3a49\u3a4a\u3a4b\u3a4c\u3a4d\u3a4e\u3a4f\u3a50\u3a51\u3a52\u3a53\u3a54\u3a55\u3a56\u3a57\u3a58\u3a59\u3a5a\u3a5b\u3a5c\u3a5d\u3a5e\u3a5f\u3a60\u3a61\u3a62\u3a63\u3a64\u3a65\u3a66\u3a67\u3a68\u3a69\u3a6a\u3a6b\u3a6c\u3a6d\u3a6e\u3a6f\u3a70\u3a71\u3a72\u3a73\u3a74\u3a75\u3a76\u3a77\u3a78\u3a79\u3a7a\u3a7b\u3a7c\u3a7d\u3a7e\u3a7f\u3a80\u3a81\u3a82\u3a83\u3a84\u3a85\u3a86\u3a87\u3a88\u3a89\u3a8a\u3a8b\u3a8c\u3a8d\u3a8e\u3a8f\u3a90\u3a91\u3a92' + '\u3a93\u3a94\u3a95\u3a96\u3a97\u3a98\u3a99\u3a9a\u3a9b\u3a9c\u3a9d\u3a9e\u3a9f\u3aa0\u3aa1\u3aa2\u3aa3\u3aa4\u3aa5\u3aa6\u3aa7\u3aa8\u3aa9\u3aaa\u3aab\u3aac\u3aad\u3aae\u3aaf\u3ab0\u3ab1\u3ab2\u3ab3\u3ab4\u3ab5\u3ab6\u3ab7\u3ab8\u3ab9\u3aba\u3abb\u3abc\u3abd\u3abe\u3abf\u3ac0\u3ac1\u3ac2\u3ac3\u3ac4\u3ac5\u3ac6\u3ac7\u3ac8\u3ac9\u3aca\u3acb\u3acc\u3acd\u3ace\u3acf\u3ad0\u3ad1\u3ad2\u3ad3\u3ad4\u3ad5\u3ad6\u3ad7\u3ad8\u3ad9\u3ada\u3adb\u3adc\u3add\u3ade\u3adf\u3ae0\u3ae1\u3ae2\u3ae3\u3ae4\u3ae5\u3ae6\u3ae7\u3ae8\u3ae9\u3aea\u3aeb\u3aec\u3aed\u3aee\u3aef\u3af0\u3af1\u3af2\u3af3\u3af4\u3af5\u3af6\u3af7\u3af8\u3af9\u3afa\u3afb\u3afc\u3afd\u3afe\u3aff\u3b00\u3b01\u3b02\u3b03\u3b04\u3b05\u3b06\u3b07\u3b08\u3b09\u3b0a\u3b0b\u3b0c\u3b0d\u3b0e\u3b0f\u3b10\u3b11\u3b12' + '\u3b13\u3b14\u3b15\u3b16\u3b17\u3b18\u3b19\u3b1a\u3b1b\u3b1c\u3b1d\u3b1e\u3b1f\u3b20\u3b21\u3b22\u3b23\u3b24\u3b25\u3b26\u3b27\u3b28\u3b29\u3b2a\u3b2b\u3b2c\u3b2d\u3b2e\u3b2f\u3b30\u3b31\u3b32\u3b33\u3b34\u3b35\u3b36\u3b37\u3b38\u3b39\u3b3a\u3b3b\u3b3c\u3b3d\u3b3e\u3b3f\u3b40\u3b41\u3b42\u3b43\u3b44\u3b45\u3b46\u3b47\u3b48\u3b49\u3b4a\u3b4b\u3b4c\u3b4d\u3b4e\u3b4f\u3b50\u3b51\u3b52\u3b53\u3b54\u3b55\u3b56\u3b57\u3b58\u3b59\u3b5a\u3b5b\u3b5c\u3b5d\u3b5e\u3b5f\u3b60\u3b61\u3b62\u3b63\u3b64\u3b65\u3b66\u3b67\u3b68\u3b69\u3b6a\u3b6b\u3b6c\u3b6d\u3b6e\u3b6f\u3b70\u3b71\u3b72\u3b73\u3b74\u3b75\u3b76\u3b77\u3b78\u3b79\u3b7a\u3b7b\u3b7c\u3b7d\u3b7e\u3b7f\u3b80\u3b81\u3b82\u3b83\u3b84\u3b85\u3b86\u3b87\u3b88\u3b89\u3b8a\u3b8b\u3b8c\u3b8d\u3b8e\u3b8f\u3b90\u3b91\u3b92' + '\u3b93\u3b94\u3b95\u3b96\u3b97\u3b98\u3b99\u3b9a\u3b9b\u3b9c\u3b9d\u3b9e\u3b9f\u3ba0\u3ba1\u3ba2\u3ba3\u3ba4\u3ba5\u3ba6\u3ba7\u3ba8\u3ba9\u3baa\u3bab\u3bac\u3bad\u3bae\u3baf\u3bb0\u3bb1\u3bb2\u3bb3\u3bb4\u3bb5\u3bb6\u3bb7\u3bb8\u3bb9\u3bba\u3bbb\u3bbc\u3bbd\u3bbe\u3bbf\u3bc0\u3bc1\u3bc2\u3bc3\u3bc4\u3bc5\u3bc6\u3bc7\u3bc8\u3bc9\u3bca\u3bcb\u3bcc\u3bcd\u3bce\u3bcf\u3bd0\u3bd1\u3bd2\u3bd3\u3bd4\u3bd5\u3bd6\u3bd7\u3bd8\u3bd9\u3bda\u3bdb\u3bdc\u3bdd\u3bde\u3bdf\u3be0\u3be1\u3be2\u3be3\u3be4\u3be5\u3be6\u3be7\u3be8\u3be9\u3bea\u3beb\u3bec\u3bed\u3bee\u3bef\u3bf0\u3bf1\u3bf2\u3bf3\u3bf4\u3bf5\u3bf6\u3bf7\u3bf8\u3bf9\u3bfa\u3bfb\u3bfc\u3bfd\u3bfe\u3bff\u3c00\u3c01\u3c02\u3c03\u3c04\u3c05\u3c06\u3c07\u3c08\u3c09\u3c0a\u3c0b\u3c0c\u3c0d\u3c0e\u3c0f\u3c10\u3c11\u3c12' + '\u3c13\u3c14\u3c15\u3c16\u3c17\u3c18\u3c19\u3c1a\u3c1b\u3c1c\u3c1d\u3c1e\u3c1f\u3c20\u3c21\u3c22\u3c23\u3c24\u3c25\u3c26\u3c27\u3c28\u3c29\u3c2a\u3c2b\u3c2c\u3c2d\u3c2e\u3c2f\u3c30\u3c31\u3c32\u3c33\u3c34\u3c35\u3c36\u3c37\u3c38\u3c39\u3c3a\u3c3b\u3c3c\u3c3d\u3c3e\u3c3f\u3c40\u3c41\u3c42\u3c43\u3c44\u3c45\u3c46\u3c47\u3c48\u3c49\u3c4a\u3c4b\u3c4c\u3c4d\u3c4e\u3c4f\u3c50\u3c51\u3c52\u3c53\u3c54\u3c55\u3c56\u3c57\u3c58\u3c59\u3c5a\u3c5b\u3c5c\u3c5d\u3c5e\u3c5f\u3c60\u3c61\u3c62\u3c63\u3c64\u3c65\u3c66\u3c67\u3c68\u3c69\u3c6a\u3c6b\u3c6c\u3c6d\u3c6e\u3c6f\u3c70\u3c71\u3c72\u3c73\u3c74\u3c75\u3c76\u3c77\u3c78\u3c79\u3c7a\u3c7b\u3c7c\u3c7d\u3c7e\u3c7f\u3c80\u3c81\u3c82\u3c83\u3c84\u3c85\u3c86\u3c87\u3c88\u3c89\u3c8a\u3c8b\u3c8c\u3c8d\u3c8e\u3c8f\u3c90\u3c91\u3c92' + '\u3c93\u3c94\u3c95\u3c96\u3c97\u3c98\u3c99\u3c9a\u3c9b\u3c9c\u3c9d\u3c9e\u3c9f\u0000\u0000\u0000\u0fa3\u0fa4\u0fa5\u0fa6\u0fa7\u0fa8\u0fa9\u0faa\u0fab\u0fac\u0fad\u0fae\u0faf\u0fb0\u0fb1\u0fb2\u0fb3\u0fb4\u0fb5\u0fb6\u0fb7\u0fb8\u0fb9\u0fba\u0fbb\u0fbc\u0fbd\u0fbe\u0fbf\u0fc0\u0fc1\u0fc2\u0fc3\u0fc4\u0fc5\u0fc6\u0fc7\u0fc8\u0fc9\u0fca\u0fcb\u0fcc\u0fcd\u0fce\u0fcf\u0fd0\u0fd1\u0fd2\u0fd3\u0fd4\u0fd5\u0fd6\u0fd7\u0fd8\u0fd9\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u3ca6\u3ca7\u3ca8\u3ca9\u3caa\u3cab\u3cac\u3cad\u3cae\u3caf\u3cb0\u3cb1\u3cb2\u3cb3\u3cb4\u3cb5\u3cb6\u3cb7\u3cb8\u3cb9\u3cba\u3cbb\u3cbc\u3cbd\u3cbe\u3cbf\u3cc2\u3cc0\u3cc3\u3cc1\u3cc4\u3cc5\u3cc6\u3cc7\u3cc8\u3cc9\u3cca\u3ccb\u3ccc\u3ccd\u3ca0\u3ca1\u3ca2\u3ca3\u3ca5\u3ca4\u0228\u0299' + '\u32c1\u32c2\u32c3\u32c4\u32c5\u32c6\u32c7\u32c8\u32c9\u32ca\u32cb\u32cc\u32cd\u32cf\u32d0\u32d1\u32d2\u32d3\u32d4\u32d5\u32d6\u32d7\u32d8\u32d9\u32da\u32db\u32dc\u32dd\u32de\u32df\u32e0\u32e2\u32e3\u32e4\u32e5\u32e6\u32e7\u32e8\u32e9\u32ea\u32eb\u32ec\u32ed\u32ee\u32ef\u32f0\u32f1\u32f2\u32f3\u32f4\u32f5\u32f6\u32f8\u32f9\u32fa\u32fb\u32fc\u32fd\u32fe\u32ff\u3300\u3301\u3302\u3303\u3304\u3305\u3306\u3307\u3308\u3309\u330a\u330b\u330d\u330e\u330f\u3310\u3311\u3312\u3313\u3314\u3315\u3316\u3317\u3319\u331a\u331b\u331c\u331d\u331e\u3321\u3322\u3324\u3325\u3326\u3327\u3328\u3329\u332b\u332c\u332d\u332e\u332f\u3330\u3331\u3332\u3333\u3334\u3336\u3337\u3338\u3339\u333b\u333c\u333d\u333e\u333f\u3340\u3341\u3342\u3343\u3344\u3345\u3346\u3347\u3348\u3349\u334a\u334b' + '\u334c\u334d\u334e\u334f\u3350\u3351\u3353\u3354\u3356\u3357\u3358\u3359\u335a\u335b\u335c\u335d\u335e\u335f\u3360\u3361\u3362\u3363\u3364\u3365\u3366\u3367\u3368\u3369\u336a\u336b\u336c\u336d\u336e\u336f\u3370\u3371\u3372\u3373\u3374\u3375\u3376\u3377\u3378\u3379\u337a\u337b\u337c\u337d\u337e\u337f\u3380\u3381\u3382\u3384\u3385\u3386\u3387\u3388\u3389\u338a\u338b\u338c\u338d\u338e\u338f\u3390\u3391\u3392\u3393\u3394\u3395\u3396\u3397\u3398\u3399\u339a\u339c\u339d\u339e\u339f\u33a0\u33a1\u33a4\u33a5\u33a6\u33a7\u33a8\u33a9\u33aa\u33ac\u33ad\u33ae\u33af\u33b0\u33b1\u33b2\u33b3\u33b4\u33b5\u33b6\u33b7\u33b8\u33b9\u33ba\u33bb\u33bc\u33bd\u33be\u33bf\u33c0\u33c1\u33c2\u33c3\u33c4\u33c5\u33c6\u33c7\u33c8\u33c9\u33ca\u33cb\u33cc\u33cd\u33ce\u33cf\u33d0\u33d1\u33d2' + '\u33d3\u33d4\u33d5\u33d6\u33d7\u33d8\u33d9\u33da\u33db\u33dc\u33dd\u33de\u33df\u0229\u029a\u027f\u331f\u3335\u3355\u32ce\u32e1\u32f7\u330c\u3318\u3320\u3323\u332a\u3352\u3383\u339b\u33a3\u33ab\u10c0\u10f2\u116b\u11bf\u1203\u1243\u127c\u12b1\u12e7\u131c\u333a\u33a2\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u1bc0\u1bbf\u1bc6\u1bc5\u1bca\u1bc9\u1be4\u1be3\u1beb\u1be9\u1c7d\u1c7a\u1c98\u1c97\u1cc8\u1cc7\u1cd1\u1cd0\u1ce2\u1ce1\u1ceb\u1cea\u1cee\u1cec\u1cfa\u1cf9\u1cff\u1cfe\u1d03\u1d02\u1d13\u1d12\u1ca1\u1ca0\u1b9c\u1b9b\u1c0e\u1c0d\u1c19\u1c18\u1c38\u1c31\u1c39\u1c32\u1c3a\u1c33\u1c34\u00c4\u0000\u0000\u0000\u0417\u1bab\u1bd4\u1be1\u1c6c\u1ccd\u1cd3\u1cd8\u1c93\u0059\u005a\u0463\u1cca' + '\u1b98\u1b97\u1bd2\u1bd1\u1bb7\u1bb6\u1cb8\u1cb7\u1bce\u1bcd\u1c68\u1c67\u1c62\u1c61\u1ca3\u1ca2\u1ca7\u1ca6\u1cb0\u1caf\u1c91\u1c90\u1cc3\u1cc2\u1c3b\u1c35\u1c3c\u1c36\u1ccf\u1cda\u1c81\u1cf4\u33e0\u33e1\u33e2\u33e3\u33e4\u33e5\u33e6\u33e7\u33e8\u33e9\u33ea\u33eb\u33ec\u33ed\u33ee\u33ef\u33f0\u33f1\u33f2\u33f3\u33f4\u33f5\u33f6\u33f7\u33f8\u33f9\u33fa\u33fb\u33fc\u33fd\u33fe\u33ff\u3400\u3401\u3402\u3403\u3404\u3405\u3406\u3407\u3408\u3409\u340a\u340b\u340c\u340d\u340e\u340f\u3410\u3411\u3412\u3413\u3414\u3415\u3416\u3417\u3418\u3419\u341a\u341b\u341c\u341d\u341e\u341f\u3420\u3421\u3422\u3423\u3424\u3425\u3426\u3427\u3428\u3429\u342a\u342b\u342c\u342d\u342e\u342f\u0145\u0146\u02d4\u029b\u0265\u022a\u0239\u0280\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0522\u0523\u0524\u0525\u0526\u0527\u0528\u0529\u052a\u052b\u052c\u052d\u052e\u052f\u0530\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540\u0541\u0542\u0543\u1972\u1971\u197e\u197d\u1532\u1531\u180b\u180a\u195e\u195d\u1960\u195f\u1962\u1961\u14be\u17d0\u138a\u1389\u138d\u138c\u138f\u138e\u1393\u1392\u1383\u1382\u1395\u1394\u1401\u1400\u15cb\u15ca\u15cd\u15cc\u15cf\u15ce\u1602\u1601\u1605\u1604\u1711\u1710\u1707\u1706\u16f0\u16ef\u1738\u1737\u173e\u173d\u1740\u173f\u174f\u174e\u1751\u1750\u1785\u1783\u17a4\u17a3\u18a6\u18a5\u18a3\u18a2\u193a\u1939\u1949\u1948\u194b\u194a\u194f\u194e\u1954\u1953\u1956\u1955\u1959\u1957\u195a\u1443\u161a\u1653\u168f\u17a1\u17a2\u1819\u195b\u1423\u1422\u14b5\u14b4\u14e4\u14f8\u14f7' + '\u161d\u161c\u1777\u1776\u17c1\u17c0\u1800\u17ff\u0544\u0545\u0546\u1974\u1973\u187c\u1618\u1975\u1689\u1688\u13f7\u13f6\u13f8\u1527\u13c7\u13c6\u14c1\u14c0\u134c\u134a\u16ae\u16ac\u1836\u1834\u14e2\u14e1\u15af\u15ae\u166c\u166b\u176d\u176c\u17b9\u17b8\u1529\u14a0\u14eb\u1611\u1574\u174d\u15d1\u181b\u1598\u18eb\u13cf\u13cd\u1714\u1713\u1874\u1873\u139c\u139b\u1581\u1580\u187a\u1879\u0000\u0000\u18cc\u18cb\u13f9\u17d6\u192e\u1438\u1437\u17d2\u17d1\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u1530\u152f\u1577\u1519\u16ee\u1883\u14c8\u1741\u1651\u1576\u1652' + '\u2866\u2867\u2868\u2869\u286a\u286b\u286c\u286e\u286f\u2870\u2871\u0176\u2872\u2873\u2874\u2875\u2876\u2877\u2878\u2879\u287a\u287b\u287c\u287d\u287e\u287f\u2880\u2881\u2882\u2883\u2884\u2885\u2886\u2887\u2888\u2889\u288a\u288b\u288c\u288d\u0571\u0572\u0573\u0574\u286d\u0000\u0000\u0000\u1025\u1026\u1027\u1028\u1029\u102a\u0575\u0576\u107c\u0577\u0000\u0000\u0000\u0000\u0000\u0000\u2a73\u2a74\u2a75\u2a76\u2a77\u2a78\u2a79\u2a7a\u2a7f\u2a80\u2a81\u2a82\u2a83\u2a84\u2a85\u2a86\u2a87\u2a88\u2a89\u2a8a\u2a8c\u2a8d\u2a8e\u2a8f\u2a92\u2a95\u2a96\u2a98\u2a99\u2a9c\u2aa1\u2aa2\u2aa3\u2aa4\u2a9d\u2a9e\u2a9f\u2aa0\u2aa5\u2a8b\u2a90\u2a7b\u2a7c\u2a7d\u2a7e\u2a91\u2a97\u2a9a\u2a9b\u2a93\u2a94\u2aa6\u04b6\u04b7\u02a9\u02aa\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0177\u0189\u288e\u288f\u2890\u2891\u2892\u2893\u2894\u2895\u2896\u2897\u2898\u2899\u289a\u289b\u289c\u289d\u289e\u289f\u28a0\u28a1\u28a2\u28a3\u28a4\u28a5\u28a6\u28a7\u28a8\u28a9\u28aa\u28ab\u28ac\u28ad\u28ae\u28af\u28b0\u28b1\u28b2\u28b3\u28b4\u28b5\u28b6\u28b7\u28b8\u28b9\u28ba\u28bb\u28bc\u28bd\u28be\u28bf\u28c0\u28c1\u28c2\u28c3\u28c4\u28c5\u28c6\u28c7\u28c8\u28c9\u28ca\u28cb\u28cc\u28cd\u28ce\u28cf\u28d0\u0161\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u02a5\u02a6\u10c1\u10f3\u116c\u11c0\u1204\u1244\u127d\u12b2\u12e8\u131d\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u258e\u258f\u2590\u2591\u2592\u2593\u0474\u0475\u0476\u2594\u0477\u2532\u2548\u25a9' + '\u10c2\u10f4\u116d\u11c1\u1205\u1245\u127e\u12b3\u12e9\u131e\u2b9d\u2b9e\u2b9f\u2ba0\u2ba1\u2ba2\u2ba3\u2ba4\u2ba5\u2ba6\u2ba7\u2ba8\u2ba9\u2baa\u2bab\u2bac\u2bad\u2bae\u2baf\u2bb0\u2bb1\u2bb2\u2bb3\u2bb4\u2bb5\u2bb6\u2bb7\u2bb8\u2bb9\u2bba\u2bbb\u2bbc\u2bbd\u01a3\u01a4\u01a5\u04bc\u02ad\u2b79\u2b7a\u2b7b\u2b7c\u2b7d\u2b7e\u2b7f\u2b80\u2b81\u2b82\u2b83\u2b84\u2b85\u2b86\u2b87\u2b88\u2b89\u2b8a\u2b8b\u2b8c\u2b8d\u2b8e\u2b8f\u2b90\u2b91\u2b92\u2b93\u2b94\u2b95\u2b96\u2b97\u2b98\u2b99\u2b9a\u2b9b\u2b9c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u02d5\u34ef\u34f0\u34f1\u34f2\u34f3\u34f4\u34f5\u34f6\u34f7\u34f8\u34f9\u34fa\u34fb\u34fc\u34fd\u34fe\u34ff\u3500\u3501\u3502\u3503\u3504\u3505\u3506\u3507\u3508\u3509\u350a\u350b\u0000\u0000\u0000' + '\u0162\u0178\u018f\u018a\u2dfe\u2dff\u2e00\u2e01\u2e02\u2e03\u2e04\u2e05\u2e06\u2e07\u2e08\u2e09\u2e0a\u2e0b\u2e0c\u2e0d\u2e0e\u2e0f\u2e10\u2e11\u2e12\u2e13\u2e14\u2e15\u2e16\u2e17\u2e18\u2e19\u2e1a\u2e1b\u2e1c\u2e1d\u2e1e\u2e1f\u2e20\u2e21\u2e22\u2e23\u2e24\u2e26\u2e27\u2e29\u2e2a\u2e2b\u2e2c\u2e2d\u2e2e\u0153\u2e2f\u2e30\u2e32\u2e33\u2e34\u2e35\u2e37\u2e38\u2e31\u2e36\u2e25\u2e28\u2e39\u02ca\u02cb\u02cc\u02cd\u02ce\u02cf\u0261\u02b8\u02b9\u02d0\u02d1\u02d2\u02d3\u0000\u1057\u10c3\u10f5\u116e\u11c2\u1206\u1246\u127f\u12b4\u12ea\u131f\u0000\u0000\u0000\u0000\u04bd\u04be\u2bc7\u2bcf\u2bd9\u2bef\u2c08\u2c54\u1058\u2be1\u2c03\u2bc5\u2bc8\u2bd4\u2bdb\u2be9\u2bec\u2bf0\u10c4\u10f6\u116f\u11c3\u1207\u1247\u1280\u12b5\u12eb\u1320\u2c25\u2bf5\u2bf8\u2c06\u2c09\u0000' + '\u2d73\u2d74\u2d75\u2d76\u2d77\u2d78\u2d79\u2d7a\u2d7b\u2d7c\u2d7d\u2d7e\u2d7f\u2d80\u2d81\u2d82\u2d83\u2d84\u2d85\u2d86\u2d87\u2d88\u2d89\u2d8a\u2d8b\u2d8c\u2d8d\u2d8e\u2d8f\u2d90\u2d91\u2d92\u2d93\u2d94\u2d95\u2d96\u2d97\u2d98\u2d99\u2d9a\u2d9b\u2da0\u2da1\u2da2\u2da3\u2da4\u2da5\u2da6\u2da7\u2da8\u2da9\u2d9c\u2d9d\u2d9e\u2d9f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2daa\u2dab\u2dac\u2dad\u2dae\u2daf\u2db0\u2db1\u2db2\u2db3\u2db4\u2db5\u2db6\u2db7\u0000\u0000\u10c5\u10f7\u1170\u11c4\u1208\u1248\u1281\u12b6\u12ec\u1321\u0000\u0000\u04bf\u02ba\u02bb\u02bc\u2bc4\u2bcd\u2bd0\u2bd3\u2bda\u2be0\u2be4\u2be6\u2be8\u2beb\u2bf7\u2bfb\u2c1d\u2c20\u2c22\u2c01\u1059\u2c23\u2bd6\u2c0f\u2c6c\u2c6d\u2c6e\u05a0\u05a1\u05a2\u2c10\u2c69\u2c6a\u2c6b\u2bd1\u2bdd' + '\u2985\u2986\u2987\u2988\u2989\u298a\u298b\u298c\u298d\u298e\u298f\u2990\u2991\u2992\u2993\u2994\u2995\u2996\u2997\u2998\u2999\u299a\u299b\u299c\u299d\u299e\u299f\u29a0\u29a1\u29a2\u29a3\u29a4\u29a5\u29a6\u29a7\u29a8\u29a9\u29aa\u29ab\u29ac\u29ad\u29ae\u29af\u29b0\u29b1\u29b2\u29b3\u29b4\u29b5\u29b6\u29b7\u29b8\u29b9\u29ba\u29bb\u29bc\u29bd\u29be\u29bf\u29c0\u29c1\u29c2\u29c3\u01a0\u29c4\u01a1\u29c5\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u29c6\u29c7\u105a\u0481\u0482\u2843\u2844\u2845\u2846\u2847\u2848\u2849\u284a\u284b\u284c\u284d\u2856\u2857\u2858\u2859\u285a\u02bd\u0281\u2827\u105b\u105c\u285b\u2865\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u23ac\u23ad\u23ae\u23af\u23b0\u23b1\u0000\u0000\u2473\u2474\u2475\u2476\u2477\u2478\u0000\u0000\u2454\u2455\u2456\u2457\u2458\u2459\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u24b6\u24b7\u24b8\u24b9\u24ba\u24bb\u24bc\u0000\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u0000\u13a8\u13a0\u1487\u1488\u148c\u14bf\u14ed\u1612\u160d\u160f\u1650\u168e\u1693\u16f4\u16fd\u1703\u16f9\u16f7\u16f8\u16fa\u16fb\u177e\u1782\u1799\u179a\u1795\u179b\u179c\u179d\u17e0\u1868\u1872\u186d\u186e\u1877\u18ea\u18ec\u18ed\u18e6\u18e7\u18e8\u18e9\u190f\u0547\u1533\u1613\u160c\u1878\u1950\u1951\u1705\u1952\u13ad\u1aee\u1432\u1808\u17a0\u18d1\u04f8\u04f9\u0000\u0000\u0000\u0000\u2ee2\u2ee4\u2ee6\u2ee8\u2eea\u2eec\u2eee\u2ef0\u2ef2\u2ef4\u2ef6\u2ef8\u2efa\u2efc\u2efe\u2f00' + '\u2f02\u2f04\u2f06\u2f08\u2f0a\u2f0c\u2f0e\u2f10\u2f12\u2f14\u2f16\u2f18\u2f1a\u2f1c\u2f1e\u2f20\u2f22\u2f24\u2f26\u2f28\u2f2a\u2f2c\u2f2e\u2f30\u2f32\u2f34\u2f36\u2f38\u2f3a\u2f3c\u2f3e\u2f40\u2f42\u2f44\u2f46\u2f48\u2f4a\u2f4c\u2f4e\u2f50\u2f52\u2f54\u2f56\u2f58\u2f5a\u2f5c\u2f5e\u2f60\u2f62\u2f64\u2f66\u2f68\u2f6a\u2f6c\u2f6e\u2f70\u2f72\u2f74\u2f76\u2f78\u2f7a\u2f7c\u2f7e\u2f80\u2828\u2829\u282a\u282b\u282c\u282d\u282e\u282f\u2830\u2831\u2832\u2833\u2834\u2835\u2836\u2837\u2838\u2839\u283a\u283b\u283c\u283d\u283e\u283f\u2840\u2841\u2842\u285c\u285d\u285e\u285f\u2860\u2861\u2862\u2863\u284e\u284f\u2850\u2851\u2852\u2853\u2854\u2855\u02be\u0191\u2864\u0000\u0000\u10c6\u10f8\u1171\u11c5\u1209\u1249\u1282\u12b7\u12ed\u1322\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u3589\u358a\u358b\u358c\u358d\u358e\u358f\u3590\u3591\u3592\u3593\u3594\u3595\u3596\u3597\u3598\u3599\u359a\u359b\u359c\u359d\u359e\u359f\u0000\u0000\u0000\u0000\u3615\u3616\u3617\u3618\u3619\u361a\u361b\u361c\u361d\u361e\u361f\u3620\u3621\u3622\u3623\u3624\u3625\u3626\u3627\u3628\u3629\u362a\u362b\u362c\u362d\u362e\u362f\u3630\u3631\u3632\u3633\u3634\u3635\u3636\u3637\u3638\u3639\u363a\u363b\u363c\u363d\u363e\u363f\u3640\u3641\u3642\u3643\u3644\u3645\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\uab2c\ua9c8\uab3e\uab33\uaa0a\ua8a9\ua915\uabe6\uabe7\ua93f\uab62\ua91e\ua93e\ua998\uaa58\uaab8\uaaf6\uaafc\uab06\uab54\ua9dd\ua9fd\uaa18\uaa3c\uaaec\uab5b\uabaf\ua8b4\ua90e\ua9e2\uaa1f\uaaf5\uabc3\ua960\uaa10\uaaf1\uab09\ua9a0\uaad1\uaafd\ua971\ua9cd\uaa01\uaa32\uab57\ua8c6\ua8e0\ua8f7\ua9aa\ua9e1\uaa1e\uaa61\uaac0\uaaf3\uaaf9\uab3c\uab87\uabbd\uabc2\uaa6d\uaa81\uaaa5\uaae9\uab67\uabc7\uab1c\ua934\ua978\uaa98\uaaca\uaa2c\uaa6f\uab31\uab86\ua933\ua959\ua9e0\uaa04\uaa0c\uaaa3\uaaab\uab75\ua8f6\uaad0\ua8e3\ua8e2\uaa8a\uaaa6\uaaeb\uab77\uab27\ua9a1\ua9de\uab20\ua8ac\ua94b\ua988\uaa37\uaa50\ua8fd\uaa71\ua8c9\ua982\ua8a2\ua9fa\ua9b0\uaaa2\ua912\ua930\uaa65\uaaed\uab17\ua9ec\uab47\ua9f9\ua9a3\uaae6\ua9a5\uaa4f\ua8bc\ua8d4\ua8e1\ua9da\uaa9e\uaade\uab1b\uab61\ua8f9' + '\ua91a\ua941\ua975\ua9b7\uaa11\uaa72\uab6f\uabb0\uabc9\uabd1\ua8f0\ua9c6\ua9e6\uab44\ua96a\ua995\ua999\ua9a9\uaa0f\uaa19\uaa42\uaa88\uaaa7\uaac9\uab40\uaaef\uab4e\uab68\ua8ec\ua8f2\ua91b\uaa17\uab03\uab18\ua970\ua987\ua9a4\ua9ea\uaa97\uaa35\ua8c1\ua929\ua94c\ua961\ua989\uaa3b\uaa40\uaabd\uaac8\uab65\uab85\uab88\uab9a\ua8c7\uaa85\uab5d\uab7e\ua98d\ua8b6\ua8cb\ua94d\ua958\ua9b4\ua9df\uaa1c\uaa57\uaaf0\uab53\uabe1\ua9c3\uab74\ua8ef\ua9d4\ua9d6\ua9ff\uaa07\uaa3e\uaa4e\uaa6c\uaaa1\uab9d\ua8d7\ua99b\uab78\ua8ca\ua95f\uaa05\uab41\ua981\ua98f\ua9d7\uaa38\uab7a\ua8ed\ua918\ua95b\ua9bf\ua9d2\ua9dc\ua9fb\uaa3d\uaa54\uaab7\uab04\uab05\uab5f\uab80\ua901\uaa08\ua919\uaa1d\uaa43\uaaf2\uab7b\uabbe\uabca\ua9d5\uaa03\uaad3\uaa8f\uaa93\uaa9b\uaa31\uaa16\uab26\ua8c0\uaae7\ua8ee' + '\ua8eb\ua96f\ua9a2\uaa9d\ua949\ua9fe\ua9c5\uab43\uaaff\uab76\uab0e\ua973\ua8cf\ua922\u441d\u48f9\ua92e\u5023\ua9c1\u6003\u6072\ua8e4\uaa33\uaa5d\uaa76\uaa7f\uaa80\uaa84\uab8b\uaa9c\uaabe\u8605\uaaf4\u8789\uab1e\u9034\u938c\uab4f\uab59\u9742\u979d\u9b9c\uaba7\uaba8\uaba9\uabc1\uab58\uab7d\ua8c8\ua8cc\ua8d1\ua8f5\ua8f8\ua907\ua920\ua924\ua925\ua92d\ua931\ua95a\ua95c\ua98b\ua992\ua993\ua996\ua9ae\ua9ba\ua9c4\ua9db\uaa02\uaa06\uaa0d\uaa1a\uaa21\uaa3f\uaa6e\uaa77\uaa7a\uaa79\uaa7b\uaa7c\uaa7d\uaa82\uaa83\uaa8b\uaa8d\uaa95\uaaa8\uaaaa\uaaac\uaab6\uaac3\uaad5\uaae1\uaae2\uaaee\uab07\uab10\uab22\uab24\uab34\uab35\uab4a\uab50\uab81\uab95\uab9b\ua98a\uabf4\uaada\u0000\u0000\ua8a4\ua8df\ua8d3\ua8c5\ua8d0\ua8d9\ua8f4\ua8fb\ua921\ua91d\ua91f\ua923\ua92f\ua932\ua93d\ua940' + '\ua944\ua945\ua972\ua974\ua97f\ua983\ua98c\ua990\ua98e\ua994\ua991\ua997\ua99c\ua9a6\ua9a7\ua9a8\ua9af\ua9c2\ua9ce\ua9cf\ua9d3\ua9e7\ua9ed\uaa00\uaa0b\uaa09\uaa0e\uaa12\uaa1b\uaa68\uaa24\uaa30\uaa34\uaa41\uaa46\uaa4d\uaa55\uaa56\uaa5e\uaa5f\uaa64\uaa67\uaa66\uaa70\uaa8e\uaa96\uaa9a\uaaa4\uaaa9\uaaaf\uaac4\uaae8\uaaea\uaafb\uab08\uab0d\uab11\uab19\uab1f\uab1a\uab23\uab21\uab1d\uab25\uab28\uab36\uab42\uab52\uab5c\uab66\uab79\uab82\uab8c\uab91\uab96\uab99\uab9c\uabb6\uabe8\uabf2\uabf1\uabf3\uabee\uabef\uabf0\uabf5\uabf6\uabf7\uabda\uabe4\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' + '\u14b7\u14ba\u14bb\u14b8\u14b9\u17cb\u17ce\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u1e52\u1e4f\u1e50\u1e68\u1e51\u0000\u0000\u0000\u0000\u0000\u1e9a\u00d6\u1e9e\u1eb2\u1e7c\u1e8a\u1e8d\u1ea0\u1ea6\u1ea9\u1ebe\u1ec7\u0678\u1ec2\u1ec1\u1ec5\u1ec4\u1e7d\u1e7e\u1e7f\u1e83\u1e87\u1e8b\u1e8e\u1e91\u1e95\u0000\u1e98\u1e9b\u1ea3\u1ea2\u1ea7\u0000\u1eab\u0000\u1eae\u1eb0\u0000\u1eb6\u1eb5\u0000\u1eba\u1ebc\u1ebf\u1ec3\u1ec8\u1e90\u1e84\u1ea4\u1eb7\u1e80\u1ef0\u1eef\u1f4e\u1f4d\u1f4b\u1f4c\u1f53\u1f52\u1f50\u1f51\u1f58\u1f57\u1f55\u1f56\u1fa9\u1fa8\u1fa6\u1fa7\u1fb0\u1faf\u1fad\u1fae\u1fa4\u1fa3\u1fa1\u1fa2\u212a\u2129\u2127\u2128\u2131\u2130\u212e\u212f\u1fd1\u1fd0\u1fce\u1fcf\u1fcc\u1fcb\u1fc9\u1fca\u1fd6\u1fd5\u1fd3\u1fd4\u1fdc\u1fdb' + '\u1fd9\u1fda\u201a\u2019\u2017\u2016\u201e\u201d\u2011\u2010\u2038\u2037\u202f\u202e\u216c\u216b\u2169\u216a\u217c\u217b\u2179\u217a\u2189\u2188\u2186\u2187\u2183\u2182\u2180\u2181\u2208\u2207\u220e\u220d\u220b\u220c\u2233\u2232\u222c\u222b\u2229\u222a\u2227\u2226\u2224\u2225\u2292\u2291\u2295\u2294\u0554\u0555\u0556\u0557\u0558\u0559\u055a\u055b\u055c\u055d\u055e\u055f\u0560\u0561\u0562\u0563\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2175\u2174\u2172\u2173\u2243\u2242\u2240\u223f\u2248\u2247\u2245\u224f\u224e\u223d\u223c\u224b\u224a\u2286\u2285\u2283\u2284\u2256\u2257\u1f00\u1eff\u1f10\u1f0f\u1f12\u1f11\u1f16\u1f15\u1f14\u1f13\u1f18\u1f17\u1f22\u1f21\u1f20\u1f1c\u1f1a\u1f19\u227f\u227e\u227c\u227d' + '\u1f02\u1f04\u1f0b\u1f1d\u1f1f\u1f36\u1f38\u1f3b\u1f42\u1f47\u1f49\u1f6e\u1f73\u1f78\u1f81\u1f8b\u1f8d\u1f93\u1f99\u1f9d\u1f9f\u1fba\u1fbf\u1fe7\u1fea\u1ff7\u1ff8\u1ffa\u2049\u204e\u2052\u2059\u2099\u20a5\u20b2\u20b4\u20b8\u20be\u20cd\u20d0\u20e0\u20e9\u20ee\u20fd\u20ff\u2114\u2116\u2118\u211c\u211f\u2121\u213b\u213e\u2144\u2146\u2152\u2154\u2156\u2158\u215c\u2160\u2165\u2167\u219f\u21a6\u21ac\u21b2\u21b8\u21ba\u21ca\u21d0\u21d6\u21dc\u21de\u21df\u21e9\u21f1\u21f6\u21fc\u2203\u2205\u221c\u221e\u2221\u2222\u2264\u2267\u226a\u2270\u2278\u227a\u200e\u2027\u225b\u01cb\u01cc\u01ce\u01d0\u01d2\u01d3\u1f06\u1f07\u1f0a\u1f0c\u1f1b\u1f1e\u1f3d\u1f3e\u1f41\u1f43\u1f46\u1f48\u1f7c\u1f7d\u1f80\u1f87\u1f8a\u1f8c\u1f94\u1f95\u1f98\u1f9a\u1f9c\u1f9e\u211e\u2120\u2143\u2145' + '\u2151\u215b\u215f\u2164\u2166\u21b1\u21b7\u21b9\u21c8\u21db\u21f7\u21f8\u21fb\u21ff\u2202\u2204\u225a\u226b\u226c\u226f\u2274\u2277\u2279\u1f01\u1f03\u1f05\u1f08\u1f0d\u1f35\u1f37\u1f3a\u1f3f\u1f44\u1f6d\u1f72\u1f77\u1f7e\u1f88\u1f96\u1fb9\u1fbe\u1fe6\u1fe9\u1ff6\u1ff9\u2047\u204c\u2050\u2057\u2098\u209d\u20a4\u20b1\u20b3\u20b7\u20bd\u20cc\u20de\u20e8\u20ed\u20fc\u20fe\u2113\u2115\u2117\u211b\u213a\u213d\u2153\u2155\u2157\u2159\u215d\u219e\u21a5\u21ab\u21af\u21b6\u21c9\u21cf\u21d5\u21da\u21e8\u21f0\u21f5\u21f9\u2200\u221b\u221d\u221a\u2263\u2266\u2269\u226d\u2275\u1f09\u1f0e\u1f40\u1f45\u1f7f\u1f89\u1f97\u1f9b\u2058\u2060\u207d\u2085\u215a\u215e\u21b0\u21fa\u2201\u226e\u2276\u01cd\u01cf\u01d1\u20d6\u20d8\u20f4\u20f6\u2104\u2106\u2062\u2064\u2087\u2089\u1fee' + '\u1ff0\u1fc5\u1fc7\u1ffc\u1ffe\u20a9\u20ab\u20c0\u20c2\u206d\u2072\u2079\u207f\u207b\u2056\u209f\u20bc\u20d5\u20d7\u20f3\u20f5\u2103\u2105\u2061\u2063\u2086\u2088\u1fed\u1fef\u1fc4\u1fc6\u1ffb\u1ffd\u20a8\u20aa\u20bf\u20c1\u206c\u2071\u2078\u207e\u207a\u2055\u209e\u20bb\u206a\u206f\u2076\u207c\u205f\u2084\u20ce\u2048\u204d\u2051\u206b\u2070\u2077\u20cf\u20df\u1f2a\u1f2b\u0400\u0401\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u1f6f\u1f75\u1f74\u1f76\u1f79\u1f82\u1f83\u1f84\u1fc1\u1fc0\u1fec\u1feb\u204f\u204a\u204b\u205c\u205b\u205a\u205e\u205d\u209b\u209a\u20a7\u2074\u2073\u206e\u2081\u2080\u2083\u2082\u20b5\u20ba\u20b9\u20d2\u20d1\u20d3\u20d4\u20eb\u20f0\u20ef\u20f1\u2100\u2102\u2101\u211a\u2119\u2140\u2141' + '\u21a8\u21aa\u21a9\u21a0\u21a1\u21ae\u21ad\u21b4\u21b3\u21d1\u21d2\u21d4\u21cb\u21cd\u21d7\u21d8\u0000\u0000\u21cc\u221f\u2220\u21f2\u21f3\u21ed\u21ec\u21ee\u21fe\u21fd\u2272\u2271\u1f3c\u1f71\u1f70\u1f7b\u1f7a\u1f86\u1f85\u1fc3\u1fbb\u1fc2\u2053\u209c\u2075\u20b6\u21a4\u21b5\u2268\u2265\u2273\u21dd\u2142\u21f4\u213f\u21a7\u20f2\u2163\u21ea\u21d9\u21a2\u2162\u21a3\u21eb\u1fbc\u1fe8\u21ce\u211d\u1f39\u2161\u20ea\u20a6\u2054\u21ef\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u20a3\u213c\u1f2e\u1f2d\u21d3\u20a0\u2028\u20ec\u2239\u20a1\u20a2\u1fbd\u2029\u0553\u0000\u0000' + '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0219\u022e\u029e\u023e\u0235\u0269\u0273\u03f9\u03fb\u028b\u0000\u0000\u0000\u0000\u0000\u0000\u00c1\u0000\u00be\u0000\u0000\u0000\u0000\u0093\u0000\u00bf\u0000\u0000\u0000\u0000\u00c3\u0000\u0289\u0209\u0206\u01f7\u01f8\u0300\u0377\u0381\u0385\u03f4\u03f7\u03ef\u03f1\u03e1\u03e3\u03dc\u03df\u03e6\u03e9\u03eb\u03ed\u022f\u0230\u037a\u037d\u01ee\u01ef\u01f0\u01f1\u01f4\u01f5\u01f6\u0218\u022c\u0287\u0000\u0234\u023d\u0272\u0268\u0208\u02fd\u0374\u0380\u0384\u03f3\u03f6\u0425\u0420\u0413\u0679\u01fc\u0681\u068d\u0685\u0000\u041c\u106f\u0428\u0410\u0000\u0000\u0000\u0000\u00ed\u00ec\u00f1\u0000\u00f5\u0000\u00fa\u00f9\u0100\u00ff\u0105\u0104\u010b\u010a\u010f\u010e' + '\u1ee5\u1ee9\u1ee8\u1eec\u1eeb\u1ef3\u1ef2\u1ef6\u1ef5\u1efe\u1efd\u1efb\u1efc\u1f29\u1f28\u1f34\u1f33\u1f31\u1f32\u1f67\u1f66\u1f6c\u1f6b\u1f69\u1f6a\u1f92\u1f91\u1f8f\u1f90\u1fb8\u1fb7\u1fb5\u1fb6\u1fe5\u1fe4\u1fe2\u1fe3\u1ff5\u1ff4\u1ff2\u1ff3\u200a\u2009\u200d\u200c\u2026\u2025\u202c\u202b\u2046\u2045\u2043\u2044\u2069\u2068\u2066\u2067\u2097\u2096\u2094\u2095\u20b0\u20af\u20ad\u20ae\u20cb\u20ca\u20c8\u20c9\u20dd\u20dc\u20da\u20db\u20e7\u20e6\u20e4\u20e5\u20fb\u20fa\u20f8\u20f9\u2112\u2111\u210f\u2110\u2139\u2138\u2136\u2137\u2150\u214f\u214d\u214e\u2195\u2194\u2192\u2193\u21c6\u21c5\u21c3\u21c4\u21e7\u21e6\u21e4\u21e5\u2219\u2218\u2216\u2217\u2237\u2236\u2259\u2258\u2261\u2260\u225e\u225f\u2197\u2196\u2199\u2198\u219b\u219a\u219d\u219c\u0000\u0000\u0000' + '\u0000\u0267\u02f0\u0424\u106e\u0427\u041f\u02e8\u02fc\u0373\u0412\u0677\u0217\u01fb\u0285\u0419\u10c7\u10f9\u1172\u11c6\u120a\u124a\u1283\u12b8\u12ee\u1323\u023c\u0233\u0680\u0684\u068c\u0271\u040f\u1335\u13b3\u13d6\u1409\u144c\u14ae\u14cf\u1504\u153f\u158b\u15a3\u15d9\u1626\u1659\u169a\u171e\u1749\u175c\u17aa\u17eb\u1821\u1891\u18b8\u18d8\u18f2\u1917\u0379\u041b\u037c\u04c8\u01f3\u04c2\u1331\u13af\u13d1\u1403\u1446\u14aa\u14ca\u14ff\u1538\u1587\u159e\u15d3\u1621\u1655\u1695\u171a\u1746\u1757\u17a6\u17e7\u181d\u188c\u18b3\u18d3\u18ef\u1913\u037f\u0692\u0383\u0696\u0397\u0399\u029d\u03e5\u03e8\u022d\u0215\u37c1\u3647\u3652\u365b\u3665\u366e\u3779\u3782\u378a\u36e2\u1067\u3649\u3654\u365d\u3667\u3670\u3678\u3684\u3693\u369e\u36a6\u36af\u36b8\u36c1\u36c7\u36cf' + '\u36d5\u36dc\u36e4\u36eb\u36f3\u36fb\u3700\u3705\u3709\u370d\u3713\u3720\u372d\u373a\u374a\u3758\u3762\u376a\u376e\u3775\u377b\u3784\u378c\u3793\u3798\u379f\u37a6\u37ad\u37b2\u37c6\u00a5\u00a7\u350f\u3433\u3437\u35a4\u343b\u35a8\u35ab\u3440\u3444\u3448\u35b0\u35b3\u35b6\u35b9\u35bc\u35bf\u3493\u344d\u3452\u3456\u34a0\u345a\u345e\u3462\u3468\u346d\u3471\u3477\u347c\u3481\u3486\u0000\u0000\u0000\u3512\u3515\u3518\u351b\u351e\u3521\u0000\u0000\u3524\u3527\u352a\u352d\u3530\u3533\u0000\u0000\u3536\u3539\u353c\u353f\u3542\u3545\u0000\u0000\u3548\u354b\u354e\u0000\u0000\u0000\u106c\u1071\u0690\u04ca\u0694\u1073\u1089\u0000\u08b9\u05ef\u05f5\u05f2\u05f7\u0958\u0984\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u1018\uabf8\u0000\u0000'; /// Kangxi Radicals (U+2F00-U+2FD5) โ†’ CJK Unified equivalents. /// ICU decomposes these via NFD before collation. @@ -225,12 +737,6 @@ const Map _kangxiDecomp = { 0x2FD5: 0x9FA0, }; -final Map _ranks = _buildRanks(); - -Map _buildRanks() { - return {for (var i = 0; i < _ducetOrder.length; i++) _ducetOrder.codeUnitAt(i): i}; -} - /// Compare two characters using DUCET + CLDR ordering. /// Decomposes Kangxi radicals to CJK equivalents before lookup. /// Falls back to codepoint order for characters not in the table. @@ -239,7 +745,9 @@ int ducetCompare(String a, String b) { var cpB = b.runes.first; cpA = _kangxiDecomp[cpA] ?? cpA; cpB = _kangxiDecomp[cpB] ?? cpB; - final rankA = _ranks[cpA] ?? (0x100000 + cpA); - final rankB = _ranks[cpB] ?? (0x100000 + cpB); + final storedRankA = cpA <= 0xFFFF ? _ducetRanks.codeUnitAt(cpA) : 0; + final storedRankB = cpB <= 0xFFFF ? _ducetRanks.codeUnitAt(cpB) : 0; + final rankA = storedRankA == 0 ? 0x100000 + cpA : storedRankA - 1; + final rankB = storedRankB == 0 ? 0x100000 + cpB : storedRankB - 1; return rankA.compareTo(rankB); } diff --git a/lib/data/hid_key_labels.dart b/lib/data/hid_key_labels.dart index ca900630..85920641 100644 --- a/lib/data/hid_key_labels.dart +++ b/lib/data/hid_key_labels.dart @@ -1,4 +1,4 @@ -// Generated from USB HID Usage Tables โ€” do not edit by hand. +// Generated by dart run scripts/generate_hid_key_labels.dart from scripts/data/hid_key_labels.json; do not edit by hand. /// Human-readable labels for physical keyboard keys, keyed by USB HID usage code. const hidKeyLabels = { diff --git a/lib/data/iso_639_data.dart b/lib/data/iso_639_data.dart index ef7018f4..ec7babf4 100644 --- a/lib/data/iso_639_data.dart +++ b/lib/data/iso_639_data.dart @@ -1,4 +1,4 @@ -// Generated from iso_639_codes.json โ€” do not edit by hand. +// Generated by dart run scripts/generate_iso_639_data.dart from scripts/data/iso_639_codes.json; do not edit by hand. class LanguageEntry { final String code1; diff --git a/lib/focus/focusable_action_bar.dart b/lib/focus/focusable_action_bar.dart index 6ffb1a97..aa0276ce 100644 --- a/lib/focus/focusable_action_bar.dart +++ b/lib/focus/focusable_action_bar.dart @@ -106,7 +106,22 @@ class FocusableActionBarState extends State { FocusNode? getFocusNode(int index) => index >= 0 && index < _focusNodes.length ? _focusNodes[index] : null; void requestFocusOnFirst() { - if (_focusNodes.isNotEmpty) _focusNodes.first.requestFocus(); + final index = _nextEnabledIndex(-1); + if (index != null) _focusNodes[index].requestFocus(); + } + + int? _previousEnabledIndex(int index) { + for (var candidate = index - 1; candidate >= 0; candidate--) { + if (widget.actions[candidate].onPressed != null) return candidate; + } + return null; + } + + int? _nextEnabledIndex(int index) { + for (var candidate = index + 1; candidate < widget.actions.length; candidate++) { + if (widget.actions[candidate].onPressed != null) return candidate; + } + return null; } @override @@ -202,10 +217,10 @@ class FocusableActionBarState extends State { Widget _buildButton(int index, bool isKeyboard, Duration duration) { final action = widget.actions[index]; + final enabled = action.onPressed != null; final isFocused = _focusStates[index]; final showFocus = isFocused && isKeyboard; final opacity = isKeyboard && _hasAnyFocus && !isFocused ? 0.6 : 1.0; - final buildState = FocusableActionBuildState( focusNode: _focusNodes[index], isFocused: isFocused, @@ -217,28 +232,29 @@ class FocusableActionBarState extends State { return Focus( focusNode: _focusNodes[index], - autofocus: action.autofocus, + canRequestFocus: enabled, + autofocus: action.autofocus && enabled, descendantsAreFocusable: false, onKeyEvent: (node, event) { if (widget.onBack != null) { final backResult = handleBackKeyAction(event, widget.onBack!); if (backResult != KeyEventResult.ignored) return backResult; } + final previousIndex = _previousEnabledIndex(index); + final nextIndex = _nextEnabledIndex(index); return dpadKeyHandler( onSelect: action.onPressed, - onLeft: index > 0 ? () => _focusNodes[index - 1].requestFocus() : widget.onNavigateLeft, - onRight: index < _focusNodes.length - 1 - ? () => _focusNodes[index + 1].requestFocus() - : widget.onNavigateRight, + onLeft: previousIndex != null ? () => _focusNodes[previousIndex].requestFocus() : widget.onNavigateLeft, + onRight: nextIndex != null ? () => _focusNodes[nextIndex].requestFocus() : widget.onNavigateRight, onDown: widget.onNavigateDown, onUp: widget.onNavigateUp, - // Consume LEFT/RIGHT at the row's first/last button when no edge - // callback is wired, so focus can't fall off the row (#1181). + // Consume LEFT/RIGHT at the row's first/last enabled button when no + // edge callback is wired, so focus can't fall off the row (#1181). trapHorizontalEdges: true, )(node, event); }, child: ClickableCursor( - enabled: action.onPressed != null || action.child != null || customChild != null, + enabled: enabled, child: AnimatedOpacity( opacity: showFocus ? 1.0 : opacity, duration: duration, diff --git a/lib/focus/focusable_button.dart b/lib/focus/focusable_button.dart index fae439e3..f6173003 100644 --- a/lib/focus/focusable_button.dart +++ b/lib/focus/focusable_button.dart @@ -50,12 +50,14 @@ class _FocusableButtonState extends State { final isKeyboard = InputModeTracker.isKeyboardMode(context); final showFocus = _isFocused && isKeyboard; final duration = FocusTheme.getAnimationDuration(context); + final enabled = widget.onPressed != null; // In dpad mode: focused = full opacity, unfocused = dimmed final opacity = isKeyboard && !_isFocused ? 0.6 : 1.0; return FocusableWrapper( - autofocus: widget.autofocus, + autofocus: widget.autofocus && enabled, focusNode: widget.focusNode, + canRequestFocus: enabled, disableScale: true, borderRadius: 100, useBackgroundFocus: widget.useBackgroundFocus, diff --git a/lib/focus/focusable_text_field.dart b/lib/focus/focusable_text_field.dart index c35e930b..f2f7ecd4 100644 --- a/lib/focus/focusable_text_field.dart +++ b/lib/focus/focusable_text_field.dart @@ -8,6 +8,7 @@ import '../utils/platform_detector.dart'; import '../utils/text_input_diagnostics.dart'; import '../widgets/tv_virtual_keyboard.dart'; import 'dpad_navigator.dart'; +import 'key_event_utils.dart'; import 'owned_focus_node_binding.dart'; bool _usesTvKeyboard(bool enableTvKeyboard) => enableTvKeyboard && PlatformDetector.isTV(); @@ -360,16 +361,20 @@ KeyEventResult _moveCaretHorizontally(TextEditingController controller, int delt } if (!selection.isCollapsed) { - final offset = delta < 0 - ? (selection.start < selection.end ? selection.start : selection.end) - : (selection.start > selection.end ? selection.start : selection.end); - controller.selection = TextSelection.collapsed(offset: offset); + final range = expandToGraphemeRange(value.text, selection); + controller.selection = TextSelection.collapsed(offset: delta < 0 ? range.start : range.end); return KeyEventResult.handled; } - final nextOffset = selection.extentOffset + delta; - if (nextOffset < 0 || nextOffset > value.text.length) return KeyEventResult.ignored; - controller.selection = TextSelection.collapsed(offset: nextOffset); + final offset = selection.extentOffset.clamp(0, value.text.length); + if ((delta < 0 && offset == 0) || (delta > 0 && offset == value.text.length)) { + return KeyEventResult.ignored; + } + final codeUnitRange = delta < 0 + ? TextRange(start: offset - 1, end: offset) + : TextRange(start: offset, end: offset + 1); + final range = expandToGraphemeRange(value.text, codeUnitRange); + controller.selection = TextSelection.collapsed(offset: delta < 0 ? range.start : range.end); return KeyEventResult.handled; } @@ -439,25 +444,18 @@ void _backspace({ ValueChanged? onChanged, }) { final value = controller.value; - final range = _normalizedSelectionRange(value); - final start = range.start; - final end = range.end; - if (start != end) { - _replaceTextRange( - controller, - start, - end, - inputFormatters: inputFormatters, - maxLength: maxLength, - onChanged: onChanged, - ); - return; - } - if (start == 0) return; + final selectionRange = _normalizedSelectionRange(value); + final start = selectionRange.start; + final end = selectionRange.end; + if (start == end && start == 0) return; + + final codeUnitRange = start == end ? TextRange(start: start - 1, end: start) : TextRange(start: start, end: end); + final range = expandToGraphemeRange(value.text, codeUnitRange); + if (range.isCollapsed) return; _replaceTextRange( controller, - start - 1, - start, + range.start, + range.end, inputFormatters: inputFormatters, maxLength: maxLength, onChanged: onChanged, @@ -471,25 +469,18 @@ void _deleteForward({ ValueChanged? onChanged, }) { final value = controller.value; - final range = _normalizedSelectionRange(value); - final start = range.start; - final end = range.end; - if (start != end) { - _replaceTextRange( - controller, - start, - end, - inputFormatters: inputFormatters, - maxLength: maxLength, - onChanged: onChanged, - ); - return; - } - if (start >= value.text.length) return; + final selectionRange = _normalizedSelectionRange(value); + final start = selectionRange.start; + final end = selectionRange.end; + if (start == end && start >= value.text.length) return; + + final codeUnitRange = start == end ? TextRange(start: start, end: start + 1) : TextRange(start: start, end: end); + final range = expandToGraphemeRange(value.text, codeUnitRange); + if (range.isCollapsed) return; _replaceTextRange( controller, - start, - start + 1, + range.start, + range.end, inputFormatters: inputFormatters, maxLength: maxLength, onChanged: onChanged, diff --git a/lib/focus/focusable_wrapper.dart b/lib/focus/focusable_wrapper.dart index 9d358dd2..c107295a 100644 --- a/lib/focus/focusable_wrapper.dart +++ b/lib/focus/focusable_wrapper.dart @@ -85,6 +85,12 @@ class FocusableWrapper extends StatefulWidget { /// Optional semantic label for accessibility. final String? semanticLabel; + /// Optional current value announced after [semanticLabel]. + final String? semanticValue; + + /// Optional checked state for toggle-style controls. + final bool? checked; + /// Whether the wrapper can receive focus. final bool canRequestFocus; @@ -147,6 +153,8 @@ class FocusableWrapper extends StatefulWidget { this.scrollAlignment = 0.5, this.useComfortableZone = false, this.semanticLabel, + this.semanticValue, + this.checked, this.canRequestFocus = true, this.onKeyEvent, this.enableLongPress = false, @@ -521,7 +529,17 @@ class _FocusableWrapperState extends State with SingleTickerPr // Add semantics if label provided if (widget.semanticLabel != null) { - result = Semantics(label: widget.semanticLabel, button: widget.onSelect != null, child: result); + result = Semantics( + label: widget.semanticLabel, + value: widget.semanticValue, + button: true, + enabled: widget.onSelect != null, + checked: widget.checked, + onTap: widget.onSelect, + onLongPress: widget.onLongPress, + excludeSemantics: true, + child: result, + ); } if (widget.onSelect != null || widget.onLongPress != null) { diff --git a/lib/focus/input_mode_tracker.dart b/lib/focus/input_mode_tracker.dart index 9324dcd8..85ab29cb 100644 --- a/lib/focus/input_mode_tracker.dart +++ b/lib/focus/input_mode_tracker.dart @@ -121,26 +121,32 @@ class _InputModeTrackerState extends State { @override Widget build(BuildContext context) { - // On Android TV, don't switch to pointer mode from pointer events - // as D-pad can generate synthetic pointer events that would incorrectly - // trigger pointer mode and show a cursor instead of D-pad focus navigation. - // Desktop is exempt even in force-TV mode: its pointer events come from a - // real mouse, which should keep flipping modes (and the cursor) as usual. + // Non-desktop TVs keep keyboard mode across synthetic pointer events, but + // their controls remain pointer-reachable for engine-generated taps. if (TvDetectionService.isTVSync() && !PlatformDetector.isDesktopOS()) { return _InputModeProvider(mode: _mode, child: widget.child); } return Listener( - // Switch to pointer mode on mouse activity onPointerDown: (_) => _setMode(InputMode.pointer), onPointerHover: (_) => _setMode(InputMode.pointer), behavior: HitTestBehavior.translucent, - child: MouseRegion( - cursor: _mode == InputMode.keyboard ? SystemMouseCursors.none : MouseCursor.defer, - child: IgnorePointer( - ignoring: _mode == InputMode.keyboard, - child: _InputModeProvider(mode: _mode, child: widget.child), - ), + child: Stack( + alignment: Alignment.topLeft, + fit: StackFit.passthrough, + children: [ + _InputModeProvider(mode: _mode, child: widget.child), + // Hide the desktop cursor in keyboard mode without excluding the + // application subtree from the current pointer hit test. + if (_mode == InputMode.keyboard) + const Positioned.fill( + child: MouseRegion( + cursor: SystemMouseCursors.none, + opaque: false, + hitTestBehavior: HitTestBehavior.translucent, + ), + ), + ], ), ); } diff --git a/lib/focus/key_event_utils.dart b/lib/focus/key_event_utils.dart index 4f8ab2a9..5262b43c 100644 --- a/lib/focus/key_event_utils.dart +++ b/lib/focus/key_event_utils.dart @@ -123,6 +123,28 @@ KeyEventResult handleOneShotSelect(KeyEvent event, VoidCallback onActivate) { return KeyEventResult.handled; } +/// Expands a UTF-16 [range] to whole extended grapheme clusters in [text]. +/// +/// Flutter selections use UTF-16 code-unit offsets. Custom editors must pass a +/// non-empty range containing the code units they intend to replace; the +/// returned range is normalized, clamped, and safe to use with +/// [String.replaceRange] without splitting a user-perceived character. +TextRange expandToGraphemeRange(String text, TextRange range) { + if (text.isEmpty) return TextRange.empty; + + final first = range.start.clamp(0, text.length); + final second = range.end.clamp(0, text.length); + final start = first <= second ? first : second; + final end = first <= second ? second : first; + if (start == end) return TextRange.collapsed(start); + + final boundary = CharacterBoundary(text); + return TextRange( + start: boundary.getLeadingTextBoundaryAt(start) ?? 0, + end: boundary.getTrailingTextBoundaryAt(end - 1) ?? text.length, + ); +} + /// Creates a [FocusOnKeyEventCallback] that dispatches d-pad / arrow keys to /// the provided directional callbacks. /// diff --git a/lib/focus/locked_hub_controller.dart b/lib/focus/locked_hub_controller.dart index 1d4d8247..89dfa395 100644 --- a/lib/focus/locked_hub_controller.dart +++ b/lib/focus/locked_hub_controller.dart @@ -1,20 +1,20 @@ -/// Manages focus memory for hub navigation. +/// Manages focus memory for one browse surface. /// /// Tracks two things: /// 1. Per-hub memory: Each hub remembers which item was last focused -/// 2. Global column hint: When entering a hub that hasn't been visited, +/// 2. Last column hint: When entering a hub that hasn't been visited, /// we use the column position from the last focused hub as a hint class HubFocusMemory { - static final Map _perHubMemory = {}; - static int _lastColumnHint = 0; + final Map _perHubMemory = {}; + int _lastColumnHint = 0; - static void setForHub(String hubKey, int index) { + void setForHub(String hubKey, int index) { _perHubMemory[hubKey] = index; _lastColumnHint = index; } /// Get the remembered index for a hub, or fall back to column hint - static int getForHub(String hubKey, int itemCount) { + int getForHub(String hubKey, int itemCount) { if (itemCount <= 0) return 0; // If this hub has memory, use it @@ -26,16 +26,10 @@ class HubFocusMemory { return _lastColumnHint.clamp(0, itemCount - 1); } - /// Get only this hub's remembered index, without falling back to the global column hint. - static int getForHubOnly(String hubKey, int itemCount, {int fallback = 0}) { + /// Get only this hub's remembered index, without falling back to the last column hint. + int getForHubOnly(String hubKey, int itemCount, {int fallback = 0}) { if (itemCount <= 0) return 0; final remembered = _perHubMemory[hubKey]; return (remembered ?? fallback).clamp(0, itemCount - 1); } - - /// Clear all memory (e.g., when leaving a screen) - static void clear() { - _perHubMemory.clear(); - _lastColumnHint = 0; - } } diff --git a/lib/i18n/bg.i18n.json b/lib/i18n/bg.i18n.json index 66d4f49d..9bdcbd83 100644 --- a/lib/i18n/bg.i18n.json +++ b/lib/i18n/bg.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "ะ˜ะทั‡ะฐะบะฒะฐะฝะต ะฝะฐ ะพะดะพะฑั€ะตะฝะธะตโ€ฆ", "quickConnectCancel": "ะžั‚ะบะฐะท", "quickConnectExpired": "Quick Connect ะธะทั‚ะตั‡ะต. ะžะฟะธั‚ะฐะนั‚ะต ะพั‚ะฝะพะฒะพ.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "ะžั‚ะบะฐะท", @@ -180,7 +180,7 @@ "watchTogetherRelay": "ะ ะตะปะตะน ััŠั€ะฒัŠั€ ะทะฐ ะณะปะตะดะฐะฝะต ะทะฐะตะดะฝะพ", "watchTogetherRelayDescription": "ะ—ะฐะดะฐะน ัะพะฑัั‚ะฒะตะฝ ั€ะตะปะตะน ััŠั€ะฒัŠั€. ะ’ัะธั‡ะบะธ ั‚ั€ัะฑะฒะฐ ะดะฐ ะธะทะฟะพะปะทะฒะฐั‚ ััŠั‰ะธั ััŠั€ะฒัŠั€.", "watchTogetherRelayHint": "https://my-relay.example.com", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "ะ”ะพะบะปะฐะดะฒะฐะฝะต ะฝะฐ ัั€ะธะฒะพะฒะต", "crashReportingDescription": "ะ˜ะทะฟั€ะฐั‰ะฐะน ะดะพะบะปะฐะดะธ ะทะฐ ัั€ะธะฒะพะฒะต, ะทะฐ ะดะฐ ะฟะพะผะพะณะฝะตัˆ ะทะฐ ะฟะพะดะพะฑั€ัะฒะฐะฝะต ะฝะฐ ะฟั€ะธะปะพะถะตะฝะธะตั‚ะพ", "debugLogging": "ะ›ะพะณะพะฒะต ะทะฐ ะพั‚ัั‚ั€ะฐะฝัะฒะฐะฝะต ะฝะฐ ะณั€ะตัˆะบะธ", @@ -197,12 +197,10 @@ "exportSettings": "ะ•ะบัะฟะพั€ั‚ะธั€ะฐะน ะฝะฐัั‚ั€ะพะนะบะธั‚ะต", "exportSettingsDescription": "ะ—ะฐะฟะฐะทะธ ะฟั€ะตะดะฟะพั‡ะธั‚ะฐะฝะธัั‚ะฐ ัะธ ะฒัŠะฒ ั„ะฐะนะป", "exportSettingsSuccess": "ะะฐัั‚ั€ะพะนะบะธั‚ะต ัะฐ ะตะบัะฟะพั€ั‚ะธั€ะฐะฝะธ", - "exportSettingsFailed": "ะะฐัั‚ั€ะพะนะบะธั‚ะต ะฝะต ะผะพะถะฐั…ะฐ ะดะฐ ะฑัŠะดะฐั‚ ะตะบัะฟะพั€ั‚ะธั€ะฐะฝะธ", "importSettings": "ะ˜ะผะฟะพั€ั‚ะธั€ะฐะน ะฝะฐัั‚ั€ะพะนะบะธ", "importSettingsDescription": "ะ’ัŠะทัั‚ะฐะฝะพะฒะธ ะฟั€ะตะดะฟะพั‡ะธั‚ะฐะฝะธั ะพั‚ ั„ะฐะนะป", "importSettingsConfirm": "ะขะพะฒะฐ ั‰ะต ะทะฐะผะตะฝะธ ั‚ะตะบัƒั‰ะธั‚ะต ะฒะธ ะฝะฐัั‚ั€ะพะนะบะธ. ะŸั€ะพะดัŠะปะถะฐะฒะฐั‚ะต ะปะธ?", "importSettingsSuccess": "ะะฐัั‚ั€ะพะนะบะธั‚ะต ัะฐ ะธะผะฟะพั€ั‚ะธั€ะฐะฝะธ", - "importSettingsFailed": "ะะฐัั‚ั€ะพะนะบะธั‚ะต ะฝะต ะผะพะถะฐั…ะฐ ะดะฐ ะฑัŠะดะฐั‚ ะธะผะฟะพั€ั‚ะธั€ะฐะฝะธ", "importSettingsInvalidFile": "ะขะพะทะธ ั„ะฐะนะป ะฝะต ะต ะฒะฐะปะธะดะตะฝ ะตะบัะฟะพั€ั‚ ะฝะฐ ะฝะฐัั‚ั€ะพะนะบะธ ะพั‚ Plezy", "importSettingsNoUser": "ะ’ะปะตะทั‚ะต, ะฟั€ะตะดะธ ะดะฐ ะธะผะฟะพั€ั‚ะธั€ะฐั‚ะต ะฝะฐัั‚ั€ะพะนะบะธ", "shortcutsReset": "ะšะปะฐะฒะธัˆะฝะธั‚ะต ะบะพะผะฑะธะฝะฐั†ะธะธ ัะฐ ะฝัƒะปะธั€ะฐะฝะธ ะดะพ ะฟะพะดั€ะฐะทะฑะธั€ะฐะฝะต", @@ -217,6 +215,7 @@ "validationErrorDuration": "ะŸั€ะพะดัŠะปะถะธั‚ะตะปะฝะพัั‚ั‚ะฐ ั‚ั€ัะฑะฒะฐ ะดะฐ ะต ะผะตะถะดัƒ ${min} ะธ ${max} ${unit}", "shortcutAlreadyAssigned": "ะšะปะฐะฒะธัˆะฝะฐั‚ะฐ ะบะพะผะฑะธะฝะฐั†ะธั ะฒะตั‡ะต ะต ะฝะฐะทะฝะฐั‡ะตะฝะฐ ะทะฐ ${action}", "shortcutUpdated": "ะšะปะฐะฒะธัˆะฝะฐั‚ะฐ ะบะพะผะฑะธะฝะฐั†ะธั ะต ะพะฑะฝะพะฒะตะฝะฐ ะทะฐ ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตัะบะฐั‡ะฐะฝะต", "autoSkipIntro": "ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตัะบะฐั‡ะฐะฝะต ะฝะฐ ะธะฝั‚ั€ะพ", "autoSkipIntroDescription": "ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตัะบะฐั‡ะฐะน ะธะฝั‚ั€ะพ ะผะฐั€ะบะตั€ะธ ัะปะตะด ะฝัะบะพะปะบะพ ัะตะบัƒะฝะดะธ", @@ -242,7 +241,7 @@ "downloadLocationChanged": "ะœะตัั‚ะพะฟะพะปะพะถะตะฝะธะตั‚ะพ ะทะฐ ะธะทั‚ะตะณะปัะฝะธั ะต ะฟั€ะพะผะตะฝะตะฝะพ", "downloadLocationReset": "ะœะตัั‚ะพะฟะพะปะพะถะตะฝะธะตั‚ะพ ะทะฐ ะธะทั‚ะตะณะปัะฝะธั ะต ะฒัŠั€ะฝะฐั‚ะพ ะฟะพ ะฟะพะดั€ะฐะทะฑะธั€ะฐะฝะต", "downloadLocationInvalid": "ะ˜ะทะฑั€ะฐะฝะฐั‚ะฐ ะฟะฐะฟะบะฐ ะฝะต ะต ะทะฐะฟะธัะฒะฐะตะผะฐ", - "downloadLocationSelectError": "ะะตัƒัะฟะตัˆะตะฝ ะธะทะฑะพั€ ะฝะฐ ะฟะฐะฟะบะฐ", + "downloadLocationPickerUnavailable": "ะ˜ะทะฑะพั€ัŠั‚ ะฝะฐ ะฟะฐะฟะบะฐ ะฝะต ะต ะฝะฐะปะธั‡ะตะฝ ะฝะฐ ั‚ะพะฒะฐ ัƒัั‚ั€ะพะนัั‚ะฒะพ", "downloadOnWifiOnly": "ะ˜ะทั‚ะตะณะปัะฝะต ัะฐะผะพ ะฟั€ะตะท WiFi", "downloadOnWifiOnlyDescription": "ะŸั€ะตะดะพั‚ะฒั€ะฐั‚ัะฒะฐะน ะธะทั‚ะตะณะปัะฝะธั ะฟั€ะตะท ะผะพะฑะธะปะฝะธ ะดะฐะฝะฝะธ", "autoRemoveWatchedDownloads": "ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตะผะฐั…ะฒะฐะน ะธะทะณะปะตะดะฐะฝะธั‚ะต ะธะทั‚ะตะณะปัะฝะธั", @@ -443,7 +442,11 @@ "brightness": "ะฏั€ะบะพัั‚", "hexColor": "ะจะตัั‚ะฝะฐะดะตัะตั‚ะธั‡ะตะฝ ั†ะฒัั‚", "expandText": "ะ ะฐะทะณัŠะฝะธ ั‚ะตะบัั‚ะฐ", - "collapseText": "ะกะฒะธะน ั‚ะตะบัั‚ะฐ" + "collapseText": "ะกะฒะธะน ั‚ะตะบัั‚ะฐ", + "alphabetNavigation": "ะะฐะฒะธะณะฐั†ะธั ะฟะพ ะฐะทะฑัƒะบะฐั‚ะฐ", + "alphabetScrollHint": "ะŸะปัŠะทะฝะตั‚ะต ะฝะฐะณะพั€ะต ะธะปะธ ะฝะฐะดะพะปัƒ, ะทะฐ ะดะฐ ะฟั€ะตะผะธะฝะตั‚ะต ะฟะพ ะฑัƒะบะฒะฐ", + "rowColumnPosition": "ะ ะตะด ${row} ะพั‚ ${rowCount}, ะบะพะปะพะฝะฐ ${column} ะพั‚ ${columnCount}", + "rowPosition": "ะ ะตะด ${row} ะพั‚ ${rowCount}" }, "tooltips": { "shufflePlay": "ะ ะฐะทะฑัŠั€ะบะฐะฝะพ ะฒัŠะทะฟั€ะพะธะทะฒะตะถะดะฐะฝะต", @@ -451,6 +454,9 @@ "markAsWatched": "ะœะฐั€ะบะธั€ะฐะน ะบะฐั‚ะพ ะณะปะตะดะฐะฝะพ", "markAsUnwatched": "ะœะฐั€ะบะธั€ะฐะน ะบะฐั‚ะพ ะฝะตะณะปะตะดะฐะฝะพ" }, + "audioTracks": { + "track": "ะัƒะดะธะพ ะฟัŠั‚ะตั‡ะบะฐ ${n}" + }, "videoControls": { "audioLabel": "ะัƒะดะธะพ", "subtitlesLabel": "ะกัƒะฑั‚ะธั‚ั€ะธ", @@ -478,6 +484,8 @@ "playNext": "ะŸัƒัะฝะธ ัะปะตะดะฒะฐั‰ะพั‚ะพ", "playButton": "ะŸัƒัะฝะธ", "pauseButton": "ะŸะฐัƒะทะฐ", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "ะŸั€ะตะฒัŠั€ั‚ะธ ะฝะฐะทะฐะด ${seconds} ัะตะบัƒะฝะดะธ", "seekForwardButton": "ะŸั€ะตะฒัŠั€ั‚ะธ ะฝะฐะฟั€ะตะด ${seconds} ัะตะบัƒะฝะดะธ", "previousButton": "ะŸั€ะตะดะธัˆะตะฝ ะตะฟะธะทะพะด", @@ -553,11 +561,11 @@ "streamInterrupted": "ะŸะพั‚ะพะบัŠั‚ ะฟั€ะตะบัŠัะฝะฐ. ะะฐั‚ะธัะฝะตั‚ะต โ€žะŸัƒัะฝะธโ€œ ะธะปะธ ะฟั€ะตะฒัŠั€ั‚ะตั‚ะต, ะทะฐ ะดะฐ ะพะฟะธั‚ะฐั‚ะต ะพั‚ะฝะพะฒะพ.", "liveStreamInterrupted": "ะŸะพั‚ะพะบัŠั‚ ะฝะฐ ะถะธะฒะพ ะฟั€ะตะบัŠัะฝะฐ. ะะฐั‚ะธัะฝะตั‚ะต โ€žะŸัƒัะฝะธโ€œ, ะทะฐ ะดะฐ ะพะฟะธั‚ะฐั‚ะต ะพั‚ะฝะพะฒะพ.", "fileInfoNotAvailable": "ะ˜ะฝั„ะพั€ะผะฐั†ะธัั‚ะฐ ะทะฐ ั„ะฐะนะปะฐ ะฝะต ะต ะฝะฐะปะธั‡ะฝะฐ", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ะทะฐั€ะตะถะดะฐะฝะต ะฝะฐ ะธะฝั„ะพั€ะผะฐั†ะธั ะทะฐ ั„ะฐะนะปะฐ: ${error}", "errorLoadingSeries": "ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ะทะฐั€ะตะถะดะฐะฝะต ะฝะฐ ัะตั€ะธะฐะปะฐ", "musicNotSupported": "ะ’ัŠะทะฟั€ะพะธะทะฒะตะถะดะฐะฝะตั‚ะพ ะฝะฐ ะผัƒะทะธะบะฐ ะฒัะต ะพั‰ะต ะฝะต ัะต ะฟะพะดะดัŠั€ะถะฐ", @@ -680,6 +688,7 @@ "borrowExplain": "ะ˜ะทะฟะพะปะทะฒะฐะน ะฒั€ัŠะทะบะฐ ะพั‚ ะดั€ัƒะณ ะฟั€ะพั„ะธะป. PIN-ะทะฐั‰ะธั‚ะตะฝะธั‚ะต ะฟั€ะพั„ะธะปะธ ะธะทะธัะบะฒะฐั‚ PIN.", "borrowEmpty": "ะ’ัะต ะพั‰ะต ะฝัะผะฐ ะบะฐะบะฒะพ ะดะฐ ัะต ะธะทะฟะพะปะทะฒะฐ.", "borrowEmptySubtitle": "ะŸัŠั€ะฒะพ ัะฒัŠั€ะถะตั‚ะต Plex ะธะปะธ Jellyfin ะบัŠะผ ะดั€ัƒะณ ะฟั€ะพั„ะธะป.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "ะžั‚ ${displayName}", "borrowConnectionBorrowed": "ะ’ั€ัŠะทะบะฐั‚ะฐ ะต ะธะทะฟะพะปะทะฒะฐะฝะฐ.", "borrowFailed": "ะะตัƒัะฟะตัˆะฝะพ ะธะทะฟะพะปะทะฒะฐะฝะต ะฝะฐ ะฒั€ัŠะทะบะฐ.", @@ -944,7 +953,7 @@ "favorites": "ะ›ัŽะฑะธะผะธ", "reorderFavorites": "ะŸั€ะตะฝะฐั€ะตะดะธ ะปัŽะฑะธะผะธั‚ะต", "favoritesLoadFailed": "ะ›ัŽะฑะธะผะธั‚ะต ะฝะต ะผะพะถะฐั…ะฐ ะดะฐ ัะต ะทะฐั€ะตะดัั‚. ะŸั€ะพะฒะตั€ะตั‚ะต ะฒั€ัŠะทะบะฐั‚ะฐ ัะธ ะธ ะพะฟะธั‚ะฐะนั‚ะต ะพั‚ะฝะพะฒะพ.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "ะŸั€ะธััŠะตะดะธะฝะธ ัะต ะบัŠะผ ั‚ะตะบัƒั‰ะฐ ัะตัะธั", "watchFromStart": "ะ“ะปะตะดะฐะน ะพั‚ ะฝะฐั‡ะฐะปะพั‚ะพ (ะฟั€ะตะดะธ ${minutes} ะผะธะฝ)", "watchLive": "ะ“ะปะตะดะฐะน ะฝะฐ ะถะธะฒะพ", diff --git a/lib/i18n/da.i18n.json b/lib/i18n/da.i18n.json index 3cfdc961..3480c8fc 100644 --- a/lib/i18n/da.i18n.json +++ b/lib/i18n/da.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "Venter pรฅ godkendelseโ€ฆ", "quickConnectCancel": "Annullรฉr", "quickConnectExpired": "Quick Connect er udlรธbet. Prรธv igen.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "Annuller", @@ -180,7 +180,7 @@ "watchTogetherRelay": "Watch Together-relay", "watchTogetherRelayDescription": "Angiv en brugerdefineret relay. Alle skal bruge samme server.", "watchTogetherRelayHint": "https://min-relay.eksempel.dk", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "Fejlrapportering", "crashReportingDescription": "Send fejlrapporter for at hjรฆlpe med at forbedre appen", "debugLogging": "Fejlfindingslogning", @@ -197,12 +197,10 @@ "exportSettings": "Eksportรฉr indstillinger", "exportSettingsDescription": "Gem dine prรฆferencer i en fil", "exportSettingsSuccess": "Indstillinger eksporteret", - "exportSettingsFailed": "Kunne ikke eksportere indstillinger", "importSettings": "Importรฉr indstillinger", "importSettingsDescription": "Gendan prรฆferencer fra en fil", "importSettingsConfirm": "Dette vil erstatte dine nuvรฆrende indstillinger. Fortsรฆt?", "importSettingsSuccess": "Indstillinger importeret", - "importSettingsFailed": "Kunne ikke importere indstillinger", "importSettingsInvalidFile": "Denne fil er ikke en gyldig Plezy-indstillingseksport", "importSettingsNoUser": "Log ind fรธr import af indstillinger", "shortcutsReset": "Genveje nulstillet til standard", @@ -217,6 +215,7 @@ "validationErrorDuration": "Varighed skal vรฆre mellem ${min} og ${max} ${unit}", "shortcutAlreadyAssigned": "Genvej allerede tildelt til ${action}", "shortcutUpdated": "Genvej opdateret for ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "Auto-spring", "autoSkipIntro": "Auto-spring intro", "autoSkipIntroDescription": "Spring automatisk intromarkรธrer over efter fรฅ sekunder", @@ -242,7 +241,7 @@ "downloadLocationChanged": "Downloadplacering รฆndret", "downloadLocationReset": "Downloadplacering nulstillet", "downloadLocationInvalid": "Valgt mappe er ikke skrivbar", - "downloadLocationSelectError": "Kunne ikke vรฆlge mappe", + "downloadLocationPickerUnavailable": "Mappevalg er ikke tilgรฆngeligt pรฅ denne enhed", "downloadOnWifiOnly": "Download kun pรฅ WiFi", "downloadOnWifiOnlyDescription": "Forhindre downloads pรฅ mobildata", "autoRemoveWatchedDownloads": "Fjern sete downloads automatisk", @@ -443,7 +442,11 @@ "brightness": "Lysstyrke", "hexColor": "Hexfarve", "expandText": "Udvid tekst", - "collapseText": "Fold tekst sammen" + "collapseText": "Fold tekst sammen", + "alphabetNavigation": "Alfabetnavigation", + "alphabetScrollHint": "Stryg op eller ned for at flytte รฉt bogstav", + "rowColumnPosition": "Rรฆkke ${row} af ${rowCount}, kolonne ${column} af ${columnCount}", + "rowPosition": "Rรฆkke ${row} af ${rowCount}" }, "tooltips": { "shufflePlay": "Afspil tilfรฆldigt", @@ -451,6 +454,9 @@ "markAsWatched": "Markรฉr som set", "markAsUnwatched": "Markรฉr som uset" }, + "audioTracks": { + "track": "Lydspor ${n}" + }, "videoControls": { "audioLabel": "Lyd", "subtitlesLabel": "Undertekster", @@ -478,6 +484,8 @@ "playNext": "Afspil nรฆste", "playButton": "Afspil", "pauseButton": "Pause", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "Spol ${seconds} sekunder tilbage", "seekForwardButton": "Spol ${seconds} sekunder frem", "previousButton": "Forrige episode", @@ -553,11 +561,11 @@ "streamInterrupted": "Streamen blev afbrudt. Tryk pรฅ afspil, eller spol for at prรธve igen.", "liveStreamInterrupted": "Livestreamen blev afbrudt. Tryk pรฅ afspil for at prรธve igen.", "fileInfoNotAvailable": "Filinfo ikke tilgรฆngelig", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "Fejl ved indlรฆsning af filinfo: ${error}", "errorLoadingSeries": "Fejl ved indlรฆsning af serie", "musicNotSupported": "Musikafspilning understรธttes endnu ikke", @@ -680,6 +688,7 @@ "borrowExplain": "Lรฅn en anden profils forbindelse. PIN-beskyttede profiler krรฆver en PIN.", "borrowEmpty": "Intet at lรฅne endnu.", "borrowEmptySubtitle": "Forbind Plex eller Jellyfin til en anden profil fรธrst.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "Fra ${displayName}", "borrowConnectionBorrowed": "Forbindelse lรฅnt.", "borrowFailed": "Kunne ikke lรฅne forbindelse.", @@ -944,7 +953,7 @@ "favorites": "Favoritter", "reorderFavorites": "Omarranger favoritter", "favoritesLoadFailed": "Favoritter kunne ikke indlรฆses. Kontrollรฉr forbindelsen, og prรธv igen.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "Deltag i igangvรฆrende session", "watchFromStart": "Se fra start (${minutes} min siden)", "watchLive": "Se live", diff --git a/lib/i18n/de.i18n.json b/lib/i18n/de.i18n.json index 9636482c..940745db 100644 --- a/lib/i18n/de.i18n.json +++ b/lib/i18n/de.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "Warte auf Bestรคtigungโ€ฆ", "quickConnectCancel": "Abbrechen", "quickConnectExpired": "Quick Connect ist abgelaufen. Versuche es erneut.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "Abbrechen", @@ -180,7 +180,7 @@ "watchTogetherRelay": "Gemeinsam Schauen Relay", "watchTogetherRelayDescription": "Eigenes Relay festlegen. Alle mรผssen denselben Server verwenden.", "watchTogetherRelayHint": "https://mein-relay.beispiel.de", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "Absturzberichte", "crashReportingDescription": "Absturzberichte senden, um die App zu verbessern", "debugLogging": "Debug-Protokollierung", @@ -197,12 +197,10 @@ "exportSettings": "Einstellungen exportieren", "exportSettingsDescription": "Speichere deine Einstellungen in einer Datei", "exportSettingsSuccess": "Einstellungen exportiert", - "exportSettingsFailed": "Einstellungen konnten nicht exportiert werden", "importSettings": "Einstellungen importieren", "importSettingsDescription": "Einstellungen aus einer Datei wiederherstellen", "importSettingsConfirm": "Dies ersetzt deine aktuellen Einstellungen. Fortfahren?", "importSettingsSuccess": "Einstellungen importiert", - "importSettingsFailed": "Einstellungen konnten nicht importiert werden", "importSettingsInvalidFile": "Diese Datei ist kein gรผltiger Plezy-Einstellungsexport", "importSettingsNoUser": "Vor dem Import bitte anmelden", "shortcutsReset": "Tastenkรผrzel auf Standard zurรผckgesetzt", @@ -217,6 +215,7 @@ "validationErrorDuration": "Dauer muss zwischen ${min} und ${max} ${unit} liegen", "shortcutAlreadyAssigned": "Tastenkรผrzel bereits zugewiesen an ${action}", "shortcutUpdated": "Tastenkรผrzel aktualisiert fรผr ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "Automatisches รœberspringen", "autoSkipIntro": "Intro automatisch รผberspringen", "autoSkipIntroDescription": "Intro-Marker nach wenigen Sekunden automatisch รผberspringen", @@ -242,7 +241,7 @@ "downloadLocationChanged": "Download-Speicherort geรคndert", "downloadLocationReset": "Download-Speicherort auf Standard zurรผckgesetzt", "downloadLocationInvalid": "Ausgewรคhlter Ordner ist nicht beschreibbar", - "downloadLocationSelectError": "Ordnerauswahl fehlgeschlagen", + "downloadLocationPickerUnavailable": "Die Ordnerauswahl ist auf diesem Gerรคt nicht verfรผgbar", "downloadOnWifiOnly": "Nur รผber WLAN herunterladen", "downloadOnWifiOnlyDescription": "Downloads รผber mobile Daten verhindern", "autoRemoveWatchedDownloads": "Gesehene Downloads automatisch entfernen", @@ -443,7 +442,11 @@ "brightness": "Helligkeit", "hexColor": "Hex-Farbe", "expandText": "Text ausklappen", - "collapseText": "Text einklappen" + "collapseText": "Text einklappen", + "alphabetNavigation": "Alphabetische Navigation", + "alphabetScrollHint": "Nach oben oder unten wischen, um einen Buchstaben weiterzugehen", + "rowColumnPosition": "Zeile ${row} von ${rowCount}, Spalte ${column} von ${columnCount}", + "rowPosition": "Zeile ${row} von ${rowCount}" }, "tooltips": { "shufflePlay": "Zufallswiedergabe", @@ -451,6 +454,9 @@ "markAsWatched": "Als gesehen markieren", "markAsUnwatched": "Als ungesehen markieren" }, + "audioTracks": { + "track": "Audiospur ${n}" + }, "videoControls": { "audioLabel": "Audio", "subtitlesLabel": "Untertitel", @@ -478,6 +484,8 @@ "playNext": "Nรคchstes abspielen", "playButton": "Wiedergeben", "pauseButton": "Pause", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "${seconds} Sekunden zurรผck", "seekForwardButton": "${seconds} Sekunden vor", "previousButton": "Vorherige Episode", @@ -553,11 +561,11 @@ "streamInterrupted": "Der Stream wurde unterbrochen. Drรผcke auf Wiedergabe oder spule, um es erneut zu versuchen.", "liveStreamInterrupted": "Der Livestream wurde unterbrochen. Drรผcke auf Wiedergabe, um es erneut zu versuchen.", "fileInfoNotAvailable": "Dateiinfo nicht verfรผgbar", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "Fehler beim Laden der Dateiinfo: ${error}", "errorLoadingSeries": "Fehler beim Laden der Serie", "musicNotSupported": "Musikwiedergabe wird noch nicht unterstรผtzt", @@ -680,6 +688,7 @@ "borrowExplain": "Verbindung eines anderen Profils leihen. PIN-geschรผtzte Profile erfordern eine PIN.", "borrowEmpty": "Noch nichts zum Ausleihen.", "borrowEmptySubtitle": "Verbinde zuerst Plex oder Jellyfin mit einem anderen Profil.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "Von ${displayName}", "borrowConnectionBorrowed": "Verbindung ausgeliehen.", "borrowFailed": "Verbindung konnte nicht ausgeliehen werden.", @@ -944,7 +953,7 @@ "favorites": "Favoriten", "reorderFavorites": "Favoriten sortieren", "favoritesLoadFailed": "Favoriten konnten nicht geladen werden. รœberprรผfe deine Verbindung und versuche es erneut.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "Laufender Sitzung beitreten", "watchFromStart": "Von Anfang an ansehen (vor ${minutes} Min.)", "watchLive": "Live ansehen", diff --git a/lib/i18n/en.i18n.json b/lib/i18n/en.i18n.json index 52b3a29d..1cff67ed 100644 --- a/lib/i18n/en.i18n.json +++ b/lib/i18n/en.i18n.json @@ -197,12 +197,10 @@ "exportSettings": "Export Settings", "exportSettingsDescription": "Save your preferences to a file", "exportSettingsSuccess": "Settings exported", - "exportSettingsFailed": "Could not export settings", "importSettings": "Import Settings", "importSettingsDescription": "Restore preferences from a file", "importSettingsConfirm": "This will replace your current settings. Continue?", "importSettingsSuccess": "Settings imported", - "importSettingsFailed": "Could not import settings", "importSettingsInvalidFile": "This file isn't a valid Plezy settings export", "importSettingsNoUser": "Sign in before importing settings", "shortcutsReset": "Shortcuts reset to defaults", @@ -217,6 +215,7 @@ "validationErrorDuration": "Duration must be between ${min} and ${max} ${unit}", "shortcutAlreadyAssigned": "Shortcut already assigned to ${action}", "shortcutUpdated": "Shortcut updated for ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "Auto Skip", "autoSkipIntro": "Auto Skip Intro", "autoSkipIntroDescription": "Automatically skip intro markers after a few seconds", @@ -242,7 +241,7 @@ "downloadLocationChanged": "Download location changed", "downloadLocationReset": "Download location reset to default", "downloadLocationInvalid": "Selected folder is not writable", - "downloadLocationSelectError": "Failed to select folder", + "downloadLocationPickerUnavailable": "Folder selection is not available on this device", "downloadOnWifiOnly": "Download on WiFi only", "downloadOnWifiOnlyDescription": "Prevent downloads when on cellular data", "autoRemoveWatchedDownloads": "Auto-remove watched downloads", @@ -443,7 +442,11 @@ "brightness": "Brightness", "hexColor": "Hex color", "expandText": "Expand text", - "collapseText": "Collapse text" + "collapseText": "Collapse text", + "alphabetNavigation": "Alphabet navigation", + "alphabetScrollHint": "Swipe up or down to move by letter", + "rowColumnPosition": "Row ${row} of ${rowCount}, column ${column} of ${columnCount}", + "rowPosition": "Row ${row} of ${rowCount}" }, "tooltips": { "shufflePlay": "Shuffle play", @@ -451,6 +454,9 @@ "markAsWatched": "Mark as watched", "markAsUnwatched": "Mark as unwatched" }, + "audioTracks": { + "track": "Audio Track ${n}" + }, "videoControls": { "audioLabel": "Audio", "subtitlesLabel": "Subtitles", @@ -478,6 +484,8 @@ "playNext": "Play Next", "playButton": "Play", "pauseButton": "Pause", + "showPlaybackControls": "Show playback controls", + "hidePlaybackControls": "Hide playback controls", "seekBackwardButton": "Seek backward ${seconds} seconds", "seekForwardButton": "Seek forward ${seconds} seconds", "previousButton": "Previous episode", @@ -680,6 +688,7 @@ "borrowExplain": "Borrow another profile's connection. PIN-protected profiles require a PIN.", "borrowEmpty": "Nothing to borrow yet.", "borrowEmptySubtitle": "Connect Plex or Jellyfin to another profile first.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "From ${displayName}", "borrowConnectionBorrowed": "Connection borrowed.", "borrowFailed": "Failed to borrow connection.", diff --git a/lib/i18n/es.i18n.json b/lib/i18n/es.i18n.json index 2cf4344c..37f35ffb 100644 --- a/lib/i18n/es.i18n.json +++ b/lib/i18n/es.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "Esperando aprobaciรณnโ€ฆ", "quickConnectCancel": "Cancelar", "quickConnectExpired": "Quick Connect caducรณ. Intรฉntalo de nuevo.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "Cancelar", @@ -180,7 +180,7 @@ "watchTogetherRelay": "Relay de Ver Juntos", "watchTogetherRelayDescription": "Define un relay personalizado. Todos deben usar el mismo servidor.", "watchTogetherRelayHint": "https://mi-relay.ejemplo.com", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "Informes de Errores", "crashReportingDescription": "Enviar informes de errores para mejorar la aplicaciรณn", "debugLogging": "Registro de Depuraciรณn", @@ -197,12 +197,10 @@ "exportSettings": "Exportar Configuraciรณn", "exportSettingsDescription": "Guardar tus preferencias en un archivo", "exportSettingsSuccess": "Configuraciรณn exportada", - "exportSettingsFailed": "No se pudo exportar la configuraciรณn", "importSettings": "Importar Configuraciรณn", "importSettingsDescription": "Restaurar preferencias desde un archivo", "importSettingsConfirm": "Esto reemplazarรก tu configuraciรณn actual. ยฟContinuar?", "importSettingsSuccess": "Configuraciรณn importada", - "importSettingsFailed": "No se pudo importar la configuraciรณn", "importSettingsInvalidFile": "Este archivo no es una exportaciรณn vรกlida de Plezy", "importSettingsNoUser": "Inicia sesiรณn antes de importar la configuraciรณn", "shortcutsReset": "Atajos restablecidos a los valores predeterminados", @@ -217,6 +215,7 @@ "validationErrorDuration": "La duraciรณn debe estar entre ${min} y ${max} ${unit}", "shortcutAlreadyAssigned": "El atajo ya estรก asignado a ${action}", "shortcutUpdated": "Atajo actualizado para ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "Salto automรกtico", "autoSkipIntro": "Saltar Intro automรกticamente", "autoSkipIntroDescription": "Saltar automรกticamente los marcadores de intro despuรฉs de unos segundos", @@ -242,7 +241,7 @@ "downloadLocationChanged": "Ubicaciรณn de descarga cambiada", "downloadLocationReset": "Ubicaciรณn de descarga restablecida al predeterminado", "downloadLocationInvalid": "La carpeta seleccionada no tiene permisos de escritura", - "downloadLocationSelectError": "Error al seleccionar la carpeta", + "downloadLocationPickerUnavailable": "La selecciรณn de carpetas no estรก disponible en este dispositivo", "downloadOnWifiOnly": "Descargar solo con WiFi", "downloadOnWifiOnlyDescription": "Evitar descargas cuando se usan datos mรณviles", "autoRemoveWatchedDownloads": "Eliminar descargas vistas automรกticamente", @@ -443,7 +442,11 @@ "brightness": "Brillo", "hexColor": "Color hexadecimal", "expandText": "Expandir texto", - "collapseText": "Contraer texto" + "collapseText": "Contraer texto", + "alphabetNavigation": "Navegaciรณn alfabรฉtica", + "alphabetScrollHint": "Desliza hacia arriba o abajo para avanzar por letra", + "rowColumnPosition": "Fila ${row} de ${rowCount}, columna ${column} de ${columnCount}", + "rowPosition": "Fila ${row} de ${rowCount}" }, "tooltips": { "shufflePlay": "Reproducciรณn aleatoria", @@ -451,6 +454,9 @@ "markAsWatched": "Marcar como visto", "markAsUnwatched": "Marcar como no visto" }, + "audioTracks": { + "track": "Pista de audio ${n}" + }, "videoControls": { "audioLabel": "Audio", "subtitlesLabel": "Subtรญtulos", @@ -478,6 +484,8 @@ "playNext": "Reproducir siguiente", "playButton": "Reproducir", "pauseButton": "Pausa", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "Retroceder ${seconds} segundos", "seekForwardButton": "Avanzar ${seconds} segundos", "previousButton": "Episodio anterior", @@ -553,11 +561,11 @@ "streamInterrupted": "La reproducciรณn se interrumpiรณ. Pulsa reproducir o avanza para volver a intentarlo.", "liveStreamInterrupted": "La transmisiรณn en vivo se interrumpiรณ. Pulsa reproducir para volver a intentarlo.", "fileInfoNotAvailable": "Informaciรณn de archivo no disponible", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "Error al cargar info de archivo: ${error}", "errorLoadingSeries": "Error al cargar la serie", "musicNotSupported": "La reproducciรณn de mรบsica aรบn no estรก soportada", @@ -680,6 +688,7 @@ "borrowExplain": "Toma prestada la conexiรณn de otro perfil. Los perfiles protegidos con PIN requieren un PIN.", "borrowEmpty": "Nada para tomar prestado todavรญa.", "borrowEmptySubtitle": "Conecta Plex o Jellyfin primero a otro perfil.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "De ${displayName}", "borrowConnectionBorrowed": "Conexiรณn tomada prestada.", "borrowFailed": "No se pudo tomar prestada la conexiรณn.", @@ -944,7 +953,7 @@ "favorites": "Favoritos", "reorderFavorites": "Reordenar favoritos", "favoritesLoadFailed": "No se pudieron cargar los favoritos. Comprueba tu conexiรณn e intรฉntalo de nuevo.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "Unirse a sesiรณn en curso", "watchFromStart": "Ver desde el inicio (hace ${minutes} min)", "watchLive": "Ver en vivo", diff --git a/lib/i18n/fr.i18n.json b/lib/i18n/fr.i18n.json index ba1b77f9..d2f97848 100644 --- a/lib/i18n/fr.i18n.json +++ b/lib/i18n/fr.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "En attente d'approbationโ€ฆ", "quickConnectCancel": "Annuler", "quickConnectExpired": "Quick Connect a expirรฉ. Rรฉessayez.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "Annuler", @@ -180,7 +180,7 @@ "watchTogetherRelay": "Relais Regarder Ensemble", "watchTogetherRelayDescription": "Dรฉfinir un relay personnalisรฉ. Tout le monde doit utiliser le mรชme serveur.", "watchTogetherRelayHint": "https://mon-relais.exemple.fr", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "Rapports de plantage", "crashReportingDescription": "Envoyer des rapports de plantage pour amรฉliorer l'application", "debugLogging": "Journalisation de dรฉbogage", @@ -197,12 +197,10 @@ "exportSettings": "Exporter les paramรจtres", "exportSettingsDescription": "Enregistrer vos prรฉfรฉrences dans un fichier", "exportSettingsSuccess": "Paramรจtres exportรฉs", - "exportSettingsFailed": "Impossible d'exporter les paramรจtres", "importSettings": "Importer les paramรจtres", "importSettingsDescription": "Restaurer les prรฉfรฉrences depuis un fichier", "importSettingsConfirm": "Cela remplacera vos paramรจtres actuels. Continuer ?", "importSettingsSuccess": "Paramรจtres importรฉs", - "importSettingsFailed": "Impossible d'importer les paramรจtres", "importSettingsInvalidFile": "Ce fichier n'est pas un export Plezy valide", "importSettingsNoUser": "Connectez-vous avant d'importer les paramรจtres", "shortcutsReset": "Raccourcis rรฉinitialisรฉs aux valeurs par dรฉfaut", @@ -217,6 +215,7 @@ "validationErrorDuration": "La durรฉe doit รชtre comprise entre ${min} et ${max} ${unit}", "shortcutAlreadyAssigned": "Raccourci dรฉjร  attribuรฉ ร  ${action}", "shortcutUpdated": "Raccourci mis ร  jour pour ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "Skip automatique", "autoSkipIntro": "Skip automatique de l'introduction", "autoSkipIntroDescription": "Skipper automatiquement l'introduction aprรจs quelques secondes", @@ -242,7 +241,7 @@ "downloadLocationChanged": "Emplacement de tรฉlรฉchargement modifiรฉ", "downloadLocationReset": "Emplacement de tรฉlรฉchargement rรฉinitialisรฉ ร  la valeur par dรฉfaut", "downloadLocationInvalid": "Le dossier sรฉlectionnรฉ n'est pas accessible en รฉcriture", - "downloadLocationSelectError": "ร‰chec de la sรฉlection du dossier", + "downloadLocationPickerUnavailable": "La sรฉlection de dossier nโ€™est pas disponible sur cet appareil", "downloadOnWifiOnly": "Tรฉlรฉcharger uniquement via WiFi", "downloadOnWifiOnlyDescription": "Empรชcher les tรฉlรฉchargements lorsque vous utilisez les donnรฉes cellulaires", "autoRemoveWatchedDownloads": "Supprimer automatiquement les tรฉlรฉchargements vus", @@ -443,7 +442,11 @@ "brightness": "Luminositรฉ", "hexColor": "Couleur hexadรฉcimale", "expandText": "Dรฉvelopper le texte", - "collapseText": "Replier le texte" + "collapseText": "Replier le texte", + "alphabetNavigation": "Navigation alphabรฉtique", + "alphabetScrollHint": "Balayez vers le haut ou le bas pour changer de lettre", + "rowColumnPosition": "Ligne ${row} sur ${rowCount}, colonne ${column} sur ${columnCount}", + "rowPosition": "Ligne ${row} sur ${rowCount}" }, "tooltips": { "shufflePlay": "Lecture alรฉatoire", @@ -451,6 +454,9 @@ "markAsWatched": "Marquรฉ comme vu", "markAsUnwatched": "Marquรฉ comme non vu" }, + "audioTracks": { + "track": "Piste audio ${n}" + }, "videoControls": { "audioLabel": "Audio", "subtitlesLabel": "Sous-titres", @@ -478,6 +484,8 @@ "playNext": "Lire l'รฉpisode suivant", "playButton": "Lire", "pauseButton": "Pause", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "Reculer de ${seconds} secondes", "seekForwardButton": "Avancer de ${seconds} secondes", "previousButton": "ร‰pisode prรฉcรฉdent", @@ -553,11 +561,11 @@ "streamInterrupted": "La lecture a รฉtรฉ interrompue. Appuyez sur Lecture ou avancez pour rรฉessayer.", "liveStreamInterrupted": "Le direct a รฉtรฉ interrompu. Appuyez sur Lecture pour rรฉessayer.", "fileInfoNotAvailable": "Informations sur le fichier non disponibles", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "Erreur lors du chargement des informations sur le fichier: ${error}", "errorLoadingSeries": "Erreur lors du chargement de la sรฉrie", "musicNotSupported": "La lecture de musique n'est pas encore prise en charge", @@ -680,6 +688,7 @@ "borrowExplain": "Emprunter la connexion d'un autre profil. Les profils protรฉgรฉs par PIN exigent un PIN.", "borrowEmpty": "Rien ร  emprunter pour le moment.", "borrowEmptySubtitle": "Connectez d'abord Plex ou Jellyfin ร  un autre profil.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "De ${displayName}", "borrowConnectionBorrowed": "Connexion empruntรฉe.", "borrowFailed": "Impossible d'emprunter la connexion.", @@ -944,7 +953,7 @@ "favorites": "Favoris", "reorderFavorites": "Rรฉorganiser les favoris", "favoritesLoadFailed": "Impossible de charger les favoris. Vรฉrifiez votre connexion et rรฉessayez.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "Rejoindre la session en cours", "watchFromStart": "Regarder depuis le dรฉbut (il y a ${minutes} min)", "watchLive": "Regarder en direct", diff --git a/lib/i18n/it.i18n.json b/lib/i18n/it.i18n.json index 6eba0dbf..9d16c8ea 100644 --- a/lib/i18n/it.i18n.json +++ b/lib/i18n/it.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "In attesa di approvazioneโ€ฆ", "quickConnectCancel": "Annulla", "quickConnectExpired": "Quick Connect scaduto. Riprova.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "Cancella", @@ -180,7 +180,7 @@ "watchTogetherRelay": "Relay Guarda Insieme", "watchTogetherRelayDescription": "Imposta un relay personalizzato. Tutti devono usare lo stesso server.", "watchTogetherRelayHint": "https://mio-relay.esempio.it", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "Segnalazione errori", "crashReportingDescription": "Invia segnalazioni di errori per migliorare l'app", "debugLogging": "Log di debug", @@ -197,12 +197,10 @@ "exportSettings": "Esporta impostazioni", "exportSettingsDescription": "Salva le tue preferenze in un file", "exportSettingsSuccess": "Impostazioni esportate", - "exportSettingsFailed": "Impossibile esportare le impostazioni", "importSettings": "Importa impostazioni", "importSettingsDescription": "Ripristina le preferenze da un file", "importSettingsConfirm": "Questa azione sostituirร  le impostazioni attuali. Continuare?", "importSettingsSuccess": "Impostazioni importate", - "importSettingsFailed": "Impossibile importare le impostazioni", "importSettingsInvalidFile": "Questo file non รจ un'esportazione Plezy valida", "importSettingsNoUser": "Accedi prima di importare le impostazioni", "shortcutsReset": "Scorciatoie ripristinate alle impostazioni predefinite", @@ -217,6 +215,7 @@ "validationErrorDuration": "la durata deve essere compresa tra ${min} e ${max} ${unit}", "shortcutAlreadyAssigned": "Scorciatoia giร  assegnata a ${action}", "shortcutUpdated": "Scorciatoia aggiornata per ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "Salto Automatico", "autoSkipIntro": "Salta Intro Automaticamente", "autoSkipIntroDescription": "Salta automaticamente i marcatori dell'intro dopo alcuni secondi", @@ -242,7 +241,7 @@ "downloadLocationChanged": "Posizione di download modificata", "downloadLocationReset": "Posizione di download ripristinata a predefinita", "downloadLocationInvalid": "La cartella selezionata non รจ scrivibile", - "downloadLocationSelectError": "Impossibile selezionare la cartella", + "downloadLocationPickerUnavailable": "La selezione della cartella non รจ disponibile su questo dispositivo", "downloadOnWifiOnly": "Scarica solo con WiFi", "downloadOnWifiOnlyDescription": "Impedisci i download quando si utilizza la rete dati cellulare", "autoRemoveWatchedDownloads": "Rimuovi automaticamente i download visti", @@ -443,7 +442,11 @@ "brightness": "Luminositร ", "hexColor": "Colore esadecimale", "expandText": "Espandi il testo", - "collapseText": "Comprimi il testo" + "collapseText": "Comprimi il testo", + "alphabetNavigation": "Navigazione alfabetica", + "alphabetScrollHint": "Scorri verso l'alto o il basso per cambiare lettera", + "rowColumnPosition": "Riga ${row} di ${rowCount}, colonna ${column} di ${columnCount}", + "rowPosition": "Riga ${row} di ${rowCount}" }, "tooltips": { "shufflePlay": "Riproduzione casuale", @@ -451,6 +454,9 @@ "markAsWatched": "Segna come visto", "markAsUnwatched": "Segna come non visto" }, + "audioTracks": { + "track": "Traccia audio ${n}" + }, "videoControls": { "audioLabel": "Audio", "subtitlesLabel": "Sottotitoli", @@ -478,6 +484,8 @@ "playNext": "Riproduci successivo", "playButton": "Riproduci", "pauseButton": "Pausa", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "Riavvolgi di ${seconds} secondi", "seekForwardButton": "Avanza di ${seconds} secondi", "previousButton": "Episodio precedente", @@ -553,11 +561,11 @@ "streamInterrupted": "La riproduzione si รจ interrotta. Premi Riproduci o scorri per riprovare.", "liveStreamInterrupted": "La diretta si รจ interrotta. Premi Riproduci per riprovare.", "fileInfoNotAvailable": "Informazioni sul file non disponibili", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "Errore caricamento informazioni sul file: ${error}", "errorLoadingSeries": "Errore caricamento serie", "musicNotSupported": "La riproduzione musicale non รจ ancora supportata", @@ -680,6 +688,7 @@ "borrowExplain": "Prendi in prestito la connessione di un altro profilo. I profili protetti da PIN richiedono un PIN.", "borrowEmpty": "Nulla da prendere in prestito al momento.", "borrowEmptySubtitle": "Collega prima Plex o Jellyfin a un altro profilo.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "Da ${displayName}", "borrowConnectionBorrowed": "Connessione presa in prestito.", "borrowFailed": "Impossibile prendere in prestito la connessione.", @@ -944,7 +953,7 @@ "favorites": "Preferiti", "reorderFavorites": "Riordina preferiti", "favoritesLoadFailed": "Impossibile caricare i preferiti. Controlla la connessione e riprova.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "Partecipa alla sessione in corso", "watchFromStart": "Guarda dall'inizio (${minutes} min fa)", "watchLive": "Guarda in diretta", diff --git a/lib/i18n/ja.i18n.json b/lib/i18n/ja.i18n.json index b63f6cd8..49f40905 100644 --- a/lib/i18n/ja.i18n.json +++ b/lib/i18n/ja.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "ๆ‰ฟ่ชใ‚’ๅพ…ใฃใฆใ„ใพใ™โ€ฆ", "quickConnectCancel": "ใ‚ญใƒฃใƒณใ‚ปใƒซ", "quickConnectExpired": "Quick Connectใฎๆœ‰ๅŠนๆœŸ้™ใŒๅˆ‡ใ‚Œใพใ—ใŸใ€‚ใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„ใ€‚", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "ใ‚ญใƒฃใƒณใ‚ปใƒซ", @@ -180,7 +180,7 @@ "watchTogetherRelay": "ไธ€็ท’ใซ่ฆ–่ดใƒชใƒฌใƒผใ‚ตใƒผใƒใƒผ", "watchTogetherRelayDescription": "ใ‚ซใ‚นใ‚ฟใƒ ใƒชใƒฌใƒผใ‚’่จญๅฎšใ—ใพใ™ใ€‚ๅ…จๅ“กใŒๅŒใ˜ใ‚ตใƒผใƒใƒผใ‚’ไฝฟใ†ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚", "watchTogetherRelayHint": "https://my-relay.example.com", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "ใ‚ฏใƒฉใƒƒใ‚ทใƒฅใƒฌใƒใƒผใƒˆ", "crashReportingDescription": "ใ‚ขใƒ—ใƒชใฎๆ”นๅ–„ใซๅฝน็ซ‹ใคใ‚ฏใƒฉใƒƒใ‚ทใƒฅใƒฌใƒใƒผใƒˆใ‚’้€ไฟก", "debugLogging": "ใƒ‡ใƒใƒƒใ‚ฐใƒญใ‚ฐ", @@ -197,12 +197,10 @@ "exportSettings": "่จญๅฎšใ‚’ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆ", "exportSettingsDescription": "่จญๅฎšใ‚’ใƒ•ใ‚กใ‚คใƒซใซไฟๅญ˜", "exportSettingsSuccess": "่จญๅฎšใ‚’ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใ—ใพใ—ใŸ", - "exportSettingsFailed": "่จญๅฎšใ‚’ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใงใใพใ›ใ‚“ใงใ—ใŸ", "importSettings": "่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆ", "importSettingsDescription": "ใƒ•ใ‚กใ‚คใƒซใ‹ใ‚‰่จญๅฎšใ‚’ๅพฉๅ…ƒ", "importSettingsConfirm": "็พๅœจใฎ่จญๅฎšใ‚’็ฝฎใๆ›ใˆใพใ™ใ€‚็ถš่กŒใ—ใพใ™ใ‹๏ผŸ", "importSettingsSuccess": "่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆใ—ใพใ—ใŸ", - "importSettingsFailed": "่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆใงใใพใ›ใ‚“ใงใ—ใŸ", "importSettingsInvalidFile": "ใ“ใฎใƒ•ใ‚กใ‚คใƒซใฏๆœ‰ๅŠนใชPlezyใฎ่จญๅฎšใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใงใฏใ‚ใ‚Šใพใ›ใ‚“", "importSettingsNoUser": "่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆใ™ใ‚‹ๅ‰ใซใ‚ตใ‚คใƒณใ‚คใƒณใ—ใฆใใ ใ•ใ„", "shortcutsReset": "ใ‚ทใƒงใƒผใƒˆใ‚ซใƒƒใƒˆใ‚’ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใซใƒชใ‚ปใƒƒใƒˆใ—ใพใ—ใŸ", @@ -217,6 +215,7 @@ "validationErrorDuration": "ๆ™‚้–“ใฏ${min}ใ‹ใ‚‰${max} ${unit}ใฎ้–“ใงใ‚ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™", "shortcutAlreadyAssigned": "ใ‚ทใƒงใƒผใƒˆใ‚ซใƒƒใƒˆใฏๆ—ขใซ${action}ใซๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใฆใ„ใพใ™", "shortcutUpdated": "${action}ใฎใ‚ทใƒงใƒผใƒˆใ‚ซใƒƒใƒˆใ‚’ๆ›ดๆ–ฐใ—ใพใ—ใŸ", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "่‡ชๅ‹•ใ‚นใ‚ญใƒƒใƒ—", "autoSkipIntro": "ใ‚คใƒณใƒˆใƒญใ‚’่‡ชๅ‹•ใ‚นใ‚ญใƒƒใƒ—", "autoSkipIntroDescription": "ๆ•ฐ็ง’ๅพŒใซใ‚คใƒณใƒˆใƒญใƒžใƒผใ‚ซใƒผใ‚’่‡ชๅ‹•็š„ใซใ‚นใ‚ญใƒƒใƒ—", @@ -242,7 +241,7 @@ "downloadLocationChanged": "ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ๅ ดๆ‰€ใ‚’ๅค‰ๆ›ดใ—ใพใ—ใŸ", "downloadLocationReset": "ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ๅ ดๆ‰€ใ‚’ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใซใƒชใ‚ปใƒƒใƒˆใ—ใพใ—ใŸ", "downloadLocationInvalid": "้ธๆŠžใ—ใŸใƒ•ใ‚ฉใƒซใƒ€ใฏๆ›ธใ่พผใฟใงใใพใ›ใ‚“", - "downloadLocationSelectError": "ใƒ•ใ‚ฉใƒซใƒ€ใฎ้ธๆŠžใซๅคฑๆ•—ใ—ใพใ—ใŸ", + "downloadLocationPickerUnavailable": "ใ“ใฎใƒ‡ใƒใ‚คใ‚นใงใฏใƒ•ใ‚ฉใƒซใƒ€ใ‚’้ธๆŠžใงใใพใ›ใ‚“", "downloadOnWifiOnly": "WiFiใฎใฟใงใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰", "downloadOnWifiOnlyDescription": "ใƒขใƒใ‚คใƒซใƒ‡ใƒผใ‚ฟ้€šไฟกๆ™‚ใฎใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใ‚’้˜ฒๆญข", "autoRemoveWatchedDownloads": "่ฆ–่ดๆธˆใฟใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใฎ่‡ชๅ‹•ๅ‰Š้™ค", @@ -443,7 +442,11 @@ "brightness": "ๆ˜Žใ‚‹ใ•", "hexColor": "16้€ฒใ‚ซใƒฉใƒผ", "expandText": "ใƒ†ใ‚ญใ‚นใƒˆใ‚’ๅฑ•้–‹", - "collapseText": "ใƒ†ใ‚ญใ‚นใƒˆใ‚’ๆŠ˜ใ‚ŠใŸใŸใ‚€" + "collapseText": "ใƒ†ใ‚ญใ‚นใƒˆใ‚’ๆŠ˜ใ‚ŠใŸใŸใ‚€", + "alphabetNavigation": "ใ‚ขใƒซใƒ•ใ‚กใƒ™ใƒƒใƒˆใƒŠใƒ“ใ‚ฒใƒผใ‚ทใƒงใƒณ", + "alphabetScrollHint": "ไธŠไธ‹ใซใ‚นใƒฏใ‚คใƒ—ใ—ใฆๆ–‡ๅญ—ใ”ใจใซ็งปๅ‹•", + "rowColumnPosition": "${rowCount}่กŒไธญ${row}่กŒใ€${columnCount}ๅˆ—ไธญ${column}ๅˆ—", + "rowPosition": "${rowCount}่กŒไธญ${row}่กŒ" }, "tooltips": { "shufflePlay": "ใ‚ทใƒฃใƒƒใƒ•ใƒซๅ†็”Ÿ", @@ -451,6 +454,9 @@ "markAsWatched": "่ฆ–่ดๆธˆใฟใซใ™ใ‚‹", "markAsUnwatched": "ๆœช่ฆ–่ดใซใ™ใ‚‹" }, + "audioTracks": { + "track": "้Ÿณๅฃฐใƒˆใƒฉใƒƒใ‚ฏ${n}" + }, "videoControls": { "audioLabel": "้Ÿณๅฃฐ", "subtitlesLabel": "ๅญ—ๅน•", @@ -478,6 +484,8 @@ "playNext": "ๆฌกใ‚’ๅ†็”Ÿ", "playButton": "ๅ†็”Ÿ", "pauseButton": "ไธ€ๆ™‚ๅœๆญข", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "${seconds}็ง’ๆˆปใ‚‹", "seekForwardButton": "${seconds}็ง’้€ฒใ‚€", "previousButton": "ๅ‰ใฎใ‚จใƒ”ใ‚ฝใƒผใƒ‰", @@ -552,11 +560,11 @@ "streamInterrupted": "ใ‚นใƒˆใƒชใƒผใƒ ใŒไธญๆ–ญใ•ใ‚Œใพใ—ใŸใ€‚ๅ†็”Ÿใ‚’ๆŠผใ™ใ‹ใ‚ทใƒผใ‚ฏใ—ใฆๅ†่ฉฆ่กŒใ—ใฆใใ ใ•ใ„ใ€‚", "liveStreamInterrupted": "ใƒฉใ‚คใƒ–ใ‚นใƒˆใƒชใƒผใƒ ใŒไธญๆ–ญใ•ใ‚Œใพใ—ใŸใ€‚ๅ†็”Ÿใ‚’ๆŠผใ—ใฆๅ†่ฉฆ่กŒใ—ใฆใใ ใ•ใ„ใ€‚", "fileInfoNotAvailable": "ใƒ•ใ‚กใ‚คใƒซๆƒ…ๅ ฑใŒๅˆฉ็”จใงใใพใ›ใ‚“", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "ใƒ•ใ‚กใ‚คใƒซๆƒ…ๅ ฑใฎ่ชญใฟ่พผใฟใ‚จใƒฉใƒผ: ${error}", "errorLoadingSeries": "ใ‚ทใƒชใƒผใ‚บใฎ่ชญใฟ่พผใฟใ‚จใƒฉใƒผ", "musicNotSupported": "้Ÿณๆฅฝใฎๅ†็”Ÿใฏใพใ ใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“", @@ -679,6 +687,7 @@ "borrowExplain": "ๅˆฅใฎใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใฎๆŽฅ็ถšใ‚’ๅ€Ÿ็”จใ—ใพใ™ใ€‚PINไฟ่ญทใ•ใ‚ŒใŸใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใซใฏPINใŒๅฟ…่ฆใงใ™ใ€‚", "borrowEmpty": "ใพใ ๅ€Ÿใ‚Šใ‚‹ใ‚‚ใฎใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚", "borrowEmptySubtitle": "ใพใšๅˆฅใฎใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใซPlexใพใŸใฏJellyfinใ‚’ๆŽฅ็ถšใ—ใฆใใ ใ•ใ„ใ€‚", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "${displayName}ใ‹ใ‚‰", "borrowConnectionBorrowed": "ๆŽฅ็ถšใ‚’ๅ€Ÿ็”จใ—ใพใ—ใŸใ€‚", "borrowFailed": "ๆŽฅ็ถšใ‚’ๅ€Ÿ็”จใงใใพใ›ใ‚“ใงใ—ใŸใ€‚", @@ -942,7 +951,7 @@ "favorites": "ใŠๆฐ—ใซๅ…ฅใ‚Š", "reorderFavorites": "ใŠๆฐ—ใซๅ…ฅใ‚Šใ‚’ไธฆในๆ›ฟใˆ", "favoritesLoadFailed": "ใŠๆฐ—ใซๅ…ฅใ‚Šใ‚’่ชญใฟ่พผใ‚ใพใ›ใ‚“ใงใ—ใŸใ€‚ๆŽฅ็ถšใ‚’็ขบ่ชใ—ใฆใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„ใ€‚", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "้€ฒ่กŒไธญใฎใ‚ปใƒƒใ‚ทใƒงใƒณใซๅ‚ๅŠ ", "watchFromStart": "ๆœ€ๅˆใ‹ใ‚‰่ฆ–่ด๏ผˆ${minutes}ๅˆ†ๅ‰ใซ้–‹ๅง‹๏ผ‰", "watchLive": "ใƒฉใ‚คใƒ–ใง่ฆ–่ด", diff --git a/lib/i18n/ko.i18n.json b/lib/i18n/ko.i18n.json index 0e955d95..5c361658 100644 --- a/lib/i18n/ko.i18n.json +++ b/lib/i18n/ko.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "์Šน์ธ ๋Œ€๊ธฐ ์ค‘โ€ฆ", "quickConnectCancel": "์ทจ์†Œ", "quickConnectExpired": "Quick Connect๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "์ทจ์†Œ", @@ -180,7 +180,7 @@ "watchTogetherRelay": "ํ•จ๊ป˜ ๋ณด๊ธฐ ๋ฆด๋ ˆ์ด", "watchTogetherRelayDescription": "์‚ฌ์šฉ์ž ์ง€์ • ๋ฆด๋ ˆ์ด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ๊ฐ™์€ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.", "watchTogetherRelayHint": "https://my-relay.example.com", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "์ถฉ๋Œ ๋ณด๊ณ ", "crashReportingDescription": "์•ฑ ๊ฐœ์„ ์„ ์œ„ํ•ด ์ถฉ๋Œ ๋ณด๊ณ ์„œ ์ „์†ก", "debugLogging": "๋””๋ฒ„๊ทธ ๋กœ๊น…", @@ -197,12 +197,10 @@ "exportSettings": "์„ค์ • ๋‚ด๋ณด๋‚ด๊ธฐ", "exportSettingsDescription": "๊ธฐ๋ณธ ์„ค์ •์„ ํŒŒ์ผ๋กœ ์ €์žฅ", "exportSettingsSuccess": "์„ค์ • ๋‚ด๋ณด๋‚ด๊ธฐ ์™„๋ฃŒ", - "exportSettingsFailed": "์„ค์ •์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค", "importSettings": "์„ค์ • ๊ฐ€์ ธ์˜ค๊ธฐ", "importSettingsDescription": "ํŒŒ์ผ์—์„œ ๊ธฐ๋ณธ ์„ค์ • ๋ณต์›", "importSettingsConfirm": "ํ˜„์žฌ ์„ค์ •์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?", "importSettingsSuccess": "์„ค์ • ๊ฐ€์ ธ์˜ค๊ธฐ ์™„๋ฃŒ", - "importSettingsFailed": "์„ค์ •์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค", "importSettingsInvalidFile": "์œ ํšจํ•œ Plezy ์„ค์ • ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค", "importSettingsNoUser": "์„ค์ •์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์ „์— ๋กœ๊ทธ์ธํ•˜์„ธ์š”", "shortcutsReset": "๋‹จ์ถ•ํ‚ค๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žฌ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค", @@ -217,6 +215,7 @@ "validationErrorDuration": "๊ธฐ๊ฐ„์€ ${min}๊ณผ ${max} ${unit} ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค", "shortcutAlreadyAssigned": "๋‹จ์ถ•ํ‚ค๊ฐ€ ์ด๋ฏธ ${action}์— ํ• ๋‹น ๋˜์—ˆ์Šต๋‹ˆ๋‹ค", "shortcutUpdated": "๋‹จ์ถ•ํ‚ค๊ฐ€ ${action}์— ๋Œ€ํ•ด ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "์ž๋™ ๊ฑด๋„ˆ๋›ฐ๊ธฐ", "autoSkipIntro": "์ž๋™์œผ๋กœ ์˜คํ”„๋‹ ๊ฑด๋„ˆ๋›ฐ๊ธฐ", "autoSkipIntroDescription": "๋ช‡ ์ดˆ ํ›„ ์˜คํ”„๋‹์„ ์ž๋™์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ", @@ -242,7 +241,7 @@ "downloadLocationChanged": "๋‹ค์šด๋กœ๋“œ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค", "downloadLocationReset": "๋‹ค์šด๋กœ๋“œ ์œ„์น˜๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žฌ์„ค์ • ๋˜์—ˆ์Šต๋‹ˆ๋‹ค", "downloadLocationInvalid": "์„ ํƒํ•œ ํด๋”์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค", - "downloadLocationSelectError": "ํด๋” ์„ ํƒ ์‹คํŒจ", + "downloadLocationPickerUnavailable": "์ด ๊ธฐ๊ธฐ์—์„œ๋Š” ํด๋”๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค", "downloadOnWifiOnly": "WiFi ์—ฐ๊ฒฐ ์‹œ์—๋งŒ ๋‹ค์šด๋กœ๋“œ", "downloadOnWifiOnlyDescription": "์…€๋ฃฐ๋Ÿฌ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ์‹œ ๋‹ค์šด๋กœ๋“œ ๋ถˆ๊ฐ€", "autoRemoveWatchedDownloads": "์‹œ์ฒญํ•œ ๋‹ค์šด๋กœ๋“œ ์ž๋™ ์‚ญ์ œ", @@ -443,7 +442,11 @@ "brightness": "๋ฐ๊ธฐ", "hexColor": "16์ง„์ˆ˜ ์ƒ‰์ƒ", "expandText": "ํ…์ŠคํŠธ ํŽผ์น˜๊ธฐ", - "collapseText": "ํ…์ŠคํŠธ ์ ‘๊ธฐ" + "collapseText": "ํ…์ŠคํŠธ ์ ‘๊ธฐ", + "alphabetNavigation": "์•ŒํŒŒ๋ฒณ ํƒ์ƒ‰", + "alphabetScrollHint": "์œ„์•„๋ž˜๋กœ ์Šค์™€์ดํ”„ํ•˜์—ฌ ๊ธ€์ž๋ณ„๋กœ ์ด๋™", + "rowColumnPosition": "${rowCount}ํ–‰ ์ค‘ ${row}ํ–‰, ${columnCount}์—ด ์ค‘ ${column}์—ด", + "rowPosition": "${rowCount}ํ–‰ ์ค‘ ${row}ํ–‰" }, "tooltips": { "shufflePlay": "๋ฌด์ž‘์œ„ ์žฌ์ƒ", @@ -451,6 +454,9 @@ "markAsWatched": "์‹œ์ฒญ ์™„๋ฃŒ๋กœ ํ‘œ์‹œ", "markAsUnwatched": "์‹œ์ฒญ ์•ˆ ํ•จ์œผ๋กœ ํ‘œ์‹œ" }, + "audioTracks": { + "track": "์˜ค๋””์˜ค ํŠธ๋ž™ ${n}" + }, "videoControls": { "audioLabel": "์˜ค๋””์˜ค", "subtitlesLabel": "์ž๋ง‰", @@ -478,6 +484,8 @@ "playNext": "๋‹ค์Œ ์žฌ์ƒ", "playButton": "์žฌ์ƒ", "pauseButton": "์ผ์‹œ์ •์ง€", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "${seconds} ์ดˆ ๋’ค๋กœ", "seekForwardButton": "${seconds} ์ดˆ ์•ž์œผ๋กœ", "previousButton": "์ด์ „ ์—ํ”ผ์†Œ๋“œ", @@ -552,11 +560,11 @@ "streamInterrupted": "์ŠคํŠธ๋ฆผ์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ƒ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ํƒ์ƒ‰ํ•˜์—ฌ ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.", "liveStreamInterrupted": "๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆผ์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ƒ์„ ๋ˆŒ๋Ÿฌ ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.", "fileInfoNotAvailable": "ํŒŒ์ผ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "ํŒŒ์ผ ์ •๋ณด ๋กœ๋”ฉ ์ค‘ ์˜ค๋ฅ˜: ${error}", "errorLoadingSeries": "์‹œ๋ฆฌ์ฆˆ ๋กœ๋”ฉ ์ค‘ ์˜ค๋ฅ˜", "musicNotSupported": "์Œ์•… ์žฌ์ƒ ๋ฏธ์ง€์›", @@ -679,6 +687,7 @@ "borrowExplain": "๋‹ค๋ฅธ ํ”„๋กœํ•„์˜ ์—ฐ๊ฒฐ์„ ๋นŒ๋ฆฝ๋‹ˆ๋‹ค. PIN์œผ๋กœ ๋ณดํ˜ธ๋œ ํ”„๋กœํ•„์—๋Š” PIN์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.", "borrowEmpty": "์•„์ง ๋นŒ๋ฆด ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.", "borrowEmptySubtitle": "๋จผ์ € ๋‹ค๋ฅธ ํ”„๋กœํ•„์— Plex ๋˜๋Š” Jellyfin์„ ์—ฐ๊ฒฐํ•˜์„ธ์š”.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "${displayName}์—์„œ", "borrowConnectionBorrowed": "์—ฐ๊ฒฐ์„ ๋นŒ๋ ธ์Šต๋‹ˆ๋‹ค.", "borrowFailed": "์—ฐ๊ฒฐ์„ ๋นŒ๋ฆฌ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.", @@ -942,7 +951,7 @@ "favorites": "์ฆ๊ฒจ์ฐพ๊ธฐ", "reorderFavorites": "์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆœ์„œ ๋ณ€๊ฒฝ", "favoritesLoadFailed": "์ฆ๊ฒจ์ฐพ๊ธฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "์ง„ํ–‰ ์ค‘์ธ ์„ธ์…˜ ์ฐธ์—ฌ", "watchFromStart": "์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ฒญ (${minutes}๋ถ„ ์ „ ์‹œ์ž‘)", "watchLive": "์‹ค์‹œ๊ฐ„ ์‹œ์ฒญ", diff --git a/lib/i18n/nb.i18n.json b/lib/i18n/nb.i18n.json index d7660f76..532c8fc2 100644 --- a/lib/i18n/nb.i18n.json +++ b/lib/i18n/nb.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "Venter pรฅ godkjenningโ€ฆ", "quickConnectCancel": "Avbryt", "quickConnectExpired": "Quick Connect er utlรธpt. Prรธv igjen.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "Avbryt", @@ -180,7 +180,7 @@ "watchTogetherRelay": "Se Sammen-relay", "watchTogetherRelayDescription": "Angi en egendefinert relay. Alle mรฅ bruke samme server.", "watchTogetherRelayHint": "https://min-relay.eksempel.no", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "Krasjrapportering", "crashReportingDescription": "Send krasjrapporter for รฅ hjelpe med รฅ forbedre appen", "debugLogging": "Feilsรธkingslogging", @@ -197,12 +197,10 @@ "exportSettings": "Eksporter innstillinger", "exportSettingsDescription": "Lagre innstillingene i en fil", "exportSettingsSuccess": "Innstillinger eksportert", - "exportSettingsFailed": "Kunne ikke eksportere innstillinger", "importSettings": "Importer innstillinger", "importSettingsDescription": "Gjenopprett innstillinger fra en fil", "importSettingsConfirm": "Dette vil erstatte nรฅvรฆrende innstillinger. Fortsette?", "importSettingsSuccess": "Innstillinger importert", - "importSettingsFailed": "Kunne ikke importere innstillinger", "importSettingsInvalidFile": "Denne filen er ikke en gyldig Plezy-innstillingseksport", "importSettingsNoUser": "Logg inn fรธr import av innstillinger", "shortcutsReset": "Snarveier tilbakestilt til standard", @@ -217,6 +215,7 @@ "validationErrorDuration": "Varigheten mรฅ vรฆre mellom ${min} og ${max} ${unit}", "shortcutAlreadyAssigned": "Snarvei allerede tilordnet til ${action}", "shortcutUpdated": "Snarvei oppdatert for ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "Automatisk hopp", "autoSkipIntro": "Hopp over intro automatisk", "autoSkipIntroDescription": "Hopp automatisk over intromarkรธrer etter noen sekunder", @@ -242,7 +241,7 @@ "downloadLocationChanged": "Nedlastingsplassering endret", "downloadLocationReset": "Nedlastingsplassering tilbakestilt til standard", "downloadLocationInvalid": "Valgt mappe er ikke skrivbar", - "downloadLocationSelectError": "Kunne ikke velge mappe", + "downloadLocationPickerUnavailable": "Mappevalg er ikke tilgjengelig pรฅ denne enheten", "downloadOnWifiOnly": "Last ned kun pรฅ WiFi", "downloadOnWifiOnlyDescription": "Forhindre nedlastinger pรฅ mobildata", "autoRemoveWatchedDownloads": "Fjern sette nedlastinger automatisk", @@ -443,7 +442,11 @@ "brightness": "Lysstyrke", "hexColor": "Heksadesimal farge", "expandText": "Utvid tekst", - "collapseText": "Fold sammen tekst" + "collapseText": "Fold sammen tekst", + "alphabetNavigation": "Alfabetisk navigasjon", + "alphabetScrollHint": "Sveip opp eller ned for รฅ flytte รฉn bokstav", + "rowColumnPosition": "Rad ${row} av ${rowCount}, kolonne ${column} av ${columnCount}", + "rowPosition": "Rad ${row} av ${rowCount}" }, "tooltips": { "shufflePlay": "Tilfeldig avspilling", @@ -451,6 +454,9 @@ "markAsWatched": "Merk som sett", "markAsUnwatched": "Merk som usett" }, + "audioTracks": { + "track": "Lydspor ${n}" + }, "videoControls": { "audioLabel": "Lyd", "subtitlesLabel": "Undertekster", @@ -478,6 +484,8 @@ "playNext": "Spill neste", "playButton": "Spill av", "pauseButton": "Pause", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "Spol tilbake ${seconds} sekunder", "seekForwardButton": "Spol fremover ${seconds} sekunder", "previousButton": "Forrige episode", @@ -553,11 +561,11 @@ "streamInterrupted": "Avspillingen ble avbrutt. Trykk pรฅ Spill av eller spol for รฅ prรธve pรฅ nytt.", "liveStreamInterrupted": "Direktesendingen ble avbrutt. Trykk pรฅ Spill av for รฅ prรธve pรฅ nytt.", "fileInfoNotAvailable": "Filinformasjon ikke tilgjengelig", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "Feil ved lasting av filinformasjon: ${error}", "errorLoadingSeries": "Feil ved lasting av serie", "musicNotSupported": "Musikkavspilling stรธttes ikke ennรฅ", @@ -680,6 +688,7 @@ "borrowExplain": "Lรฅn en annen profils tilkobling. PIN-beskyttede profiler krever PIN.", "borrowEmpty": "Ingenting รฅ lรฅne enda.", "borrowEmptySubtitle": "Koble Plex eller Jellyfin til en annen profil fรธrst.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "Fra ${displayName}", "borrowConnectionBorrowed": "Tilkobling lรฅnt.", "borrowFailed": "Kunne ikke lรฅne tilkoblingen.", @@ -944,7 +953,7 @@ "favorites": "Favoritter", "reorderFavorites": "Endre rekkefรธlge pรฅ favoritter", "favoritesLoadFailed": "Kunne ikke laste inn favoritter. Kontroller tilkoblingen og prรธv pรฅ nytt.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "Bli med i pรฅgรฅende รธkt", "watchFromStart": "Se fra starten (${minutes} min siden)", "watchLive": "Se direkte", diff --git a/lib/i18n/nl.i18n.json b/lib/i18n/nl.i18n.json index 7e369c3d..4c50e2b8 100644 --- a/lib/i18n/nl.i18n.json +++ b/lib/i18n/nl.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "Wachten op goedkeuringโ€ฆ", "quickConnectCancel": "Annuleren", "quickConnectExpired": "Quick Connect is verlopen. Probeer opnieuw.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "Annuleren", @@ -180,7 +180,7 @@ "watchTogetherRelay": "Samen Kijken Relay", "watchTogetherRelayDescription": "Stel een aangepaste relay in. Iedereen moet dezelfde server gebruiken.", "watchTogetherRelayHint": "https://mijn-relay.voorbeeld.nl", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "Crashrapportage", "crashReportingDescription": "Crashrapporten verzenden om de app te verbeteren", "debugLogging": "Debug logging", @@ -197,12 +197,10 @@ "exportSettings": "Instellingen exporteren", "exportSettingsDescription": "Sla je voorkeuren op in een bestand", "exportSettingsSuccess": "Instellingen geรซxporteerd", - "exportSettingsFailed": "Kon instellingen niet exporteren", "importSettings": "Instellingen importeren", "importSettingsDescription": "Voorkeuren herstellen vanuit een bestand", "importSettingsConfirm": "Hiermee worden je huidige instellingen vervangen. Doorgaan?", "importSettingsSuccess": "Instellingen geรฏmporteerd", - "importSettingsFailed": "Kon instellingen niet importeren", "importSettingsInvalidFile": "Dit bestand is geen geldige Plezy-export", "importSettingsNoUser": "Meld je aan voordat je instellingen importeert", "shortcutsReset": "Sneltoetsen gereset naar standaard", @@ -217,6 +215,7 @@ "validationErrorDuration": "Duur moet tussen ${min} en ${max} ${unit} zijn", "shortcutAlreadyAssigned": "Sneltoets al toegewezen aan ${action}", "shortcutUpdated": "Sneltoets bijgewerkt voor ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "Automatisch Overslaan", "autoSkipIntro": "Intro Automatisch Overslaan", "autoSkipIntroDescription": "Intro-markeringen na enkele seconden automatisch overslaan", @@ -242,7 +241,7 @@ "downloadLocationChanged": "Downloadlocatie gewijzigd", "downloadLocationReset": "Downloadlocatie hersteld naar standaard", "downloadLocationInvalid": "Geselecteerde map is niet beschrijfbaar", - "downloadLocationSelectError": "Kan map niet selecteren", + "downloadLocationPickerUnavailable": "Mapselectie is niet beschikbaar op dit apparaat", "downloadOnWifiOnly": "Alleen via WiFi downloaden", "downloadOnWifiOnlyDescription": "Voorkom downloads bij gebruik van mobiele data", "autoRemoveWatchedDownloads": "Bekeken downloads automatisch verwijderen", @@ -443,7 +442,11 @@ "brightness": "Helderheid", "hexColor": "Hexkleur", "expandText": "Tekst uitvouwen", - "collapseText": "Tekst samenvouwen" + "collapseText": "Tekst samenvouwen", + "alphabetNavigation": "Alfabetische navigatie", + "alphabetScrollHint": "Veeg omhoog of omlaag om per letter te bewegen", + "rowColumnPosition": "Rij ${row} van ${rowCount}, kolom ${column} van ${columnCount}", + "rowPosition": "Rij ${row} van ${rowCount}" }, "tooltips": { "shufflePlay": "Willekeurig afspelen", @@ -451,6 +454,9 @@ "markAsWatched": "Markeer als gekeken", "markAsUnwatched": "Markeer als ongekeken" }, + "audioTracks": { + "track": "Audiospoor ${n}" + }, "videoControls": { "audioLabel": "Audio", "subtitlesLabel": "Ondertitels", @@ -478,6 +484,8 @@ "playNext": "Volgende afspelen", "playButton": "Afspelen", "pauseButton": "Pauzeren", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "Terugspoelen ${seconds} seconden", "seekForwardButton": "Vooruitspoelen ${seconds} seconden", "previousButton": "Vorige aflevering", @@ -553,11 +561,11 @@ "streamInterrupted": "De stream is onderbroken. Druk op afspelen of spoel om het opnieuw te proberen.", "liveStreamInterrupted": "De livestream is onderbroken. Druk op afspelen om het opnieuw te proberen.", "fileInfoNotAvailable": "Bestand informatie niet beschikbaar", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "Fout bij laden bestand info: ${error}", "errorLoadingSeries": "Fout bij laden serie", "musicNotSupported": "Muziek afspelen wordt nog niet ondersteund", @@ -680,6 +688,7 @@ "borrowExplain": "Leen de verbinding van een ander profiel. PIN-beveiligde profielen vereisen een PIN.", "borrowEmpty": "Nog niets te lenen.", "borrowEmptySubtitle": "Verbind Plex of Jellyfin eerst met een ander profiel.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "Van ${displayName}", "borrowConnectionBorrowed": "Verbinding geleend.", "borrowFailed": "Kan verbinding niet lenen.", @@ -944,7 +953,7 @@ "favorites": "Favorieten", "reorderFavorites": "Favorieten herordenen", "favoritesLoadFailed": "Favorieten konden niet worden geladen. Controleer je verbinding en probeer het opnieuw.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "Deelnemen aan lopende sessie", "watchFromStart": "Kijk vanaf het begin (${minutes} min geleden)", "watchLive": "Live kijken", diff --git a/lib/i18n/pl.i18n.json b/lib/i18n/pl.i18n.json index 72038214..7b90de2c 100644 --- a/lib/i18n/pl.i18n.json +++ b/lib/i18n/pl.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "Oczekiwanie na zatwierdzenieโ€ฆ", "quickConnectCancel": "Anuluj", "quickConnectExpired": "Quick Connect wygasล‚. Sprรณbuj ponownie.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "Anuluj", @@ -180,7 +180,7 @@ "watchTogetherRelay": "Relay Oglฤ…daj Razem", "watchTogetherRelayDescription": "Ustaw wล‚asny relay. Wszyscy muszฤ… uลผywaฤ‡ tego samego serwera.", "watchTogetherRelayHint": "https://moj-relay.przyklad.pl", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "Raportowanie bล‚ฤ™dรณw", "crashReportingDescription": "Wysyล‚aj raporty o bล‚ฤ™dach, aby pomรณc ulepszyฤ‡ aplikacjฤ™", "debugLogging": "Logowanie debugowania", @@ -197,12 +197,10 @@ "exportSettings": "Eksportuj ustawienia", "exportSettingsDescription": "Zapisz swoje preferencje do pliku", "exportSettingsSuccess": "Ustawienia wyeksportowane", - "exportSettingsFailed": "Nie moลผna wyeksportowaฤ‡ ustawieล„", "importSettings": "Importuj ustawienia", "importSettingsDescription": "Przywrรณฤ‡ preferencje z pliku", "importSettingsConfirm": "Bieลผฤ…ce ustawienia zostanฤ… zastฤ…pione. Kontynuowaฤ‡?", "importSettingsSuccess": "Ustawienia zaimportowane", - "importSettingsFailed": "Nie moลผna zaimportowaฤ‡ ustawieล„", "importSettingsInvalidFile": "Ten plik nie jest prawidล‚owym eksportem Plezy", "importSettingsNoUser": "Zaloguj siฤ™ przed importem ustawieล„", "shortcutsReset": "Skrรณty przywrรณcone do domyล›lnych", @@ -217,6 +215,7 @@ "validationErrorDuration": "Czas musi byฤ‡ miฤ™dzy ${min} a ${max} ${unit}", "shortcutAlreadyAssigned": "Skrรณt jest juลผ przypisany do ${action}", "shortcutUpdated": "Skrรณt zaktualizowany dla ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "Automatyczne pomijanie", "autoSkipIntro": "Automatyczne pomijanie intro", "autoSkipIntroDescription": "Automatycznie pomijaj znaczniki intro po kilku sekundach", @@ -242,7 +241,7 @@ "downloadLocationChanged": "Lokalizacja pobierania zmieniona", "downloadLocationReset": "Lokalizacja pobierania przywrรณcona do domyล›lnej", "downloadLocationInvalid": "Wybrany folder nie jest zapisywalny", - "downloadLocationSelectError": "Nie udaล‚o siฤ™ wybraฤ‡ folderu", + "downloadLocationPickerUnavailable": "Wybรณr folderu nie jest dostฤ™pny na tym urzฤ…dzeniu", "downloadOnWifiOnly": "Pobieraj tylko przez WiFi", "downloadOnWifiOnlyDescription": "Blokuj pobieranie na danych komรณrkowych", "autoRemoveWatchedDownloads": "Automatycznie usuwaj obejrzane pobrania", @@ -443,7 +442,11 @@ "brightness": "Jasnoล›ฤ‡", "hexColor": "Kolor szesnastkowy", "expandText": "Rozwiล„ tekst", - "collapseText": "Zwiล„ tekst" + "collapseText": "Zwiล„ tekst", + "alphabetNavigation": "Nawigacja alfabetyczna", + "alphabetScrollHint": "Przesuล„ w gรณrฤ™ lub w dรณล‚, aby przejล›ฤ‡ o literฤ™", + "rowColumnPosition": "Wiersz ${row} z ${rowCount}, kolumna ${column} z ${columnCount}", + "rowPosition": "Wiersz ${row} z ${rowCount}" }, "tooltips": { "shufflePlay": "Odtwarzanie losowe", @@ -451,6 +454,9 @@ "markAsWatched": "Oznacz jako obejrzane", "markAsUnwatched": "Oznacz jako nieobejrzane" }, + "audioTracks": { + "track": "ลšcieลผka audio ${n}" + }, "videoControls": { "audioLabel": "Audio", "subtitlesLabel": "Napisy", @@ -478,6 +484,8 @@ "playNext": "Odtwรณrz nastฤ™pny", "playButton": "Odtwรณrz", "pauseButton": "Pauza", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "Przewiล„ do tyล‚u o ${seconds} sekund", "seekForwardButton": "Przewiล„ do przodu o ${seconds} sekund", "previousButton": "Poprzedni odcinek", @@ -555,11 +563,11 @@ "streamInterrupted": "Strumieล„ zostaล‚ przerwany. Naciล›nij odtwarzanie lub przewiล„, aby sprรณbowaฤ‡ ponownie.", "liveStreamInterrupted": "Transmisja na ลผywo zostaล‚a przerwana. Naciล›nij odtwarzanie, aby sprรณbowaฤ‡ ponownie.", "fileInfoNotAvailable": "Informacje o pliku niedostฤ™pne", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "Bล‚ฤ…d ล‚adowania informacji o pliku: ${error}", "errorLoadingSeries": "Bล‚ฤ…d ล‚adowania serialu", "musicNotSupported": "Odtwarzanie muzyki nie jest jeszcze obsล‚ugiwane", @@ -682,6 +690,7 @@ "borrowExplain": "Poลผycz poล‚ฤ…czenie z innego profilu. Profile chronione PIN wymagajฤ… PIN-u.", "borrowEmpty": "Nic do poลผyczenia.", "borrowEmptySubtitle": "Najpierw poล‚ฤ…cz Plex lub Jellyfin z innym profilem.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "Od ${displayName}", "borrowConnectionBorrowed": "Poล‚ฤ…czenie poลผyczone.", "borrowFailed": "Nie udaล‚o siฤ™ poลผyczyฤ‡ poล‚ฤ…czenia.", @@ -948,7 +957,7 @@ "favorites": "Ulubione", "reorderFavorites": "Zmieล„ kolejnoล›ฤ‡ ulubionych", "favoritesLoadFailed": "Nie udaล‚o siฤ™ wczytaฤ‡ ulubionych. Sprawdลบ poล‚ฤ…czenie i sprรณbuj ponownie.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "Doล‚ฤ…cz do trwajฤ…cej sesji", "watchFromStart": "Oglฤ…daj od poczฤ…tku (${minutes} min temu)", "watchLive": "Oglฤ…daj na ลผywo", diff --git a/lib/i18n/pt.i18n.json b/lib/i18n/pt.i18n.json index 2cd061e3..fc976110 100644 --- a/lib/i18n/pt.i18n.json +++ b/lib/i18n/pt.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "A aguardar aprovaรงรฃoโ€ฆ", "quickConnectCancel": "Cancelar", "quickConnectExpired": "Quick Connect expirou. Tente novamente.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "Cancelar", @@ -180,7 +180,7 @@ "watchTogetherRelay": "Relay do Assistir Juntos", "watchTogetherRelayDescription": "Defina um relay personalizado. Todos devem usar o mesmo servidor.", "watchTogetherRelayHint": "https://meu-relay.exemplo.com.br", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "Relatรณrio de Erros", "crashReportingDescription": "Enviar relatรณrios de erros para ajudar a melhorar o app", "debugLogging": "Log de Depuraรงรฃo", @@ -197,12 +197,10 @@ "exportSettings": "Exportar Configuraรงรตes", "exportSettingsDescription": "Salve suas preferรชncias em um arquivo", "exportSettingsSuccess": "Configuraรงรตes exportadas", - "exportSettingsFailed": "Nรฃo foi possรญvel exportar as configuraรงรตes", "importSettings": "Importar Configuraรงรตes", "importSettingsDescription": "Restaurar preferรชncias a partir de um arquivo", "importSettingsConfirm": "Isso substituirรก suas configuraรงรตes atuais. Continuar?", "importSettingsSuccess": "Configuraรงรตes importadas", - "importSettingsFailed": "Nรฃo foi possรญvel importar as configuraรงรตes", "importSettingsInvalidFile": "Este arquivo nรฃo รฉ uma exportaรงรฃo vรกlida do Plezy", "importSettingsNoUser": "Entre na conta antes de importar as configuraรงรตes", "shortcutsReset": "Atalhos redefinidos para o padrรฃo", @@ -217,6 +215,7 @@ "validationErrorDuration": "A duraรงรฃo deve ser entre ${min} e ${max} ${unit}", "shortcutAlreadyAssigned": "Atalho jรก atribuรญdo a ${action}", "shortcutUpdated": "Atalho atualizado para ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "Pular Automaticamente", "autoSkipIntro": "Pular Intro Automaticamente", "autoSkipIntroDescription": "Pular marcadores de intro automaticamente apรณs alguns segundos", @@ -242,7 +241,7 @@ "downloadLocationChanged": "Local de download alterado", "downloadLocationReset": "Local de download redefinido para padrรฃo", "downloadLocationInvalid": "A pasta selecionada nรฃo permite gravaรงรฃo", - "downloadLocationSelectError": "Falha ao selecionar pasta", + "downloadLocationPickerUnavailable": "A seleรงรฃo de pasta nรฃo estรก disponรญvel neste dispositivo", "downloadOnWifiOnly": "Baixar apenas no WiFi", "downloadOnWifiOnlyDescription": "Impedir downloads quando em dados mรณveis", "autoRemoveWatchedDownloads": "Remover downloads assistidos automaticamente", @@ -443,7 +442,11 @@ "brightness": "Brilho", "hexColor": "Cor hexadecimal", "expandText": "Expandir texto", - "collapseText": "Recolher texto" + "collapseText": "Recolher texto", + "alphabetNavigation": "Navegaรงรฃo alfabรฉtica", + "alphabetScrollHint": "Deslize para cima ou para baixo para avanรงar por letra", + "rowColumnPosition": "Linha ${row} de ${rowCount}, coluna ${column} de ${columnCount}", + "rowPosition": "Linha ${row} de ${rowCount}" }, "tooltips": { "shufflePlay": "Reproduรงรฃo aleatรณria", @@ -451,6 +454,9 @@ "markAsWatched": "Marcar como assistido", "markAsUnwatched": "Marcar como nรฃo assistido" }, + "audioTracks": { + "track": "Faixa de รกudio ${n}" + }, "videoControls": { "audioLabel": "รudio", "subtitlesLabel": "Legendas", @@ -478,6 +484,8 @@ "playNext": "Reproduzir Prรณximo", "playButton": "Reproduzir", "pauseButton": "Pausar", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "Retroceder ${seconds} segundos", "seekForwardButton": "Avanรงar ${seconds} segundos", "previousButton": "Episรณdio anterior", @@ -553,11 +561,11 @@ "streamInterrupted": "A transmissรฃo foi interrompida. Toque em reproduzir ou avance para tentar novamente.", "liveStreamInterrupted": "A transmissรฃo ao vivo foi interrompida. Toque em reproduzir para tentar novamente.", "fileInfoNotAvailable": "Informaรงรตes do arquivo nรฃo disponรญveis", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "Erro ao carregar info do arquivo: ${error}", "errorLoadingSeries": "Erro ao carregar sรฉrie", "musicNotSupported": "Reproduรงรฃo de mรบsica ainda nรฃo รฉ suportada", @@ -680,6 +688,7 @@ "borrowExplain": "Use a conexรฃo de outro perfil. Perfis protegidos por PIN exigem PIN.", "borrowEmpty": "Nada para emprestar ainda.", "borrowEmptySubtitle": "Conecte Plex ou Jellyfin a outro perfil primeiro.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "De ${displayName}", "borrowConnectionBorrowed": "Conexรฃo tomada emprestada.", "borrowFailed": "Nรฃo foi possรญvel tomar a conexรฃo emprestada.", @@ -944,7 +953,7 @@ "favorites": "Favoritos", "reorderFavorites": "Reordenar favoritos", "favoritesLoadFailed": "Nรฃo foi possรญvel carregar os favoritos. Verifique sua conexรฃo e tente novamente.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "Entrar na sessรฃo em andamento", "watchFromStart": "Assistir do inรญcio (${minutes} min atrรกs)", "watchLive": "Assistir ao vivo", diff --git a/lib/i18n/ru.i18n.json b/lib/i18n/ru.i18n.json index 2929356f..a7d8743a 100644 --- a/lib/i18n/ru.i18n.json +++ b/lib/i18n/ru.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "ะžะถะธะดะฐะฝะธะต ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธัโ€ฆ", "quickConnectCancel": "ะžั‚ะผะตะฝะฐ", "quickConnectExpired": "ะกั€ะพะบ Quick Connect ะธัั‚ะตะบ. ะŸะพะฟั€ะพะฑัƒะนั‚ะต ัะฝะพะฒะฐ.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "ะžั‚ะผะตะฝะฐ", @@ -180,7 +180,7 @@ "watchTogetherRelay": "Relay ัะพะฒะผะตัั‚ะฝะพะณะพ ะฟั€ะพัะผะพั‚ั€ะฐ", "watchTogetherRelayDescription": "ะ—ะฐะดะฐะนั‚ะต ัะฒะพะน relay. ะ’ัะต ะดะพะปะถะฝั‹ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะพะดะธะฝ ัะตั€ะฒะตั€.", "watchTogetherRelayHint": "https://my-relay.example.com", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "ะžั‚ั‡ั‘ั‚ั‹ ะพะฑ ะพัˆะธะฑะบะฐั…", "crashReportingDescription": "ะžั‚ะฟั€ะฐะฒะปัั‚ัŒ ะพั‚ั‡ั‘ั‚ั‹ ะพะฑ ะพัˆะธะฑะบะฐั… ะดะปั ัƒะปัƒั‡ัˆะตะฝะธั ะฟั€ะธะปะพะถะตะฝะธั", "debugLogging": "ะ–ัƒั€ะฝะฐะป ะพั‚ะปะฐะดะบะธ", @@ -197,12 +197,10 @@ "exportSettings": "ะญะบัะฟะพั€ั‚ ะฝะฐัั‚ั€ะพะตะบ", "exportSettingsDescription": "ะกะพั…ั€ะฐะฝะธั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ ะฒ ั„ะฐะนะป", "exportSettingsSuccess": "ะะฐัั‚ั€ะพะนะบะธ ัะบัะฟะพั€ั‚ะธั€ะพะฒะฐะฝั‹", - "exportSettingsFailed": "ะะต ัƒะดะฐะปะพััŒ ัะบัะฟะพั€ั‚ะธั€ะพะฒะฐั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ", "importSettings": "ะ˜ะผะฟะพั€ั‚ ะฝะฐัั‚ั€ะพะตะบ", "importSettingsDescription": "ะ’ะพััั‚ะฐะฝะพะฒะธั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ ะธะท ั„ะฐะนะปะฐ", "importSettingsConfirm": "ะญั‚ะพ ะทะฐะผะตะฝะธั‚ ะฒะฐัˆะธ ั‚ะตะบัƒั‰ะธะต ะฝะฐัั‚ั€ะพะนะบะธ. ะŸั€ะพะดะพะปะถะธั‚ัŒ?", "importSettingsSuccess": "ะะฐัั‚ั€ะพะนะบะธ ะธะผะฟะพั€ั‚ะธั€ะพะฒะฐะฝั‹", - "importSettingsFailed": "ะะต ัƒะดะฐะปะพััŒ ะธะผะฟะพั€ั‚ะธั€ะพะฒะฐั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ", "importSettingsInvalidFile": "ะญั‚ะพั‚ ั„ะฐะนะป ะฝะต ัะฒะปัะตั‚ัั ะดะตะนัั‚ะฒะธั‚ะตะปัŒะฝั‹ะผ ัะบัะฟะพั€ั‚ะพะผ ะฝะฐัั‚ั€ะพะตะบ Plezy", "importSettingsNoUser": "ะ’ะพะนะดะธั‚ะต ะฒ ัะธัั‚ะตะผัƒ ะฟะตั€ะตะด ะธะผะฟะพั€ั‚ะพะผ ะฝะฐัั‚ั€ะพะตะบ", "shortcutsReset": "ะ“ะพั€ัั‡ะธะต ะบะปะฐะฒะธัˆะธ ัะฑั€ะพัˆะตะฝั‹ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ", @@ -217,6 +215,7 @@ "validationErrorDuration": "ะ”ะปะธั‚ะตะปัŒะฝะพัั‚ัŒ ะดะพะปะถะฝะฐ ะฑั‹ั‚ัŒ ะพั‚ ${min} ะดะพ ${max} ${unit}", "shortcutAlreadyAssigned": "ะšะปะฐะฒะธัˆะฐ ัƒะถะต ะฝะฐะทะฝะฐั‡ะตะฝะฐ ะดะปั ${action}", "shortcutUpdated": "ะšะปะฐะฒะธัˆะฐ ะพะฑะฝะพะฒะปะตะฝะฐ ะดะปั ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "ะะฒั‚ะพะฟั€ะพะฟัƒัะบ", "autoSkipIntro": "ะะฒั‚ะพะฟั€ะพะฟัƒัะบ ะฒัั‚ัƒะฟะปะตะฝะธั", "autoSkipIntroDescription": "ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะฟั€ะพะฟัƒัะบะฐั‚ัŒ ะผะฐั€ะบะตั€ั‹ ะฒัั‚ัƒะฟะปะตะฝะธั ั‡ะตั€ะตะท ะฝะตัะบะพะปัŒะบะพ ัะตะบัƒะฝะด", @@ -242,7 +241,7 @@ "downloadLocationChanged": "ะœะตัั‚ะพ ะทะฐะณั€ัƒะทะบะธ ะธะทะผะตะฝะตะฝะพ", "downloadLocationReset": "ะœะตัั‚ะพ ะทะฐะณั€ัƒะทะบะธ ัะฑั€ะพัˆะตะฝะพ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ", "downloadLocationInvalid": "ะ’ั‹ะฑั€ะฐะฝะฝะฐั ะฟะฐะฟะบะฐ ะฝะตะดะพัั‚ัƒะฟะฝะฐ ะดะปั ะทะฐะฟะธัะธ", - "downloadLocationSelectError": "ะะต ัƒะดะฐะปะพััŒ ะฒั‹ะฑั€ะฐั‚ัŒ ะฟะฐะฟะบัƒ", + "downloadLocationPickerUnavailable": "ะ’ั‹ะฑะพั€ ะฟะฐะฟะบะธ ะฝะตะดะพัั‚ัƒะฟะตะฝ ะฝะฐ ัั‚ะพะผ ัƒัั‚ั€ะพะนัั‚ะฒะต", "downloadOnWifiOnly": "ะ—ะฐะณั€ัƒะถะฐั‚ัŒ ั‚ะพะปัŒะบะพ ะฟะพ WiFi", "downloadOnWifiOnlyDescription": "ะ—ะฐะฟั€ะตั‚ะธั‚ัŒ ะทะฐะณั€ัƒะทะบัƒ ะฟะพ ะผะพะฑะธะปัŒะฝั‹ะผ ะดะฐะฝะฝั‹ะผ", "autoRemoveWatchedDownloads": "ะะฒั‚ะพัƒะดะฐะปะตะฝะธะต ะฟั€ะพัะผะพั‚ั€ะตะฝะฝั‹ั… ะทะฐะณั€ัƒะทะพะบ", @@ -443,7 +442,11 @@ "brightness": "ะฏั€ะบะพัั‚ัŒ", "hexColor": "ะจะตัั‚ะฝะฐะดั†ะฐั‚ะตั€ะธั‡ะฝั‹ะน ั†ะฒะตั‚", "expandText": "ะ ะฐะทะฒะตั€ะฝัƒั‚ัŒ ั‚ะตะบัั‚", - "collapseText": "ะกะฒะตั€ะฝัƒั‚ัŒ ั‚ะตะบัั‚" + "collapseText": "ะกะฒะตั€ะฝัƒั‚ัŒ ั‚ะตะบัั‚", + "alphabetNavigation": "ะะฐะฒะธะณะฐั†ะธั ะฟะพ ะฐะปั„ะฐะฒะธั‚ัƒ", + "alphabetScrollHint": "ะŸั€ะพะฒะตะดะธั‚ะต ะฒะฒะตั€ั… ะธะปะธ ะฒะฝะธะท ะดะปั ะฟะตั€ะตั…ะพะดะฐ ะฟะพ ะฑัƒะบะฒะฐะผ", + "rowColumnPosition": "ะกั‚ั€ะพะบะฐ ${row} ะธะท ${rowCount}, ัั‚ะพะปะฑะตั† ${column} ะธะท ${columnCount}", + "rowPosition": "ะกั‚ั€ะพะบะฐ ${row} ะธะท ${rowCount}" }, "tooltips": { "shufflePlay": "ะกะปัƒั‡ะฐะนะฝะพะต ะฒะพัะฟั€ะพะธะทะฒะตะดะตะฝะธะต", @@ -451,6 +454,9 @@ "markAsWatched": "ะžั‚ะผะตั‚ะธั‚ัŒ ะบะฐะบ ะฟั€ะพัะผะพั‚ั€ะตะฝะฝะพะต", "markAsUnwatched": "ะžั‚ะผะตั‚ะธั‚ัŒ ะบะฐะบ ะฝะตะฟั€ะพัะผะพั‚ั€ะตะฝะฝะพะต" }, + "audioTracks": { + "track": "ะัƒะดะธะพะดะพั€ะพะถะบะฐ ${n}" + }, "videoControls": { "audioLabel": "ะัƒะดะธะพ", "subtitlesLabel": "ะกัƒะฑั‚ะธั‚ั€ั‹", @@ -478,6 +484,8 @@ "playNext": "ะกะปะตะดัƒัŽั‰ะตะต", "playButton": "ะ’ะพัะฟั€ะพะธะทะฒะตัั‚ะธ", "pauseButton": "ะŸะฐัƒะทะฐ", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "ะŸะตั€ะตะผะพั‚ะบะฐ ะฝะฐะทะฐะด ะฝะฐ ${seconds} ัะตะบัƒะฝะด", "seekForwardButton": "ะŸะตั€ะตะผะพั‚ะบะฐ ะฒะฟะตั€ั‘ะด ะฝะฐ ${seconds} ัะตะบัƒะฝะด", "previousButton": "ะŸั€ะตะดั‹ะดัƒั‰ะธะน ัะฟะธะทะพะด", @@ -555,11 +563,11 @@ "streamInterrupted": "ะŸะพั‚ะพะบ ะฟั€ะตั€ะฒะฐะปัั. ะะฐะถะผะธั‚ะต ยซะ’ะพัะฟั€ะพะธะทะฒะตัั‚ะธยป ะธะปะธ ะฟะตั€ะตะผะพั‚ะฐะนั‚ะต, ั‡ั‚ะพะฑั‹ ะฟะพะฒั‚ะพั€ะธั‚ัŒ ะฟะพะฟั‹ั‚ะบัƒ.", "liveStreamInterrupted": "ะŸั€ัะผะฐั ั‚ั€ะฐะฝัะปัั†ะธั ะฟั€ะตั€ะฒะฐะปะฐััŒ. ะะฐะถะผะธั‚ะต ยซะ’ะพัะฟั€ะพะธะทะฒะตัั‚ะธยป, ั‡ั‚ะพะฑั‹ ะฟะพะฒั‚ะพั€ะธั‚ัŒ ะฟะพะฟั‹ั‚ะบัƒ.", "fileInfoNotAvailable": "ะ˜ะฝั„ะพั€ะผะฐั†ะธั ะพ ั„ะฐะนะปะต ะฝะตะดะพัั‚ัƒะฟะฝะฐ", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "ะžัˆะธะฑะบะฐ ะทะฐะณั€ัƒะทะบะธ ะธะฝั„ะพั€ะผะฐั†ะธะธ ะพ ั„ะฐะนะปะต: ${error}", "errorLoadingSeries": "ะžัˆะธะฑะบะฐ ะทะฐะณั€ัƒะทะบะธ ัะตั€ะธะฐะปะฐ", "musicNotSupported": "ะ’ะพัะฟั€ะพะธะทะฒะตะดะตะฝะธะต ะผัƒะทั‹ะบะธ ะฟะพะบะฐ ะฝะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ัั", @@ -682,6 +690,7 @@ "borrowExplain": "ะ—ะฐะธะผัั‚ะฒัƒะนั‚ะต ะฟะพะดะบะปัŽั‡ะตะฝะธะต ะดั€ัƒะณะพะณะพ ะฟั€ะพั„ะธะปั. ะ”ะปั ะฟั€ะพั„ะธะปะตะน ั PIN ะฝัƒะถะตะฝ PIN.", "borrowEmpty": "ะŸะพะบะฐ ะฝะตั‡ะตะณะพ ะทะฐะธะผัั‚ะฒะพะฒะฐั‚ัŒ.", "borrowEmptySubtitle": "ะกะฝะฐั‡ะฐะปะฐ ะฟะพะดะบะปัŽั‡ะธั‚ะต Plex ะธะปะธ Jellyfin ะบ ะดั€ัƒะณะพะผัƒ ะฟั€ะพั„ะธะปัŽ.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "ะ˜ะท ${displayName}", "borrowConnectionBorrowed": "ะŸะพะดะบะปัŽั‡ะตะฝะธะต ะทะฐะธะผัั‚ะฒะพะฒะฐะฝะพ.", "borrowFailed": "ะะต ัƒะดะฐะปะพััŒ ะทะฐะธะผัั‚ะฒะพะฒะฐั‚ัŒ ะฟะพะดะบะปัŽั‡ะตะฝะธะต.", @@ -948,7 +957,7 @@ "favorites": "ะ˜ะทะฑั€ะฐะฝะฝะพะต", "reorderFavorites": "ะ˜ะทะผะตะฝะธั‚ัŒ ะฟะพั€ัะดะพะบ ะธะทะฑั€ะฐะฝะฝะพะณะพ", "favoritesLoadFailed": "ะะต ัƒะดะฐะปะพััŒ ะทะฐะณั€ัƒะทะธั‚ัŒ ะธะทะฑั€ะฐะฝะฝะพะต. ะŸั€ะพะฒะตั€ัŒั‚ะต ะฟะพะดะบะปัŽั‡ะตะฝะธะต ะธ ะฟะพะฒั‚ะพั€ะธั‚ะต ะฟะพะฟั‹ั‚ะบัƒ.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "ะŸั€ะธัะพะตะดะธะฝะธั‚ัŒัั ะบ ั‚ะตะบัƒั‰ะตะผัƒ ัะตะฐะฝััƒ", "watchFromStart": "ะกะผะพั‚ั€ะตั‚ัŒ ัะฝะฐั‡ะฐะปะฐ (${minutes} ะผะธะฝ. ะฝะฐะทะฐะด)", "watchLive": "ะกะผะพั‚ั€ะตั‚ัŒ ะฒ ะฟั€ัะผะพะผ ัั„ะธั€ะต", diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 901990ae..b4ba6095 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,7 +4,7 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 16 -/// Strings: 23027 (1439 per locale) +/// Strings: 23082 (1442 per locale) // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_bg.g.dart b/lib/i18n/strings_bg.g.dart index acd97fdc..047b1be7 100644 --- a/lib/i18n/strings_bg.g.dart +++ b/lib/i18n/strings_bg.g.dart @@ -52,6 +52,7 @@ class TranslationsBg extends Translations with BaseTranslations 'ะ˜ะทั‡ะฐะบะฒะฐะฝะต ะฝะฐ ะพะดะพะฑั€ะตะฝะธะตโ€ฆ'; @override String get quickConnectCancel => 'ะžั‚ะบะฐะท'; @override String get quickConnectExpired => 'Quick Connect ะธะทั‚ะตั‡ะต. ะžะฟะธั‚ะฐะนั‚ะต ะพั‚ะฝะพะฒะพ.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsBg extends TranslationsSettingsEn { @override String get libraryDensity => 'ะŸะปัŠั‚ะฝะพัั‚ ะฝะฐ ะฑะธะฑะปะธะพั‚ะตะบะฐั‚ะฐ'; @override String get compact => 'ะšะพะผะฟะฐะบั‚ะฝะฐ'; @override String get comfortable => 'ะฃะดะพะฑะฝะฐ'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => 'ะ ะตะถะธะผ ะฝะฐ ะธะทะณะปะตะด'; @override String get gridView => 'ะœั€ะตะถะฐ'; @override String get listView => 'ะกะฟะธััŠะบ'; @@ -311,7 +310,7 @@ class _TranslationsSettingsBg extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'ะ ะตะปะตะน ััŠั€ะฒัŠั€ ะทะฐ ะณะปะตะดะฐะฝะต ะทะฐะตะดะฝะพ'; @override String get watchTogetherRelayDescription => 'ะ—ะฐะดะฐะน ัะพะฑัั‚ะฒะตะฝ ั€ะตะปะตะน ััŠั€ะฒัŠั€. ะ’ัะธั‡ะบะธ ั‚ั€ัะฑะฒะฐ ะดะฐ ะธะทะฟะพะปะทะฒะฐั‚ ััŠั‰ะธั ััŠั€ะฒัŠั€.'; @override String get watchTogetherRelayHint => 'https://my-relay.example.com'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'ะ”ะพะบะปะฐะดะฒะฐะฝะต ะฝะฐ ัั€ะธะฒะพะฒะต'; @override String get crashReportingDescription => 'ะ˜ะทะฟั€ะฐั‰ะฐะน ะดะพะบะปะฐะดะธ ะทะฐ ัั€ะธะฒะพะฒะต, ะทะฐ ะดะฐ ะฟะพะผะพะณะฝะตัˆ ะทะฐ ะฟะพะดะพะฑั€ัะฒะฐะฝะต ะฝะฐ ะฟั€ะธะปะพะถะตะฝะธะตั‚ะพ'; @override String get debugLogging => 'ะ›ะพะณะพะฒะต ะทะฐ ะพั‚ัั‚ั€ะฐะฝัะฒะฐะฝะต ะฝะฐ ะณั€ะตัˆะบะธ'; @@ -328,12 +327,10 @@ class _TranslationsSettingsBg extends TranslationsSettingsEn { @override String get exportSettings => 'ะ•ะบัะฟะพั€ั‚ะธั€ะฐะน ะฝะฐัั‚ั€ะพะนะบะธั‚ะต'; @override String get exportSettingsDescription => 'ะ—ะฐะฟะฐะทะธ ะฟั€ะตะดะฟะพั‡ะธั‚ะฐะฝะธัั‚ะฐ ัะธ ะฒัŠะฒ ั„ะฐะนะป'; @override String get exportSettingsSuccess => 'ะะฐัั‚ั€ะพะนะบะธั‚ะต ัะฐ ะตะบัะฟะพั€ั‚ะธั€ะฐะฝะธ'; - @override String get exportSettingsFailed => 'ะะฐัั‚ั€ะพะนะบะธั‚ะต ะฝะต ะผะพะถะฐั…ะฐ ะดะฐ ะฑัŠะดะฐั‚ ะตะบัะฟะพั€ั‚ะธั€ะฐะฝะธ'; @override String get importSettings => 'ะ˜ะผะฟะพั€ั‚ะธั€ะฐะน ะฝะฐัั‚ั€ะพะนะบะธ'; @override String get importSettingsDescription => 'ะ’ัŠะทัั‚ะฐะฝะพะฒะธ ะฟั€ะตะดะฟะพั‡ะธั‚ะฐะฝะธั ะพั‚ ั„ะฐะนะป'; @override String get importSettingsConfirm => 'ะขะพะฒะฐ ั‰ะต ะทะฐะผะตะฝะธ ั‚ะตะบัƒั‰ะธั‚ะต ะฒะธ ะฝะฐัั‚ั€ะพะนะบะธ. ะŸั€ะพะดัŠะปะถะฐะฒะฐั‚ะต ะปะธ?'; @override String get importSettingsSuccess => 'ะะฐัั‚ั€ะพะนะบะธั‚ะต ัะฐ ะธะผะฟะพั€ั‚ะธั€ะฐะฝะธ'; - @override String get importSettingsFailed => 'ะะฐัั‚ั€ะพะนะบะธั‚ะต ะฝะต ะผะพะถะฐั…ะฐ ะดะฐ ะฑัŠะดะฐั‚ ะธะผะฟะพั€ั‚ะธั€ะฐะฝะธ'; @override String get importSettingsInvalidFile => 'ะขะพะทะธ ั„ะฐะนะป ะฝะต ะต ะฒะฐะปะธะดะตะฝ ะตะบัะฟะพั€ั‚ ะฝะฐ ะฝะฐัั‚ั€ะพะนะบะธ ะพั‚ Plezy'; @override String get importSettingsNoUser => 'ะ’ะปะตะทั‚ะต, ะฟั€ะตะดะธ ะดะฐ ะธะผะฟะพั€ั‚ะธั€ะฐั‚ะต ะฝะฐัั‚ั€ะพะนะบะธ'; @override String get shortcutsReset => 'ะšะปะฐะฒะธัˆะฝะธั‚ะต ะบะพะผะฑะธะฝะฐั†ะธะธ ัะฐ ะฝัƒะปะธั€ะฐะฝะธ ะดะพ ะฟะพะดั€ะฐะทะฑะธั€ะฐะฝะต'; @@ -348,6 +345,7 @@ class _TranslationsSettingsBg extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'ะŸั€ะพะดัŠะปะถะธั‚ะตะปะฝะพัั‚ั‚ะฐ ั‚ั€ัะฑะฒะฐ ะดะฐ ะต ะผะตะถะดัƒ ${min} ะธ ${max} ${unit}'; @override String shortcutAlreadyAssigned({required Object action}) => 'ะšะปะฐะฒะธัˆะฝะฐั‚ะฐ ะบะพะผะฑะธะฝะฐั†ะธั ะฒะตั‡ะต ะต ะฝะฐะทะฝะฐั‡ะตะฝะฐ ะทะฐ ${action}'; @override String shortcutUpdated({required Object action}) => 'ะšะปะฐะฒะธัˆะฝะฐั‚ะฐ ะบะพะผะฑะธะฝะฐั†ะธั ะต ะพะฑะฝะพะฒะตะฝะฐ ะทะฐ ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตัะบะฐั‡ะฐะฝะต'; @override String get autoSkipIntro => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตัะบะฐั‡ะฐะฝะต ะฝะฐ ะธะฝั‚ั€ะพ'; @override String get autoSkipIntroDescription => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตัะบะฐั‡ะฐะน ะธะฝั‚ั€ะพ ะผะฐั€ะบะตั€ะธ ัะปะตะด ะฝัะบะพะปะบะพ ัะตะบัƒะฝะดะธ'; @@ -373,7 +371,7 @@ class _TranslationsSettingsBg extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'ะœะตัั‚ะพะฟะพะปะพะถะตะฝะธะตั‚ะพ ะทะฐ ะธะทั‚ะตะณะปัะฝะธั ะต ะฟั€ะพะผะตะฝะตะฝะพ'; @override String get downloadLocationReset => 'ะœะตัั‚ะพะฟะพะปะพะถะตะฝะธะตั‚ะพ ะทะฐ ะธะทั‚ะตะณะปัะฝะธั ะต ะฒัŠั€ะฝะฐั‚ะพ ะฟะพ ะฟะพะดั€ะฐะทะฑะธั€ะฐะฝะต'; @override String get downloadLocationInvalid => 'ะ˜ะทะฑั€ะฐะฝะฐั‚ะฐ ะฟะฐะฟะบะฐ ะฝะต ะต ะทะฐะฟะธัะฒะฐะตะผะฐ'; - @override String get downloadLocationSelectError => 'ะะตัƒัะฟะตัˆะตะฝ ะธะทะฑะพั€ ะฝะฐ ะฟะฐะฟะบะฐ'; + @override String get downloadLocationPickerUnavailable => 'ะ˜ะทะฑะพั€ัŠั‚ ะฝะฐ ะฟะฐะฟะบะฐ ะฝะต ะต ะฝะฐะปะธั‡ะตะฝ ะฝะฐ ั‚ะพะฒะฐ ัƒัั‚ั€ะพะนัั‚ะฒะพ'; @override String get downloadOnWifiOnly => 'ะ˜ะทั‚ะตะณะปัะฝะต ัะฐะผะพ ะฟั€ะตะท WiFi'; @override String get downloadOnWifiOnlyDescription => 'ะŸั€ะตะดะพั‚ะฒั€ะฐั‚ัะฒะฐะน ะธะทั‚ะตะณะปัะฝะธั ะฟั€ะตะท ะผะพะฑะธะปะฝะธ ะดะฐะฝะฝะธ'; @override String get autoRemoveWatchedDownloads => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตะผะฐั…ะฒะฐะน ะธะทะณะปะตะดะฐะฝะธั‚ะต ะธะทั‚ะตะณะปัะฝะธั'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityBg extends TranslationsAccessibilityEn { @override String get hexColor => 'ะจะตัั‚ะฝะฐะดะตัะตั‚ะธั‡ะตะฝ ั†ะฒัั‚'; @override String get expandText => 'ะ ะฐะทะณัŠะฝะธ ั‚ะตะบัั‚ะฐ'; @override String get collapseText => 'ะกะฒะธะน ั‚ะตะบัั‚ะฐ'; + @override String get alphabetNavigation => 'ะะฐะฒะธะณะฐั†ะธั ะฟะพ ะฐะทะฑัƒะบะฐั‚ะฐ'; + @override String get alphabetScrollHint => 'ะŸะปัŠะทะฝะตั‚ะต ะฝะฐะณะพั€ะต ะธะปะธ ะฝะฐะดะพะปัƒ, ะทะฐ ะดะฐ ะฟั€ะตะผะธะฝะตั‚ะต ะฟะพ ะฑัƒะบะฒะฐ'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'ะ ะตะด ${row} ะพั‚ ${rowCount}, ะบะพะปะพะฝะฐ ${column} ะพั‚ ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'ะ ะตะด ${row} ะพั‚ ${rowCount}'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsBg extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'ะœะฐั€ะบะธั€ะฐะน ะบะฐั‚ะพ ะฝะตะณะปะตะดะฐะฝะพ'; } +// Path: audioTracks +class _TranslationsAudioTracksBg extends TranslationsAudioTracksEn { + _TranslationsAudioTracksBg._(TranslationsBg root) : this._root = root, super.internal(root); + + final TranslationsBg _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'ะัƒะดะธะพ ะฟัŠั‚ะตั‡ะบะฐ ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsBg extends TranslationsVideoControlsEn { _TranslationsVideoControlsBg._(TranslationsBg root) : this._root = root, super.internal(root); @@ -712,11 +724,11 @@ class _TranslationsMessagesBg extends TranslationsMessagesEn { @override String get streamInterrupted => 'ะŸะพั‚ะพะบัŠั‚ ะฟั€ะตะบัŠัะฝะฐ. ะะฐั‚ะธัะฝะตั‚ะต โ€žะŸัƒัะฝะธโ€œ ะธะปะธ ะฟั€ะตะฒัŠั€ั‚ะตั‚ะต, ะทะฐ ะดะฐ ะพะฟะธั‚ะฐั‚ะต ะพั‚ะฝะพะฒะพ.'; @override String get liveStreamInterrupted => 'ะŸะพั‚ะพะบัŠั‚ ะฝะฐ ะถะธะฒะพ ะฟั€ะตะบัŠัะฝะฐ. ะะฐั‚ะธัะฝะตั‚ะต โ€žะŸัƒัะฝะธโ€œ, ะทะฐ ะดะฐ ะพะฟะธั‚ะฐั‚ะต ะพั‚ะฝะพะฒะพ.'; @override String get fileInfoNotAvailable => 'ะ˜ะฝั„ะพั€ะผะฐั†ะธัั‚ะฐ ะทะฐ ั„ะฐะนะปะฐ ะฝะต ะต ะฝะฐะปะธั‡ะฝะฐ'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ะทะฐั€ะตะถะดะฐะฝะต ะฝะฐ ะธะฝั„ะพั€ะผะฐั†ะธั ะทะฐ ั„ะฐะนะปะฐ: ${error}'; @override String get errorLoadingSeries => 'ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ะทะฐั€ะตะถะดะฐะฝะต ะฝะฐ ัะตั€ะธะฐะปะฐ'; @override String get musicNotSupported => 'ะ’ัŠะทะฟั€ะพะธะทะฒะตะถะดะฐะฝะตั‚ะพ ะฝะฐ ะผัƒะทะธะบะฐ ะฒัะต ะพั‰ะต ะฝะต ัะต ะฟะพะดะดัŠั€ะถะฐ'; @@ -867,6 +879,7 @@ class _TranslationsProfilesBg extends TranslationsProfilesEn { @override String get borrowExplain => 'ะ˜ะทะฟะพะปะทะฒะฐะน ะฒั€ัŠะทะบะฐ ะพั‚ ะดั€ัƒะณ ะฟั€ะพั„ะธะป. PIN-ะทะฐั‰ะธั‚ะตะฝะธั‚ะต ะฟั€ะพั„ะธะปะธ ะธะทะธัะบะฒะฐั‚ PIN.'; @override String get borrowEmpty => 'ะ’ัะต ะพั‰ะต ะฝัะผะฐ ะบะฐะบะฒะพ ะดะฐ ัะต ะธะทะฟะพะปะทะฒะฐ.'; @override String get borrowEmptySubtitle => 'ะŸัŠั€ะฒะพ ัะฒัŠั€ะถะตั‚ะต Plex ะธะปะธ Jellyfin ะบัŠะผ ะดั€ัƒะณ ะฟั€ะพั„ะธะป.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'ะžั‚ ${displayName}'; @override String get borrowConnectionBorrowed => 'ะ’ั€ัŠะทะบะฐั‚ะฐ ะต ะธะทะฟะพะปะทะฒะฐะฝะฐ.'; @override String get borrowFailed => 'ะะตัƒัะฟะตัˆะฝะพ ะธะทะฟะพะปะทะฒะฐะฝะต ะฝะฐ ะฒั€ัŠะทะบะฐ.'; @@ -1150,7 +1163,7 @@ class _TranslationsLiveTvBg extends TranslationsLiveTvEn { @override String get favorites => 'ะ›ัŽะฑะธะผะธ'; @override String get reorderFavorites => 'ะŸั€ะตะฝะฐั€ะตะดะธ ะปัŽะฑะธะผะธั‚ะต'; @override String get favoritesLoadFailed => 'ะ›ัŽะฑะธะผะธั‚ะต ะฝะต ะผะพะถะฐั…ะฐ ะดะฐ ัะต ะทะฐั€ะตะดัั‚. ะŸั€ะพะฒะตั€ะตั‚ะต ะฒั€ัŠะทะบะฐั‚ะฐ ัะธ ะธ ะพะฟะธั‚ะฐะนั‚ะต ะพั‚ะฝะพะฒะพ.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'ะŸั€ะธััŠะตะดะธะฝะธ ัะต ะบัŠะผ ั‚ะตะบัƒั‰ะฐ ัะตัะธั'; @override String watchFromStart({required Object minutes}) => 'ะ“ะปะตะดะฐะน ะพั‚ ะฝะฐั‡ะฐะปะพั‚ะพ (ะฟั€ะตะดะธ ${minutes} ะผะธะฝ)'; @override String get watchLive => 'ะ“ะปะตะดะฐะน ะฝะฐ ะถะธะฒะพ'; @@ -2149,7 +2162,7 @@ extension on TranslationsBg { 'auth.quickConnectWaiting' => 'ะ˜ะทั‡ะฐะบะฒะฐะฝะต ะฝะฐ ะพะดะพะฑั€ะตะฝะธะตโ€ฆ', 'auth.quickConnectCancel' => 'ะžั‚ะบะฐะท', 'auth.quickConnectExpired' => 'Quick Connect ะธะทั‚ะตั‡ะต. ะžะฟะธั‚ะฐะนั‚ะต ะพั‚ะฝะพะฒะพ.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'ะžั‚ะบะฐะท', 'common.save' => 'ะ—ะฐะฟะฐะทะธ', 'common.close' => 'ะ—ะฐั‚ะฒะพั€ะธ', @@ -2233,8 +2246,6 @@ extension on TranslationsBg { 'settings.libraryDensity' => 'ะŸะปัŠั‚ะฝะพัั‚ ะฝะฐ ะฑะธะฑะปะธะพั‚ะตะบะฐั‚ะฐ', 'settings.compact' => 'ะšะพะผะฟะฐะบั‚ะฝะฐ', 'settings.comfortable' => 'ะฃะดะพะฑะฝะฐ', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => 'ะ ะตะถะธะผ ะฝะฐ ะธะทะณะปะตะด', 'settings.gridView' => 'ะœั€ะตะถะฐ', 'settings.listView' => 'ะกะฟะธััŠะบ', @@ -2304,7 +2315,7 @@ extension on TranslationsBg { 'settings.watchTogetherRelay' => 'ะ ะตะปะตะน ััŠั€ะฒัŠั€ ะทะฐ ะณะปะตะดะฐะฝะต ะทะฐะตะดะฝะพ', 'settings.watchTogetherRelayDescription' => 'ะ—ะฐะดะฐะน ัะพะฑัั‚ะฒะตะฝ ั€ะตะปะตะน ััŠั€ะฒัŠั€. ะ’ัะธั‡ะบะธ ั‚ั€ัะฑะฒะฐ ะดะฐ ะธะทะฟะพะปะทะฒะฐั‚ ััŠั‰ะธั ััŠั€ะฒัŠั€.', 'settings.watchTogetherRelayHint' => 'https://my-relay.example.com', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'ะ”ะพะบะปะฐะดะฒะฐะฝะต ะฝะฐ ัั€ะธะฒะพะฒะต', 'settings.crashReportingDescription' => 'ะ˜ะทะฟั€ะฐั‰ะฐะน ะดะพะบะปะฐะดะธ ะทะฐ ัั€ะธะฒะพะฒะต, ะทะฐ ะดะฐ ะฟะพะผะพะณะฝะตัˆ ะทะฐ ะฟะพะดะพะฑั€ัะฒะฐะฝะต ะฝะฐ ะฟั€ะธะปะพะถะตะฝะธะตั‚ะพ', 'settings.debugLogging' => 'ะ›ะพะณะพะฒะต ะทะฐ ะพั‚ัั‚ั€ะฐะฝัะฒะฐะฝะต ะฝะฐ ะณั€ะตัˆะบะธ', @@ -2321,12 +2332,10 @@ extension on TranslationsBg { 'settings.exportSettings' => 'ะ•ะบัะฟะพั€ั‚ะธั€ะฐะน ะฝะฐัั‚ั€ะพะนะบะธั‚ะต', 'settings.exportSettingsDescription' => 'ะ—ะฐะฟะฐะทะธ ะฟั€ะตะดะฟะพั‡ะธั‚ะฐะฝะธัั‚ะฐ ัะธ ะฒัŠะฒ ั„ะฐะนะป', 'settings.exportSettingsSuccess' => 'ะะฐัั‚ั€ะพะนะบะธั‚ะต ัะฐ ะตะบัะฟะพั€ั‚ะธั€ะฐะฝะธ', - 'settings.exportSettingsFailed' => 'ะะฐัั‚ั€ะพะนะบะธั‚ะต ะฝะต ะผะพะถะฐั…ะฐ ะดะฐ ะฑัŠะดะฐั‚ ะตะบัะฟะพั€ั‚ะธั€ะฐะฝะธ', 'settings.importSettings' => 'ะ˜ะผะฟะพั€ั‚ะธั€ะฐะน ะฝะฐัั‚ั€ะพะนะบะธ', 'settings.importSettingsDescription' => 'ะ’ัŠะทัั‚ะฐะฝะพะฒะธ ะฟั€ะตะดะฟะพั‡ะธั‚ะฐะฝะธั ะพั‚ ั„ะฐะนะป', 'settings.importSettingsConfirm' => 'ะขะพะฒะฐ ั‰ะต ะทะฐะผะตะฝะธ ั‚ะตะบัƒั‰ะธั‚ะต ะฒะธ ะฝะฐัั‚ั€ะพะนะบะธ. ะŸั€ะพะดัŠะปะถะฐะฒะฐั‚ะต ะปะธ?', 'settings.importSettingsSuccess' => 'ะะฐัั‚ั€ะพะนะบะธั‚ะต ัะฐ ะธะผะฟะพั€ั‚ะธั€ะฐะฝะธ', - 'settings.importSettingsFailed' => 'ะะฐัั‚ั€ะพะนะบะธั‚ะต ะฝะต ะผะพะถะฐั…ะฐ ะดะฐ ะฑัŠะดะฐั‚ ะธะผะฟะพั€ั‚ะธั€ะฐะฝะธ', 'settings.importSettingsInvalidFile' => 'ะขะพะทะธ ั„ะฐะนะป ะฝะต ะต ะฒะฐะปะธะดะตะฝ ะตะบัะฟะพั€ั‚ ะฝะฐ ะฝะฐัั‚ั€ะพะนะบะธ ะพั‚ Plezy', 'settings.importSettingsNoUser' => 'ะ’ะปะตะทั‚ะต, ะฟั€ะตะดะธ ะดะฐ ะธะผะฟะพั€ั‚ะธั€ะฐั‚ะต ะฝะฐัั‚ั€ะพะนะบะธ', 'settings.shortcutsReset' => 'ะšะปะฐะฒะธัˆะฝะธั‚ะต ะบะพะผะฑะธะฝะฐั†ะธะธ ัะฐ ะฝัƒะปะธั€ะฐะฝะธ ะดะพ ะฟะพะดั€ะฐะทะฑะธั€ะฐะฝะต', @@ -2341,6 +2350,7 @@ extension on TranslationsBg { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'ะŸั€ะพะดัŠะปะถะธั‚ะตะปะฝะพัั‚ั‚ะฐ ั‚ั€ัะฑะฒะฐ ะดะฐ ะต ะผะตะถะดัƒ ${min} ะธ ${max} ${unit}', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'ะšะปะฐะฒะธัˆะฝะฐั‚ะฐ ะบะพะผะฑะธะฝะฐั†ะธั ะฒะตั‡ะต ะต ะฝะฐะทะฝะฐั‡ะตะฝะฐ ะทะฐ ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'ะšะปะฐะฒะธัˆะฝะฐั‚ะฐ ะบะพะผะฑะธะฝะฐั†ะธั ะต ะพะฑะฝะพะฒะตะฝะฐ ะทะฐ ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตัะบะฐั‡ะฐะฝะต', 'settings.autoSkipIntro' => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตัะบะฐั‡ะฐะฝะต ะฝะฐ ะธะฝั‚ั€ะพ', 'settings.autoSkipIntroDescription' => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตัะบะฐั‡ะฐะน ะธะฝั‚ั€ะพ ะผะฐั€ะบะตั€ะธ ัะปะตะด ะฝัะบะพะปะบะพ ัะตะบัƒะฝะดะธ', @@ -2366,7 +2376,7 @@ extension on TranslationsBg { 'settings.downloadLocationChanged' => 'ะœะตัั‚ะพะฟะพะปะพะถะตะฝะธะตั‚ะพ ะทะฐ ะธะทั‚ะตะณะปัะฝะธั ะต ะฟั€ะพะผะตะฝะตะฝะพ', 'settings.downloadLocationReset' => 'ะœะตัั‚ะพะฟะพะปะพะถะตะฝะธะตั‚ะพ ะทะฐ ะธะทั‚ะตะณะปัะฝะธั ะต ะฒัŠั€ะฝะฐั‚ะพ ะฟะพ ะฟะพะดั€ะฐะทะฑะธั€ะฐะฝะต', 'settings.downloadLocationInvalid' => 'ะ˜ะทะฑั€ะฐะฝะฐั‚ะฐ ะฟะฐะฟะบะฐ ะฝะต ะต ะทะฐะฟะธัะฒะฐะตะผะฐ', - 'settings.downloadLocationSelectError' => 'ะะตัƒัะฟะตัˆะตะฝ ะธะทะฑะพั€ ะฝะฐ ะฟะฐะฟะบะฐ', + 'settings.downloadLocationPickerUnavailable' => 'ะ˜ะทะฑะพั€ัŠั‚ ะฝะฐ ะฟะฐะฟะบะฐ ะฝะต ะต ะฝะฐะปะธั‡ะตะฝ ะฝะฐ ั‚ะพะฒะฐ ัƒัั‚ั€ะพะนัั‚ะฒะพ', 'settings.downloadOnWifiOnly' => 'ะ˜ะทั‚ะตะณะปัะฝะต ัะฐะผะพ ะฟั€ะตะท WiFi', 'settings.downloadOnWifiOnlyDescription' => 'ะŸั€ะตะดะพั‚ะฒั€ะฐั‚ัะฒะฐะน ะธะทั‚ะตะณะปัะฝะธั ะฟั€ะตะท ะผะพะฑะธะปะฝะธ ะดะฐะฝะฝะธ', 'settings.autoRemoveWatchedDownloads' => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตะผะฐั…ะฒะฐะน ะธะทะณะปะตะดะฐะฝะธั‚ะต ะธะทั‚ะตะณะปัะฝะธั', @@ -2554,10 +2564,15 @@ extension on TranslationsBg { 'accessibility.hexColor' => 'ะจะตัั‚ะฝะฐะดะตัะตั‚ะธั‡ะตะฝ ั†ะฒัั‚', 'accessibility.expandText' => 'ะ ะฐะทะณัŠะฝะธ ั‚ะตะบัั‚ะฐ', 'accessibility.collapseText' => 'ะกะฒะธะน ั‚ะตะบัั‚ะฐ', + 'accessibility.alphabetNavigation' => 'ะะฐะฒะธะณะฐั†ะธั ะฟะพ ะฐะทะฑัƒะบะฐั‚ะฐ', + 'accessibility.alphabetScrollHint' => 'ะŸะปัŠะทะฝะตั‚ะต ะฝะฐะณะพั€ะต ะธะปะธ ะฝะฐะดะพะปัƒ, ะทะฐ ะดะฐ ะฟั€ะตะผะธะฝะตั‚ะต ะฟะพ ะฑัƒะบะฒะฐ', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'ะ ะตะด ${row} ะพั‚ ${rowCount}, ะบะพะปะพะฝะฐ ${column} ะพั‚ ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'ะ ะตะด ${row} ะพั‚ ${rowCount}', 'tooltips.shufflePlay' => 'ะ ะฐะทะฑัŠั€ะบะฐะฝะพ ะฒัŠะทะฟั€ะพะธะทะฒะตะถะดะฐะฝะต', 'tooltips.playTrailer' => 'ะŸัƒัะฝะธ ั‚ั€ะตะนะปัŠั€', 'tooltips.markAsWatched' => 'ะœะฐั€ะบะธั€ะฐะน ะบะฐั‚ะพ ะณะปะตะดะฐะฝะพ', 'tooltips.markAsUnwatched' => 'ะœะฐั€ะบะธั€ะฐะน ะบะฐั‚ะพ ะฝะตะณะปะตะดะฐะฝะพ', + 'audioTracks.track' => ({required Object n}) => 'ะัƒะดะธะพ ะฟัŠั‚ะตั‡ะบะฐ ${n}', 'videoControls.audioLabel' => 'ะัƒะดะธะพ', 'videoControls.subtitlesLabel' => 'ะกัƒะฑั‚ะธั‚ั€ะธ', 'videoControls.resetToZero' => 'ะัƒะปะธั€ะฐะน ะดะพ 0ms', @@ -2644,20 +2659,20 @@ extension on TranslationsBg { 'messages.markedAsUnwatched' => 'ะœะฐั€ะบะธั€ะฐะฝะพ ะบะฐั‚ะพ ะฝะตะณะปะตะดะฐะฝะพ', 'messages.markedAsWatchedOffline' => 'ะœะฐั€ะบะธั€ะฐะฝะพ ะบะฐั‚ะพ ะณะปะตะดะฐะฝะพ (ั‰ะต ัะต ัะธะฝั…ั€ะพะฝะธะทะธั€ะฐ, ะบะพะณะฐั‚ะพ ัั‚ะต ะพะฝะปะฐะนะฝ)', 'messages.markedAsUnwatchedOffline' => 'ะœะฐั€ะบะธั€ะฐะฝะพ ะบะฐั‚ะพ ะฝะตะณะปะตะดะฐะฝะพ (ั‰ะต ัะต ัะธะฝั…ั€ะพะฝะธะทะธั€ะฐ, ะบะพะณะฐั‚ะพ ัั‚ะต ะพะฝะปะฐะนะฝ)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตะผะฐั…ะฝะฐั‚ะพ: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('bg'))(n, one: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตะผะฐั…ะฝะฐั‚ะพ ${n} ะณะปะตะดะฐะฝะพ ะธะทั‚ะตะณะปัะฝะต', other: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตะผะฐั…ะฝะฐั‚ะธ ${n} ะณะปะตะดะฐะฝะธ ะธะทั‚ะตะณะปัะฝะธั', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตะผะฐั…ะฝะฐั‚ะพ: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('bg'))(n, one: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตะผะฐั…ะฝะฐั‚ะพ ${n} ะณะปะตะดะฐะฝะพ ะธะทั‚ะตะณะปัะฝะต', other: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะฟั€ะตะผะฐั…ะฝะฐั‚ะธ ${n} ะณะปะตะดะฐะฝะธ ะธะทั‚ะตะณะปัะฝะธั', ), 'messages.removedFromContinueWatching' => 'ะŸั€ะตะผะฐั…ะฝะฐั‚ะพ ะพั‚ ะฟั€ะพะดัŠะปะถะฐะฒะฐะฝะต ะฝะฐ ะณะปะตะดะฐะฝะตั‚ะพ', 'messages.errorLoading' => ({required Object error}) => 'ะ“ั€ะตัˆะบะฐ: ${error}', 'messages.streamInterrupted' => 'ะŸะพั‚ะพะบัŠั‚ ะฟั€ะตะบัŠัะฝะฐ. ะะฐั‚ะธัะฝะตั‚ะต โ€žะŸัƒัะฝะธโ€œ ะธะปะธ ะฟั€ะตะฒัŠั€ั‚ะตั‚ะต, ะทะฐ ะดะฐ ะพะฟะธั‚ะฐั‚ะต ะพั‚ะฝะพะฒะพ.', 'messages.liveStreamInterrupted' => 'ะŸะพั‚ะพะบัŠั‚ ะฝะฐ ะถะธะฒะพ ะฟั€ะตะบัŠัะฝะฐ. ะะฐั‚ะธัะฝะตั‚ะต โ€žะŸัƒัะฝะธโ€œ, ะทะฐ ะดะฐ ะพะฟะธั‚ะฐั‚ะต ะพั‚ะฝะพะฒะพ.', 'messages.fileInfoNotAvailable' => 'ะ˜ะฝั„ะพั€ะผะฐั†ะธัั‚ะฐ ะทะฐ ั„ะฐะนะปะฐ ะฝะต ะต ะฝะฐะปะธั‡ะฝะฐ', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ะทะฐั€ะตะถะดะฐะฝะต ะฝะฐ ะธะฝั„ะพั€ะผะฐั†ะธั ะทะฐ ั„ะฐะนะปะฐ: ${error}', 'messages.errorLoadingSeries' => 'ะ“ั€ะตัˆะบะฐ ะฟั€ะธ ะทะฐั€ะตะถะดะฐะฝะต ะฝะฐ ัะตั€ะธะฐะปะฐ', 'messages.musicNotSupported' => 'ะ’ัŠะทะฟั€ะพะธะทะฒะตะถะดะฐะฝะตั‚ะพ ะฝะฐ ะผัƒะทะธะบะฐ ะฒัะต ะพั‰ะต ะฝะต ัะต ะฟะพะดะดัŠั€ะถะฐ', @@ -2772,6 +2787,7 @@ extension on TranslationsBg { 'profiles.borrowExplain' => 'ะ˜ะทะฟะพะปะทะฒะฐะน ะฒั€ัŠะทะบะฐ ะพั‚ ะดั€ัƒะณ ะฟั€ะพั„ะธะป. PIN-ะทะฐั‰ะธั‚ะตะฝะธั‚ะต ะฟั€ะพั„ะธะปะธ ะธะทะธัะบะฒะฐั‚ PIN.', 'profiles.borrowEmpty' => 'ะ’ัะต ะพั‰ะต ะฝัะผะฐ ะบะฐะบะฒะพ ะดะฐ ัะต ะธะทะฟะพะปะทะฒะฐ.', 'profiles.borrowEmptySubtitle' => 'ะŸัŠั€ะฒะพ ัะฒัŠั€ะถะตั‚ะต Plex ะธะปะธ Jellyfin ะบัŠะผ ะดั€ัƒะณ ะฟั€ะพั„ะธะป.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'ะžั‚ ${displayName}', 'profiles.borrowConnectionBorrowed' => 'ะ’ั€ัŠะทะบะฐั‚ะฐ ะต ะธะทะฟะพะปะทะฒะฐะฝะฐ.', 'profiles.borrowFailed' => 'ะะตัƒัะฟะตัˆะฝะพ ะธะทะฟะพะปะทะฒะฐะฝะต ะฝะฐ ะฒั€ัŠะทะบะฐ.', @@ -2997,7 +3013,7 @@ extension on TranslationsBg { 'liveTv.favorites' => 'ะ›ัŽะฑะธะผะธ', 'liveTv.reorderFavorites' => 'ะŸั€ะตะฝะฐั€ะตะดะธ ะปัŽะฑะธะผะธั‚ะต', 'liveTv.favoritesLoadFailed' => 'ะ›ัŽะฑะธะผะธั‚ะต ะฝะต ะผะพะถะฐั…ะฐ ะดะฐ ัะต ะทะฐั€ะตะดัั‚. ะŸั€ะพะฒะตั€ะตั‚ะต ะฒั€ัŠะทะบะฐั‚ะฐ ัะธ ะธ ะพะฟะธั‚ะฐะนั‚ะต ะพั‚ะฝะพะฒะพ.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'ะŸั€ะธััŠะตะดะธะฝะธ ัะต ะบัŠะผ ั‚ะตะบัƒั‰ะฐ ัะตัะธั', 'liveTv.watchFromStart' => ({required Object minutes}) => 'ะ“ะปะตะดะฐะน ะพั‚ ะฝะฐั‡ะฐะปะพั‚ะพ (ะฟั€ะตะดะธ ${minutes} ะผะธะฝ)', 'liveTv.watchLive' => 'ะ“ะปะตะดะฐะน ะฝะฐ ะถะธะฒะพ', @@ -3157,11 +3173,11 @@ extension on TranslationsBg { 'watchTogether.participantLeft' => ({required Object name}) => '${name} ะฝะฐะฟัƒัะฝะฐ', 'watchTogether.participantPaused' => ({required Object name}) => '${name} ะฟะพัั‚ะฐะฒะธ ะฝะฐ ะฟะฐัƒะทะฐ', 'watchTogether.participantResumed' => ({required Object name}) => '${name} ะฟั€ะพะดัŠะปะถะธ', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} ะฟั€ะตะฒัŠั€ั‚ั', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} ะฑัƒั„ะตั€ะธั€ะฐ', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} ะต ั ะฟะพ-ัั‚ะฐั€ะฐ ะฒะตั€ัะธั ะฝะฐ ะฟั€ะธะปะพะถะตะฝะธะตั‚ะพ โ€” ัะธะฝั…ั€ะพะฝะธะทะธั€ะฐะฝะตั‚ะพ ะฝะต ะต ะฝะฐะปะธั‡ะฝะพ', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'ะŸั€ะพะดัŠะปะถะฐะฒะฐะฝะต ะฑะตะท ${name}', 'watchTogether.waitingForParticipants' => 'ะ˜ะทั‡ะฐะบะฒะฐะฝะต ะดั€ัƒะณะธั‚ะต ะดะฐ ะทะฐั€ะตะดัั‚...', 'watchTogether.waitingForName' => ({required Object name}) => 'ะ˜ะทั‡ะฐะบะฒะฐะฝะต ะฝะฐ ${name}...', diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart index 811d3063..34560dc1 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -52,6 +52,7 @@ class TranslationsDa extends Translations with BaseTranslations 'Venter pรฅ godkendelseโ€ฆ'; @override String get quickConnectCancel => 'Annullรฉr'; @override String get quickConnectExpired => 'Quick Connect er udlรธbet. Prรธv igen.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsDa extends TranslationsSettingsEn { @override String get libraryDensity => 'Bibliotekstรฆthed'; @override String get compact => 'Kompakt'; @override String get comfortable => 'Komfortabel'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => 'Visningstilstand'; @override String get gridView => 'Gitter'; @override String get listView => 'Liste'; @@ -311,7 +310,7 @@ class _TranslationsSettingsDa extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'Watch Together-relay'; @override String get watchTogetherRelayDescription => 'Angiv en brugerdefineret relay. Alle skal bruge samme server.'; @override String get watchTogetherRelayHint => 'https://min-relay.eksempel.dk'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'Fejlrapportering'; @override String get crashReportingDescription => 'Send fejlrapporter for at hjรฆlpe med at forbedre appen'; @override String get debugLogging => 'Fejlfindingslogning'; @@ -328,12 +327,10 @@ class _TranslationsSettingsDa extends TranslationsSettingsEn { @override String get exportSettings => 'Eksportรฉr indstillinger'; @override String get exportSettingsDescription => 'Gem dine prรฆferencer i en fil'; @override String get exportSettingsSuccess => 'Indstillinger eksporteret'; - @override String get exportSettingsFailed => 'Kunne ikke eksportere indstillinger'; @override String get importSettings => 'Importรฉr indstillinger'; @override String get importSettingsDescription => 'Gendan prรฆferencer fra en fil'; @override String get importSettingsConfirm => 'Dette vil erstatte dine nuvรฆrende indstillinger. Fortsรฆt?'; @override String get importSettingsSuccess => 'Indstillinger importeret'; - @override String get importSettingsFailed => 'Kunne ikke importere indstillinger'; @override String get importSettingsInvalidFile => 'Denne fil er ikke en gyldig Plezy-indstillingseksport'; @override String get importSettingsNoUser => 'Log ind fรธr import af indstillinger'; @override String get shortcutsReset => 'Genveje nulstillet til standard'; @@ -348,6 +345,7 @@ class _TranslationsSettingsDa extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'Varighed skal vรฆre mellem ${min} og ${max} ${unit}'; @override String shortcutAlreadyAssigned({required Object action}) => 'Genvej allerede tildelt til ${action}'; @override String shortcutUpdated({required Object action}) => 'Genvej opdateret for ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'Auto-spring'; @override String get autoSkipIntro => 'Auto-spring intro'; @override String get autoSkipIntroDescription => 'Spring automatisk intromarkรธrer over efter fรฅ sekunder'; @@ -373,7 +371,7 @@ class _TranslationsSettingsDa extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'Downloadplacering รฆndret'; @override String get downloadLocationReset => 'Downloadplacering nulstillet'; @override String get downloadLocationInvalid => 'Valgt mappe er ikke skrivbar'; - @override String get downloadLocationSelectError => 'Kunne ikke vรฆlge mappe'; + @override String get downloadLocationPickerUnavailable => 'Mappevalg er ikke tilgรฆngeligt pรฅ denne enhed'; @override String get downloadOnWifiOnly => 'Download kun pรฅ WiFi'; @override String get downloadOnWifiOnlyDescription => 'Forhindre downloads pรฅ mobildata'; @override String get autoRemoveWatchedDownloads => 'Fjern sete downloads automatisk'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityDa extends TranslationsAccessibilityEn { @override String get hexColor => 'Hexfarve'; @override String get expandText => 'Udvid tekst'; @override String get collapseText => 'Fold tekst sammen'; + @override String get alphabetNavigation => 'Alfabetnavigation'; + @override String get alphabetScrollHint => 'Stryg op eller ned for at flytte รฉt bogstav'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rรฆkke ${row} af ${rowCount}, kolonne ${column} af ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'Rรฆkke ${row} af ${rowCount}'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsDa extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'Markรฉr som uset'; } +// Path: audioTracks +class _TranslationsAudioTracksDa extends TranslationsAudioTracksEn { + _TranslationsAudioTracksDa._(TranslationsDa root) : this._root = root, super.internal(root); + + final TranslationsDa _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'Lydspor ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsDa extends TranslationsVideoControlsEn { _TranslationsVideoControlsDa._(TranslationsDa root) : this._root = root, super.internal(root); @@ -712,11 +724,11 @@ class _TranslationsMessagesDa extends TranslationsMessagesEn { @override String get streamInterrupted => 'Streamen blev afbrudt. Tryk pรฅ afspil, eller spol for at prรธve igen.'; @override String get liveStreamInterrupted => 'Livestreamen blev afbrudt. Tryk pรฅ afspil for at prรธve igen.'; @override String get fileInfoNotAvailable => 'Filinfo ikke tilgรฆngelig'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'Fejl ved indlรฆsning af filinfo: ${error}'; @override String get errorLoadingSeries => 'Fejl ved indlรฆsning af serie'; @override String get musicNotSupported => 'Musikafspilning understรธttes endnu ikke'; @@ -867,6 +879,7 @@ class _TranslationsProfilesDa extends TranslationsProfilesEn { @override String get borrowExplain => 'Lรฅn en anden profils forbindelse. PIN-beskyttede profiler krรฆver en PIN.'; @override String get borrowEmpty => 'Intet at lรฅne endnu.'; @override String get borrowEmptySubtitle => 'Forbind Plex eller Jellyfin til en anden profil fรธrst.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'Fra ${displayName}'; @override String get borrowConnectionBorrowed => 'Forbindelse lรฅnt.'; @override String get borrowFailed => 'Kunne ikke lรฅne forbindelse.'; @@ -1150,7 +1163,7 @@ class _TranslationsLiveTvDa extends TranslationsLiveTvEn { @override String get favorites => 'Favoritter'; @override String get reorderFavorites => 'Omarranger favoritter'; @override String get favoritesLoadFailed => 'Favoritter kunne ikke indlรฆses. Kontrollรฉr forbindelsen, og prรธv igen.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'Deltag i igangvรฆrende session'; @override String watchFromStart({required Object minutes}) => 'Se fra start (${minutes} min siden)'; @override String get watchLive => 'Se live'; @@ -2149,7 +2162,7 @@ extension on TranslationsDa { 'auth.quickConnectWaiting' => 'Venter pรฅ godkendelseโ€ฆ', 'auth.quickConnectCancel' => 'Annullรฉr', 'auth.quickConnectExpired' => 'Quick Connect er udlรธbet. Prรธv igen.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'Annuller', 'common.save' => 'Gem', 'common.close' => 'Luk', @@ -2233,8 +2246,6 @@ extension on TranslationsDa { 'settings.libraryDensity' => 'Bibliotekstรฆthed', 'settings.compact' => 'Kompakt', 'settings.comfortable' => 'Komfortabel', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => 'Visningstilstand', 'settings.gridView' => 'Gitter', 'settings.listView' => 'Liste', @@ -2304,7 +2315,7 @@ extension on TranslationsDa { 'settings.watchTogetherRelay' => 'Watch Together-relay', 'settings.watchTogetherRelayDescription' => 'Angiv en brugerdefineret relay. Alle skal bruge samme server.', 'settings.watchTogetherRelayHint' => 'https://min-relay.eksempel.dk', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'Fejlrapportering', 'settings.crashReportingDescription' => 'Send fejlrapporter for at hjรฆlpe med at forbedre appen', 'settings.debugLogging' => 'Fejlfindingslogning', @@ -2321,12 +2332,10 @@ extension on TranslationsDa { 'settings.exportSettings' => 'Eksportรฉr indstillinger', 'settings.exportSettingsDescription' => 'Gem dine prรฆferencer i en fil', 'settings.exportSettingsSuccess' => 'Indstillinger eksporteret', - 'settings.exportSettingsFailed' => 'Kunne ikke eksportere indstillinger', 'settings.importSettings' => 'Importรฉr indstillinger', 'settings.importSettingsDescription' => 'Gendan prรฆferencer fra en fil', 'settings.importSettingsConfirm' => 'Dette vil erstatte dine nuvรฆrende indstillinger. Fortsรฆt?', 'settings.importSettingsSuccess' => 'Indstillinger importeret', - 'settings.importSettingsFailed' => 'Kunne ikke importere indstillinger', 'settings.importSettingsInvalidFile' => 'Denne fil er ikke en gyldig Plezy-indstillingseksport', 'settings.importSettingsNoUser' => 'Log ind fรธr import af indstillinger', 'settings.shortcutsReset' => 'Genveje nulstillet til standard', @@ -2341,6 +2350,7 @@ extension on TranslationsDa { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'Varighed skal vรฆre mellem ${min} og ${max} ${unit}', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'Genvej allerede tildelt til ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'Genvej opdateret for ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'Auto-spring', 'settings.autoSkipIntro' => 'Auto-spring intro', 'settings.autoSkipIntroDescription' => 'Spring automatisk intromarkรธrer over efter fรฅ sekunder', @@ -2366,7 +2376,7 @@ extension on TranslationsDa { 'settings.downloadLocationChanged' => 'Downloadplacering รฆndret', 'settings.downloadLocationReset' => 'Downloadplacering nulstillet', 'settings.downloadLocationInvalid' => 'Valgt mappe er ikke skrivbar', - 'settings.downloadLocationSelectError' => 'Kunne ikke vรฆlge mappe', + 'settings.downloadLocationPickerUnavailable' => 'Mappevalg er ikke tilgรฆngeligt pรฅ denne enhed', 'settings.downloadOnWifiOnly' => 'Download kun pรฅ WiFi', 'settings.downloadOnWifiOnlyDescription' => 'Forhindre downloads pรฅ mobildata', 'settings.autoRemoveWatchedDownloads' => 'Fjern sete downloads automatisk', @@ -2554,10 +2564,15 @@ extension on TranslationsDa { 'accessibility.hexColor' => 'Hexfarve', 'accessibility.expandText' => 'Udvid tekst', 'accessibility.collapseText' => 'Fold tekst sammen', + 'accessibility.alphabetNavigation' => 'Alfabetnavigation', + 'accessibility.alphabetScrollHint' => 'Stryg op eller ned for at flytte รฉt bogstav', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rรฆkke ${row} af ${rowCount}, kolonne ${column} af ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Rรฆkke ${row} af ${rowCount}', 'tooltips.shufflePlay' => 'Afspil tilfรฆldigt', 'tooltips.playTrailer' => 'Afspil trailer', 'tooltips.markAsWatched' => 'Markรฉr som set', 'tooltips.markAsUnwatched' => 'Markรฉr som uset', + 'audioTracks.track' => ({required Object n}) => 'Lydspor ${n}', 'videoControls.audioLabel' => 'Lyd', 'videoControls.subtitlesLabel' => 'Undertekster', 'videoControls.resetToZero' => 'Nulstil til 0ms', @@ -2644,20 +2659,20 @@ extension on TranslationsDa { 'messages.markedAsUnwatched' => 'Markeret som uset', 'messages.markedAsWatchedOffline' => 'Markeret som set (synkroniseres online)', 'messages.markedAsUnwatchedOffline' => 'Markeret som uset (synkroniseres online)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatisk fjernet: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('da'))(n, one: 'Fjernede automatisk ${n} set download', other: 'Fjernede automatisk ${n} sete downloads', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatisk fjernet: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('da'))(n, one: 'Fjernede automatisk ${n} set download', other: 'Fjernede automatisk ${n} sete downloads', ), 'messages.removedFromContinueWatching' => 'Fjernet fra Fortsรฆt med at se', 'messages.errorLoading' => ({required Object error}) => 'Fejl: ${error}', 'messages.streamInterrupted' => 'Streamen blev afbrudt. Tryk pรฅ afspil, eller spol for at prรธve igen.', 'messages.liveStreamInterrupted' => 'Livestreamen blev afbrudt. Tryk pรฅ afspil for at prรธve igen.', 'messages.fileInfoNotAvailable' => 'Filinfo ikke tilgรฆngelig', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'Fejl ved indlรฆsning af filinfo: ${error}', 'messages.errorLoadingSeries' => 'Fejl ved indlรฆsning af serie', 'messages.musicNotSupported' => 'Musikafspilning understรธttes endnu ikke', @@ -2772,6 +2787,7 @@ extension on TranslationsDa { 'profiles.borrowExplain' => 'Lรฅn en anden profils forbindelse. PIN-beskyttede profiler krรฆver en PIN.', 'profiles.borrowEmpty' => 'Intet at lรฅne endnu.', 'profiles.borrowEmptySubtitle' => 'Forbind Plex eller Jellyfin til en anden profil fรธrst.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'Fra ${displayName}', 'profiles.borrowConnectionBorrowed' => 'Forbindelse lรฅnt.', 'profiles.borrowFailed' => 'Kunne ikke lรฅne forbindelse.', @@ -2997,7 +3013,7 @@ extension on TranslationsDa { 'liveTv.favorites' => 'Favoritter', 'liveTv.reorderFavorites' => 'Omarranger favoritter', 'liveTv.favoritesLoadFailed' => 'Favoritter kunne ikke indlรฆses. Kontrollรฉr forbindelsen, og prรธv igen.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'Deltag i igangvรฆrende session', 'liveTv.watchFromStart' => ({required Object minutes}) => 'Se fra start (${minutes} min siden)', 'liveTv.watchLive' => 'Se live', @@ -3157,11 +3173,11 @@ extension on TranslationsDa { 'watchTogether.participantLeft' => ({required Object name}) => '${name} forlod', 'watchTogether.participantPaused' => ({required Object name}) => '${name} satte pรฅ pause', 'watchTogether.participantResumed' => ({required Object name}) => '${name} genoptog', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} spoled', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} bufferer', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} bruger en รฆldre appversion โ€” synkronisering er ikke tilgรฆngelig', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'Fortsรฆtter uden ${name}', 'watchTogether.waitingForParticipants' => 'Venter pรฅ at andre indlรฆser...', 'watchTogether.waitingForName' => ({required Object name}) => 'Venter pรฅ ${name}...', diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index 0672887d..9f75d61d 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -52,6 +52,7 @@ class TranslationsDe extends Translations with BaseTranslations 'Warte auf Bestรคtigungโ€ฆ'; @override String get quickConnectCancel => 'Abbrechen'; @override String get quickConnectExpired => 'Quick Connect ist abgelaufen. Versuche es erneut.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -311,7 +312,7 @@ class _TranslationsSettingsDe extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'Gemeinsam Schauen Relay'; @override String get watchTogetherRelayDescription => 'Eigenes Relay festlegen. Alle mรผssen denselben Server verwenden.'; @override String get watchTogetherRelayHint => 'https://mein-relay.beispiel.de'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'Absturzberichte'; @override String get crashReportingDescription => 'Absturzberichte senden, um die App zu verbessern'; @override String get debugLogging => 'Debug-Protokollierung'; @@ -328,12 +329,10 @@ class _TranslationsSettingsDe extends TranslationsSettingsEn { @override String get exportSettings => 'Einstellungen exportieren'; @override String get exportSettingsDescription => 'Speichere deine Einstellungen in einer Datei'; @override String get exportSettingsSuccess => 'Einstellungen exportiert'; - @override String get exportSettingsFailed => 'Einstellungen konnten nicht exportiert werden'; @override String get importSettings => 'Einstellungen importieren'; @override String get importSettingsDescription => 'Einstellungen aus einer Datei wiederherstellen'; @override String get importSettingsConfirm => 'Dies ersetzt deine aktuellen Einstellungen. Fortfahren?'; @override String get importSettingsSuccess => 'Einstellungen importiert'; - @override String get importSettingsFailed => 'Einstellungen konnten nicht importiert werden'; @override String get importSettingsInvalidFile => 'Diese Datei ist kein gรผltiger Plezy-Einstellungsexport'; @override String get importSettingsNoUser => 'Vor dem Import bitte anmelden'; @override String get shortcutsReset => 'Tastenkรผrzel auf Standard zurรผckgesetzt'; @@ -348,6 +347,7 @@ class _TranslationsSettingsDe extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'Dauer muss zwischen ${min} und ${max} ${unit} liegen'; @override String shortcutAlreadyAssigned({required Object action}) => 'Tastenkรผrzel bereits zugewiesen an ${action}'; @override String shortcutUpdated({required Object action}) => 'Tastenkรผrzel aktualisiert fรผr ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'Automatisches รœberspringen'; @override String get autoSkipIntro => 'Intro automatisch รผberspringen'; @override String get autoSkipIntroDescription => 'Intro-Marker nach wenigen Sekunden automatisch รผberspringen'; @@ -373,7 +373,7 @@ class _TranslationsSettingsDe extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'Download-Speicherort geรคndert'; @override String get downloadLocationReset => 'Download-Speicherort auf Standard zurรผckgesetzt'; @override String get downloadLocationInvalid => 'Ausgewรคhlter Ordner ist nicht beschreibbar'; - @override String get downloadLocationSelectError => 'Ordnerauswahl fehlgeschlagen'; + @override String get downloadLocationPickerUnavailable => 'Die Ordnerauswahl ist auf diesem Gerรคt nicht verfรผgbar'; @override String get downloadOnWifiOnly => 'Nur รผber WLAN herunterladen'; @override String get downloadOnWifiOnlyDescription => 'Downloads รผber mobile Daten verhindern'; @override String get autoRemoveWatchedDownloads => 'Gesehene Downloads automatisch entfernen'; @@ -591,6 +591,10 @@ class _TranslationsAccessibilityDe extends TranslationsAccessibilityEn { @override String get hexColor => 'Hex-Farbe'; @override String get expandText => 'Text ausklappen'; @override String get collapseText => 'Text einklappen'; + @override String get alphabetNavigation => 'Alphabetische Navigation'; + @override String get alphabetScrollHint => 'Nach oben oder unten wischen, um einen Buchstaben weiterzugehen'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Zeile ${row} von ${rowCount}, Spalte ${column} von ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'Zeile ${row} von ${rowCount}'; } // Path: tooltips @@ -606,6 +610,16 @@ class _TranslationsTooltipsDe extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'Als ungesehen markieren'; } +// Path: audioTracks +class _TranslationsAudioTracksDe extends TranslationsAudioTracksEn { + _TranslationsAudioTracksDe._(TranslationsDe root) : this._root = root, super.internal(root); + + final TranslationsDe _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'Audiospur ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsDe extends TranslationsVideoControlsEn { _TranslationsVideoControlsDe._(TranslationsDe root) : this._root = root, super.internal(root); @@ -712,11 +726,11 @@ class _TranslationsMessagesDe extends TranslationsMessagesEn { @override String get streamInterrupted => 'Der Stream wurde unterbrochen. Drรผcke auf Wiedergabe oder spule, um es erneut zu versuchen.'; @override String get liveStreamInterrupted => 'Der Livestream wurde unterbrochen. Drรผcke auf Wiedergabe, um es erneut zu versuchen.'; @override String get fileInfoNotAvailable => 'Dateiinfo nicht verfรผgbar'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'Fehler beim Laden der Dateiinfo: ${error}'; @override String get errorLoadingSeries => 'Fehler beim Laden der Serie'; @override String get musicNotSupported => 'Musikwiedergabe wird noch nicht unterstรผtzt'; @@ -867,6 +881,7 @@ class _TranslationsProfilesDe extends TranslationsProfilesEn { @override String get borrowExplain => 'Verbindung eines anderen Profils leihen. PIN-geschรผtzte Profile erfordern eine PIN.'; @override String get borrowEmpty => 'Noch nichts zum Ausleihen.'; @override String get borrowEmptySubtitle => 'Verbinde zuerst Plex oder Jellyfin mit einem anderen Profil.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'Von ${displayName}'; @override String get borrowConnectionBorrowed => 'Verbindung ausgeliehen.'; @override String get borrowFailed => 'Verbindung konnte nicht ausgeliehen werden.'; @@ -1150,7 +1165,7 @@ class _TranslationsLiveTvDe extends TranslationsLiveTvEn { @override String get favorites => 'Favoriten'; @override String get reorderFavorites => 'Favoriten sortieren'; @override String get favoritesLoadFailed => 'Favoriten konnten nicht geladen werden. รœberprรผfe deine Verbindung und versuche es erneut.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'Laufender Sitzung beitreten'; @override String watchFromStart({required Object minutes}) => 'Von Anfang an ansehen (vor ${minutes} Min.)'; @override String get watchLive => 'Live ansehen'; @@ -2149,7 +2164,7 @@ extension on TranslationsDe { 'auth.quickConnectWaiting' => 'Warte auf Bestรคtigungโ€ฆ', 'auth.quickConnectCancel' => 'Abbrechen', 'auth.quickConnectExpired' => 'Quick Connect ist abgelaufen. Versuche es erneut.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'Abbrechen', 'common.save' => 'Speichern', 'common.close' => 'SchlieรŸen', @@ -2304,7 +2319,7 @@ extension on TranslationsDe { 'settings.watchTogetherRelay' => 'Gemeinsam Schauen Relay', 'settings.watchTogetherRelayDescription' => 'Eigenes Relay festlegen. Alle mรผssen denselben Server verwenden.', 'settings.watchTogetherRelayHint' => 'https://mein-relay.beispiel.de', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'Absturzberichte', 'settings.crashReportingDescription' => 'Absturzberichte senden, um die App zu verbessern', 'settings.debugLogging' => 'Debug-Protokollierung', @@ -2321,12 +2336,10 @@ extension on TranslationsDe { 'settings.exportSettings' => 'Einstellungen exportieren', 'settings.exportSettingsDescription' => 'Speichere deine Einstellungen in einer Datei', 'settings.exportSettingsSuccess' => 'Einstellungen exportiert', - 'settings.exportSettingsFailed' => 'Einstellungen konnten nicht exportiert werden', 'settings.importSettings' => 'Einstellungen importieren', 'settings.importSettingsDescription' => 'Einstellungen aus einer Datei wiederherstellen', 'settings.importSettingsConfirm' => 'Dies ersetzt deine aktuellen Einstellungen. Fortfahren?', 'settings.importSettingsSuccess' => 'Einstellungen importiert', - 'settings.importSettingsFailed' => 'Einstellungen konnten nicht importiert werden', 'settings.importSettingsInvalidFile' => 'Diese Datei ist kein gรผltiger Plezy-Einstellungsexport', 'settings.importSettingsNoUser' => 'Vor dem Import bitte anmelden', 'settings.shortcutsReset' => 'Tastenkรผrzel auf Standard zurรผckgesetzt', @@ -2341,6 +2354,7 @@ extension on TranslationsDe { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'Dauer muss zwischen ${min} und ${max} ${unit} liegen', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'Tastenkรผrzel bereits zugewiesen an ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'Tastenkรผrzel aktualisiert fรผr ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'Automatisches รœberspringen', 'settings.autoSkipIntro' => 'Intro automatisch รผberspringen', 'settings.autoSkipIntroDescription' => 'Intro-Marker nach wenigen Sekunden automatisch รผberspringen', @@ -2366,7 +2380,7 @@ extension on TranslationsDe { 'settings.downloadLocationChanged' => 'Download-Speicherort geรคndert', 'settings.downloadLocationReset' => 'Download-Speicherort auf Standard zurรผckgesetzt', 'settings.downloadLocationInvalid' => 'Ausgewรคhlter Ordner ist nicht beschreibbar', - 'settings.downloadLocationSelectError' => 'Ordnerauswahl fehlgeschlagen', + 'settings.downloadLocationPickerUnavailable' => 'Die Ordnerauswahl ist auf diesem Gerรคt nicht verfรผgbar', 'settings.downloadOnWifiOnly' => 'Nur รผber WLAN herunterladen', 'settings.downloadOnWifiOnlyDescription' => 'Downloads รผber mobile Daten verhindern', 'settings.autoRemoveWatchedDownloads' => 'Gesehene Downloads automatisch entfernen', @@ -2554,10 +2568,15 @@ extension on TranslationsDe { 'accessibility.hexColor' => 'Hex-Farbe', 'accessibility.expandText' => 'Text ausklappen', 'accessibility.collapseText' => 'Text einklappen', + 'accessibility.alphabetNavigation' => 'Alphabetische Navigation', + 'accessibility.alphabetScrollHint' => 'Nach oben oder unten wischen, um einen Buchstaben weiterzugehen', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Zeile ${row} von ${rowCount}, Spalte ${column} von ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Zeile ${row} von ${rowCount}', 'tooltips.shufflePlay' => 'Zufallswiedergabe', 'tooltips.playTrailer' => 'Trailer abspielen', 'tooltips.markAsWatched' => 'Als gesehen markieren', 'tooltips.markAsUnwatched' => 'Als ungesehen markieren', + 'audioTracks.track' => ({required Object n}) => 'Audiospur ${n}', 'videoControls.audioLabel' => 'Audio', 'videoControls.subtitlesLabel' => 'Untertitel', 'videoControls.resetToZero' => 'Auf 0 ms zurรผcksetzen', @@ -2642,22 +2661,22 @@ extension on TranslationsDe { 'videoControls.searchLanguages' => 'Sprachen suchen...', 'messages.markedAsWatched' => 'Als gesehen markiert', 'messages.markedAsUnwatched' => 'Als ungesehen markiert', + _ => null, + } ?? switch (path) { 'messages.markedAsWatchedOffline' => 'Als gesehen markiert (wird synchronisiert, wenn online)', 'messages.markedAsUnwatchedOffline' => 'Als ungesehen markiert (wird synchronisiert, wenn online)', 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatisch entfernt: ${title}', 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('de'))(n, one: 'Automatisch entfernt: ${n} angesehener Download', other: 'Automatisch entfernt: ${n} angesehene Downloads', ), - _ => null, - } ?? switch (path) { 'messages.removedFromContinueWatching' => 'Aus โ€šWeiterschauen\' entfernt', 'messages.errorLoading' => ({required Object error}) => 'Fehler: ${error}', 'messages.streamInterrupted' => 'Der Stream wurde unterbrochen. Drรผcke auf Wiedergabe oder spule, um es erneut zu versuchen.', 'messages.liveStreamInterrupted' => 'Der Livestream wurde unterbrochen. Drรผcke auf Wiedergabe, um es erneut zu versuchen.', 'messages.fileInfoNotAvailable' => 'Dateiinfo nicht verfรผgbar', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'Fehler beim Laden der Dateiinfo: ${error}', 'messages.errorLoadingSeries' => 'Fehler beim Laden der Serie', 'messages.musicNotSupported' => 'Musikwiedergabe wird noch nicht unterstรผtzt', @@ -2772,6 +2791,7 @@ extension on TranslationsDe { 'profiles.borrowExplain' => 'Verbindung eines anderen Profils leihen. PIN-geschรผtzte Profile erfordern eine PIN.', 'profiles.borrowEmpty' => 'Noch nichts zum Ausleihen.', 'profiles.borrowEmptySubtitle' => 'Verbinde zuerst Plex oder Jellyfin mit einem anderen Profil.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'Von ${displayName}', 'profiles.borrowConnectionBorrowed' => 'Verbindung ausgeliehen.', 'profiles.borrowFailed' => 'Verbindung konnte nicht ausgeliehen werden.', @@ -2997,7 +3017,7 @@ extension on TranslationsDe { 'liveTv.favorites' => 'Favoriten', 'liveTv.reorderFavorites' => 'Favoriten sortieren', 'liveTv.favoritesLoadFailed' => 'Favoriten konnten nicht geladen werden. รœberprรผfe deine Verbindung und versuche es erneut.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'Laufender Sitzung beitreten', 'liveTv.watchFromStart' => ({required Object minutes}) => 'Von Anfang an ansehen (vor ${minutes} Min.)', 'liveTv.watchLive' => 'Live ansehen', @@ -3155,13 +3175,13 @@ extension on TranslationsDe { 'watchTogether.failedToOpenCurrentPlayback' => 'Aktuelle Wiedergabe konnte nicht geรถffnet werden', 'watchTogether.participantJoined' => ({required Object name}) => '${name} ist beigetreten', 'watchTogether.participantLeft' => ({required Object name}) => '${name} hat die Sitzung verlassen', + _ => null, + } ?? switch (path) { 'watchTogether.participantPaused' => ({required Object name}) => '${name} hat pausiert', 'watchTogether.participantResumed' => ({required Object name}) => '${name} hat fortgesetzt', 'watchTogether.participantSeeked' => ({required Object name}) => '${name} hat gespult', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} puffert', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} verwendet eine รคltere Appversion โ€” Synchronisierung nicht verfรผgbar', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'Fortfahren ohne ${name}', 'watchTogether.waitingForParticipants' => 'Warte auf andere zum Laden...', 'watchTogether.waitingForName' => ({required Object name}) => 'Warten auf ${name}...', diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index 68d61429..b88ddcdf 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -53,6 +53,7 @@ class Translations with BaseTranslations { late final TranslationsRateSheetEn rateSheet = TranslationsRateSheetEn.internal(_root); late final TranslationsAccessibilityEn accessibility = TranslationsAccessibilityEn.internal(_root); late final TranslationsTooltipsEn tooltips = TranslationsTooltipsEn.internal(_root); + late final TranslationsAudioTracksEn audioTracks = TranslationsAudioTracksEn.internal(_root); late final TranslationsVideoControlsEn videoControls = TranslationsVideoControlsEn.internal(_root); late final TranslationsMessagesEn messages = TranslationsMessagesEn.internal(_root); late final TranslationsSubtitlingStylingEn subtitlingStyling = TranslationsSubtitlingStylingEn.internal(_root); @@ -662,6 +663,9 @@ class TranslationsSettingsEn { /// en: 'Send crash reports to help improve the app' String get crashReportingDescription => 'Send crash reports to help improve the app'; + /// en: 'After disabling, reports already accepted, queued, or being sent may finish. Enabling again takes effect when Plezy restarts.' + String get crashReportingRestartRequired => 'After disabling, reports already accepted, queued, or being sent may finish. Enabling again takes effect when Plezy restarts.'; + /// en: 'Debug Logging' String get debugLogging => 'Debug Logging'; @@ -704,9 +708,6 @@ class TranslationsSettingsEn { /// en: 'Settings exported' String get exportSettingsSuccess => 'Settings exported'; - /// en: 'Could not export settings' - String get exportSettingsFailed => 'Could not export settings'; - /// en: 'Import Settings' String get importSettings => 'Import Settings'; @@ -719,9 +720,6 @@ class TranslationsSettingsEn { /// en: 'Settings imported' String get importSettingsSuccess => 'Settings imported'; - /// en: 'Could not import settings' - String get importSettingsFailed => 'Could not import settings'; - /// en: 'This file isn't a valid Plezy settings export' String get importSettingsInvalidFile => 'This file isn\'t a valid Plezy settings export'; @@ -764,6 +762,9 @@ class TranslationsSettingsEn { /// en: 'Shortcut updated for ${action}' String shortcutUpdated({required Object action}) => 'Shortcut updated for ${action}'; + /// en: 'Could not save changes. Try again.' + String get saveFailed => 'Could not save changes. Try again.'; + /// en: 'Auto Skip' String get autoSkip => 'Auto Skip'; @@ -839,8 +840,8 @@ class TranslationsSettingsEn { /// en: 'Selected folder is not writable' String get downloadLocationInvalid => 'Selected folder is not writable'; - /// en: 'Failed to select folder' - String get downloadLocationSelectError => 'Failed to select folder'; + /// en: 'Folder selection is not available on this device' + String get downloadLocationPickerUnavailable => 'Folder selection is not available on this device'; /// en: 'Download on WiFi only' String get downloadOnWifiOnly => 'Download on WiFi only'; @@ -1383,6 +1384,18 @@ class TranslationsAccessibilityEn { /// en: 'Collapse text' String get collapseText => 'Collapse text'; + + /// en: 'Alphabet navigation' + String get alphabetNavigation => 'Alphabet navigation'; + + /// en: 'Swipe up or down to move by letter' + String get alphabetScrollHint => 'Swipe up or down to move by letter'; + + /// en: 'Row ${row} of ${rowCount}, column ${column} of ${columnCount}' + String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Row ${row} of ${rowCount}, column ${column} of ${columnCount}'; + + /// en: 'Row ${row} of ${rowCount}' + String rowPosition({required Object row, required Object rowCount}) => 'Row ${row} of ${rowCount}'; } // Path: tooltips @@ -1406,6 +1419,18 @@ class TranslationsTooltipsEn { String get markAsUnwatched => 'Mark as unwatched'; } +// Path: audioTracks +class TranslationsAudioTracksEn { + TranslationsAudioTracksEn.internal(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + + /// en: 'Audio Track ${n}' + String track({required Object n}) => 'Audio Track ${n}'; +} + // Path: videoControls class TranslationsVideoControlsEn { TranslationsVideoControlsEn.internal(this._root); @@ -1492,6 +1517,12 @@ class TranslationsVideoControlsEn { /// en: 'Pause' String get pauseButton => 'Pause'; + /// en: 'Show playback controls' + String get showPlaybackControls => 'Show playback controls'; + + /// en: 'Hide playback controls' + String get hidePlaybackControls => 'Hide playback controls'; + /// en: 'Seek backward ${seconds} seconds' String seekBackwardButton({required Object seconds}) => 'Seek backward ${seconds} seconds'; @@ -2079,6 +2110,9 @@ class TranslationsProfilesEn { /// en: 'Connect Plex or Jellyfin to another profile first.' String get borrowEmptySubtitle => 'Connect Plex or Jellyfin to another profile first.'; + /// en: 'Available connections could not be loaded. Try again.' + String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; + /// en: 'From ${displayName}' String borrowFromProfile({required Object displayName}) => 'From ${displayName}'; @@ -5186,6 +5220,7 @@ extension on Translations { 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'Crash Reporting', 'settings.crashReportingDescription' => 'Send crash reports to help improve the app', + 'settings.crashReportingRestartRequired' => 'After disabling, reports already accepted, queued, or being sent may finish. Enabling again takes effect when Plezy restarts.', 'settings.debugLogging' => 'Debug Logging', 'settings.debugLoggingDescription' => 'Enable detailed logging for troubleshooting', 'settings.viewLogs' => 'View Logs', @@ -5200,12 +5235,10 @@ extension on Translations { 'settings.exportSettings' => 'Export Settings', 'settings.exportSettingsDescription' => 'Save your preferences to a file', 'settings.exportSettingsSuccess' => 'Settings exported', - 'settings.exportSettingsFailed' => 'Could not export settings', 'settings.importSettings' => 'Import Settings', 'settings.importSettingsDescription' => 'Restore preferences from a file', 'settings.importSettingsConfirm' => 'This will replace your current settings. Continue?', 'settings.importSettingsSuccess' => 'Settings imported', - 'settings.importSettingsFailed' => 'Could not import settings', 'settings.importSettingsInvalidFile' => 'This file isn\'t a valid Plezy settings export', 'settings.importSettingsNoUser' => 'Sign in before importing settings', 'settings.shortcutsReset' => 'Shortcuts reset to defaults', @@ -5220,6 +5253,7 @@ extension on Translations { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'Duration must be between ${min} and ${max} ${unit}', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'Shortcut already assigned to ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'Shortcut updated for ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'Auto Skip', 'settings.autoSkipIntro' => 'Auto Skip Intro', 'settings.autoSkipIntroDescription' => 'Automatically skip intro markers after a few seconds', @@ -5245,7 +5279,7 @@ extension on Translations { 'settings.downloadLocationChanged' => 'Download location changed', 'settings.downloadLocationReset' => 'Download location reset to default', 'settings.downloadLocationInvalid' => 'Selected folder is not writable', - 'settings.downloadLocationSelectError' => 'Failed to select folder', + 'settings.downloadLocationPickerUnavailable' => 'Folder selection is not available on this device', 'settings.downloadOnWifiOnly' => 'Download on WiFi only', 'settings.downloadOnWifiOnlyDescription' => 'Prevent downloads when on cellular data', 'settings.autoRemoveWatchedDownloads' => 'Auto-remove watched downloads', @@ -5433,10 +5467,15 @@ extension on Translations { 'accessibility.hexColor' => 'Hex color', 'accessibility.expandText' => 'Expand text', 'accessibility.collapseText' => 'Collapse text', + 'accessibility.alphabetNavigation' => 'Alphabet navigation', + 'accessibility.alphabetScrollHint' => 'Swipe up or down to move by letter', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Row ${row} of ${rowCount}, column ${column} of ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Row ${row} of ${rowCount}', 'tooltips.shufflePlay' => 'Shuffle play', 'tooltips.playTrailer' => 'Play trailer', 'tooltips.markAsWatched' => 'Mark as watched', 'tooltips.markAsUnwatched' => 'Mark as unwatched', + 'audioTracks.track' => ({required Object n}) => 'Audio Track ${n}', 'videoControls.audioLabel' => 'Audio', 'videoControls.subtitlesLabel' => 'Subtitles', 'videoControls.resetToZero' => 'Reset to 0ms', @@ -5463,6 +5502,8 @@ extension on Translations { 'videoControls.playNext' => 'Play Next', 'videoControls.playButton' => 'Play', 'videoControls.pauseButton' => 'Pause', + 'videoControls.showPlaybackControls' => 'Show playback controls', + 'videoControls.hidePlaybackControls' => 'Hide playback controls', 'videoControls.seekBackwardButton' => ({required Object seconds}) => 'Seek backward ${seconds} seconds', 'videoControls.seekForwardButton' => ({required Object seconds}) => 'Seek forward ${seconds} seconds', 'videoControls.previousButton' => 'Previous episode', @@ -5518,6 +5559,8 @@ extension on Translations { 'videoControls.subtitleDownloaded' => 'Subtitle downloaded', 'videoControls.subtitleDownloadedNotApplied' => 'Subtitle downloaded, but it could not be selected', 'videoControls.subtitleDownloadFailed' => 'Failed to download subtitle', + _ => null, + } ?? switch (path) { 'videoControls.searchLanguages' => 'Search languages...', 'messages.markedAsWatched' => 'Marked as watched', @@ -5526,8 +5569,6 @@ extension on Translations { 'messages.markedAsUnwatchedOffline' => 'Marked as unwatched (will sync when online)', 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Auto-removed: ${title}', 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('en'))(n, one: 'Auto-removed ${n} watched download', other: 'Auto-removed ${n} watched downloads', ), - _ => null, - } ?? switch (path) { 'messages.removedFromContinueWatching' => 'Removed from Continue Watching', 'messages.errorLoading' => ({required Object error}) => 'Error: ${error}', 'messages.streamInterrupted' => 'The stream was interrupted. Press play or seek to retry.', @@ -5652,6 +5693,7 @@ extension on Translations { 'profiles.borrowExplain' => 'Borrow another profile\'s connection. PIN-protected profiles require a PIN.', 'profiles.borrowEmpty' => 'Nothing to borrow yet.', 'profiles.borrowEmptySubtitle' => 'Connect Plex or Jellyfin to another profile first.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'From ${displayName}', 'profiles.borrowConnectionBorrowed' => 'Connection borrowed.', 'profiles.borrowFailed' => 'Failed to borrow connection.', @@ -6032,6 +6074,8 @@ extension on Translations { 'watchTogether.currentPlayback' => 'Current Playback', 'watchTogether.joinCurrentPlayback' => 'Join Current Playback', 'watchTogether.joinCurrentPlaybackDescription' => 'Jump back into what the host is currently watching', + _ => null, + } ?? switch (path) { 'watchTogether.failedToOpenCurrentPlayback' => 'Failed to open current playback', 'watchTogether.participantJoined' => ({required Object name}) => '${name} joined', @@ -6041,8 +6085,6 @@ extension on Translations { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} seeked', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} is buffering', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} is on an older app version โ€” sync unavailable', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'Resuming without ${name}', 'watchTogether.waitingForParticipants' => 'Waiting for others to load...', 'watchTogether.waitingForName' => ({required Object name}) => 'Waiting for ${name}...', diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index 9571b1d4..5601f2ea 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -52,6 +52,7 @@ class TranslationsEs extends Translations with BaseTranslations 'Esperando aprobaciรณnโ€ฆ'; @override String get quickConnectCancel => 'Cancelar'; @override String get quickConnectExpired => 'Quick Connect caducรณ. Intรฉntalo de nuevo.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsEs extends TranslationsSettingsEn { @override String get libraryDensity => 'Densidad de Biblioteca'; @override String get compact => 'Compacto'; @override String get comfortable => 'Cรณmodo'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => 'Modo de Vista'; @override String get gridView => 'Cuadrรญcula'; @override String get listView => 'Lista'; @@ -311,7 +310,7 @@ class _TranslationsSettingsEs extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'Relay de Ver Juntos'; @override String get watchTogetherRelayDescription => 'Define un relay personalizado. Todos deben usar el mismo servidor.'; @override String get watchTogetherRelayHint => 'https://mi-relay.ejemplo.com'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'Informes de Errores'; @override String get crashReportingDescription => 'Enviar informes de errores para mejorar la aplicaciรณn'; @override String get debugLogging => 'Registro de Depuraciรณn'; @@ -328,12 +327,10 @@ class _TranslationsSettingsEs extends TranslationsSettingsEn { @override String get exportSettings => 'Exportar Configuraciรณn'; @override String get exportSettingsDescription => 'Guardar tus preferencias en un archivo'; @override String get exportSettingsSuccess => 'Configuraciรณn exportada'; - @override String get exportSettingsFailed => 'No se pudo exportar la configuraciรณn'; @override String get importSettings => 'Importar Configuraciรณn'; @override String get importSettingsDescription => 'Restaurar preferencias desde un archivo'; @override String get importSettingsConfirm => 'Esto reemplazarรก tu configuraciรณn actual. ยฟContinuar?'; @override String get importSettingsSuccess => 'Configuraciรณn importada'; - @override String get importSettingsFailed => 'No se pudo importar la configuraciรณn'; @override String get importSettingsInvalidFile => 'Este archivo no es una exportaciรณn vรกlida de Plezy'; @override String get importSettingsNoUser => 'Inicia sesiรณn antes de importar la configuraciรณn'; @override String get shortcutsReset => 'Atajos restablecidos a los valores predeterminados'; @@ -348,6 +345,7 @@ class _TranslationsSettingsEs extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'La duraciรณn debe estar entre ${min} y ${max} ${unit}'; @override String shortcutAlreadyAssigned({required Object action}) => 'El atajo ya estรก asignado a ${action}'; @override String shortcutUpdated({required Object action}) => 'Atajo actualizado para ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'Salto automรกtico'; @override String get autoSkipIntro => 'Saltar Intro automรกticamente'; @override String get autoSkipIntroDescription => 'Saltar automรกticamente los marcadores de intro despuรฉs de unos segundos'; @@ -373,7 +371,7 @@ class _TranslationsSettingsEs extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'Ubicaciรณn de descarga cambiada'; @override String get downloadLocationReset => 'Ubicaciรณn de descarga restablecida al predeterminado'; @override String get downloadLocationInvalid => 'La carpeta seleccionada no tiene permisos de escritura'; - @override String get downloadLocationSelectError => 'Error al seleccionar la carpeta'; + @override String get downloadLocationPickerUnavailable => 'La selecciรณn de carpetas no estรก disponible en este dispositivo'; @override String get downloadOnWifiOnly => 'Descargar solo con WiFi'; @override String get downloadOnWifiOnlyDescription => 'Evitar descargas cuando se usan datos mรณviles'; @override String get autoRemoveWatchedDownloads => 'Eliminar descargas vistas automรกticamente'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityEs extends TranslationsAccessibilityEn { @override String get hexColor => 'Color hexadecimal'; @override String get expandText => 'Expandir texto'; @override String get collapseText => 'Contraer texto'; + @override String get alphabetNavigation => 'Navegaciรณn alfabรฉtica'; + @override String get alphabetScrollHint => 'Desliza hacia arriba o abajo para avanzar por letra'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Fila ${row} de ${rowCount}, columna ${column} de ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'Fila ${row} de ${rowCount}'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsEs extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'Marcar como no visto'; } +// Path: audioTracks +class _TranslationsAudioTracksEs extends TranslationsAudioTracksEn { + _TranslationsAudioTracksEs._(TranslationsEs root) : this._root = root, super.internal(root); + + final TranslationsEs _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'Pista de audio ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsEs extends TranslationsVideoControlsEn { _TranslationsVideoControlsEs._(TranslationsEs root) : this._root = root, super.internal(root); @@ -712,11 +724,11 @@ class _TranslationsMessagesEs extends TranslationsMessagesEn { @override String get streamInterrupted => 'La reproducciรณn se interrumpiรณ. Pulsa reproducir o avanza para volver a intentarlo.'; @override String get liveStreamInterrupted => 'La transmisiรณn en vivo se interrumpiรณ. Pulsa reproducir para volver a intentarlo.'; @override String get fileInfoNotAvailable => 'Informaciรณn de archivo no disponible'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'Error al cargar info de archivo: ${error}'; @override String get errorLoadingSeries => 'Error al cargar la serie'; @override String get musicNotSupported => 'La reproducciรณn de mรบsica aรบn no estรก soportada'; @@ -867,6 +879,7 @@ class _TranslationsProfilesEs extends TranslationsProfilesEn { @override String get borrowExplain => 'Toma prestada la conexiรณn de otro perfil. Los perfiles protegidos con PIN requieren un PIN.'; @override String get borrowEmpty => 'Nada para tomar prestado todavรญa.'; @override String get borrowEmptySubtitle => 'Conecta Plex o Jellyfin primero a otro perfil.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'De ${displayName}'; @override String get borrowConnectionBorrowed => 'Conexiรณn tomada prestada.'; @override String get borrowFailed => 'No se pudo tomar prestada la conexiรณn.'; @@ -1150,7 +1163,7 @@ class _TranslationsLiveTvEs extends TranslationsLiveTvEn { @override String get favorites => 'Favoritos'; @override String get reorderFavorites => 'Reordenar favoritos'; @override String get favoritesLoadFailed => 'No se pudieron cargar los favoritos. Comprueba tu conexiรณn e intรฉntalo de nuevo.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'Unirse a sesiรณn en curso'; @override String watchFromStart({required Object minutes}) => 'Ver desde el inicio (hace ${minutes} min)'; @override String get watchLive => 'Ver en vivo'; @@ -2149,7 +2162,7 @@ extension on TranslationsEs { 'auth.quickConnectWaiting' => 'Esperando aprobaciรณnโ€ฆ', 'auth.quickConnectCancel' => 'Cancelar', 'auth.quickConnectExpired' => 'Quick Connect caducรณ. Intรฉntalo de nuevo.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'Cancelar', 'common.save' => 'Guardar', 'common.close' => 'Cerrar', @@ -2233,8 +2246,6 @@ extension on TranslationsEs { 'settings.libraryDensity' => 'Densidad de Biblioteca', 'settings.compact' => 'Compacto', 'settings.comfortable' => 'Cรณmodo', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => 'Modo de Vista', 'settings.gridView' => 'Cuadrรญcula', 'settings.listView' => 'Lista', @@ -2304,7 +2315,7 @@ extension on TranslationsEs { 'settings.watchTogetherRelay' => 'Relay de Ver Juntos', 'settings.watchTogetherRelayDescription' => 'Define un relay personalizado. Todos deben usar el mismo servidor.', 'settings.watchTogetherRelayHint' => 'https://mi-relay.ejemplo.com', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'Informes de Errores', 'settings.crashReportingDescription' => 'Enviar informes de errores para mejorar la aplicaciรณn', 'settings.debugLogging' => 'Registro de Depuraciรณn', @@ -2321,12 +2332,10 @@ extension on TranslationsEs { 'settings.exportSettings' => 'Exportar Configuraciรณn', 'settings.exportSettingsDescription' => 'Guardar tus preferencias en un archivo', 'settings.exportSettingsSuccess' => 'Configuraciรณn exportada', - 'settings.exportSettingsFailed' => 'No se pudo exportar la configuraciรณn', 'settings.importSettings' => 'Importar Configuraciรณn', 'settings.importSettingsDescription' => 'Restaurar preferencias desde un archivo', 'settings.importSettingsConfirm' => 'Esto reemplazarรก tu configuraciรณn actual. ยฟContinuar?', 'settings.importSettingsSuccess' => 'Configuraciรณn importada', - 'settings.importSettingsFailed' => 'No se pudo importar la configuraciรณn', 'settings.importSettingsInvalidFile' => 'Este archivo no es una exportaciรณn vรกlida de Plezy', 'settings.importSettingsNoUser' => 'Inicia sesiรณn antes de importar la configuraciรณn', 'settings.shortcutsReset' => 'Atajos restablecidos a los valores predeterminados', @@ -2341,6 +2350,7 @@ extension on TranslationsEs { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'La duraciรณn debe estar entre ${min} y ${max} ${unit}', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'El atajo ya estรก asignado a ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'Atajo actualizado para ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'Salto automรกtico', 'settings.autoSkipIntro' => 'Saltar Intro automรกticamente', 'settings.autoSkipIntroDescription' => 'Saltar automรกticamente los marcadores de intro despuรฉs de unos segundos', @@ -2366,7 +2376,7 @@ extension on TranslationsEs { 'settings.downloadLocationChanged' => 'Ubicaciรณn de descarga cambiada', 'settings.downloadLocationReset' => 'Ubicaciรณn de descarga restablecida al predeterminado', 'settings.downloadLocationInvalid' => 'La carpeta seleccionada no tiene permisos de escritura', - 'settings.downloadLocationSelectError' => 'Error al seleccionar la carpeta', + 'settings.downloadLocationPickerUnavailable' => 'La selecciรณn de carpetas no estรก disponible en este dispositivo', 'settings.downloadOnWifiOnly' => 'Descargar solo con WiFi', 'settings.downloadOnWifiOnlyDescription' => 'Evitar descargas cuando se usan datos mรณviles', 'settings.autoRemoveWatchedDownloads' => 'Eliminar descargas vistas automรกticamente', @@ -2554,10 +2564,15 @@ extension on TranslationsEs { 'accessibility.hexColor' => 'Color hexadecimal', 'accessibility.expandText' => 'Expandir texto', 'accessibility.collapseText' => 'Contraer texto', + 'accessibility.alphabetNavigation' => 'Navegaciรณn alfabรฉtica', + 'accessibility.alphabetScrollHint' => 'Desliza hacia arriba o abajo para avanzar por letra', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Fila ${row} de ${rowCount}, columna ${column} de ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Fila ${row} de ${rowCount}', 'tooltips.shufflePlay' => 'Reproducciรณn aleatoria', 'tooltips.playTrailer' => 'Reproducir trรกiler', 'tooltips.markAsWatched' => 'Marcar como visto', 'tooltips.markAsUnwatched' => 'Marcar como no visto', + 'audioTracks.track' => ({required Object n}) => 'Pista de audio ${n}', 'videoControls.audioLabel' => 'Audio', 'videoControls.subtitlesLabel' => 'Subtรญtulos', 'videoControls.resetToZero' => 'Restablecer a 0ms', @@ -2644,20 +2659,20 @@ extension on TranslationsEs { 'messages.markedAsUnwatched' => 'Marcado como no visto', 'messages.markedAsWatchedOffline' => 'Marcado como visto (se sincronizarรก al estar en lรญnea)', 'messages.markedAsUnwatchedOffline' => 'Marcado como no visto (se sincronizarรก al estar en lรญnea)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Eliminado automรกticamente: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('es'))(n, one: 'Se eliminรณ automรกticamente ${n} descarga vista', other: 'Se eliminaron automรกticamente ${n} descargas vistas', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Eliminado automรกticamente: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('es'))(n, one: 'Se eliminรณ automรกticamente ${n} descarga vista', other: 'Se eliminaron automรกticamente ${n} descargas vistas', ), 'messages.removedFromContinueWatching' => 'Eliminado de Seguir Viendo', 'messages.errorLoading' => ({required Object error}) => 'Error: ${error}', 'messages.streamInterrupted' => 'La reproducciรณn se interrumpiรณ. Pulsa reproducir o avanza para volver a intentarlo.', 'messages.liveStreamInterrupted' => 'La transmisiรณn en vivo se interrumpiรณ. Pulsa reproducir para volver a intentarlo.', 'messages.fileInfoNotAvailable' => 'Informaciรณn de archivo no disponible', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'Error al cargar info de archivo: ${error}', 'messages.errorLoadingSeries' => 'Error al cargar la serie', 'messages.musicNotSupported' => 'La reproducciรณn de mรบsica aรบn no estรก soportada', @@ -2772,6 +2787,7 @@ extension on TranslationsEs { 'profiles.borrowExplain' => 'Toma prestada la conexiรณn de otro perfil. Los perfiles protegidos con PIN requieren un PIN.', 'profiles.borrowEmpty' => 'Nada para tomar prestado todavรญa.', 'profiles.borrowEmptySubtitle' => 'Conecta Plex o Jellyfin primero a otro perfil.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'De ${displayName}', 'profiles.borrowConnectionBorrowed' => 'Conexiรณn tomada prestada.', 'profiles.borrowFailed' => 'No se pudo tomar prestada la conexiรณn.', @@ -2997,7 +3013,7 @@ extension on TranslationsEs { 'liveTv.favorites' => 'Favoritos', 'liveTv.reorderFavorites' => 'Reordenar favoritos', 'liveTv.favoritesLoadFailed' => 'No se pudieron cargar los favoritos. Comprueba tu conexiรณn e intรฉntalo de nuevo.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'Unirse a sesiรณn en curso', 'liveTv.watchFromStart' => ({required Object minutes}) => 'Ver desde el inicio (hace ${minutes} min)', 'liveTv.watchLive' => 'Ver en vivo', @@ -3157,11 +3173,11 @@ extension on TranslationsEs { 'watchTogether.participantLeft' => ({required Object name}) => '${name} se fue', 'watchTogether.participantPaused' => ({required Object name}) => '${name} pausรณ', 'watchTogether.participantResumed' => ({required Object name}) => '${name} reanudรณ', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} avanzรณ', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} estรก cargando', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} usa una versiรณn anterior de la app โ€” sincronizaciรณn no disponible', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'Reanudando sin ${name}', 'watchTogether.waitingForParticipants' => 'Esperando a que otros carguen...', 'watchTogether.waitingForName' => ({required Object name}) => 'Esperando a ${name}...', diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index 286fed9e..652d0c9b 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -52,6 +52,7 @@ class TranslationsFr extends Translations with BaseTranslations 'En attente d\'approbationโ€ฆ'; @override String get quickConnectCancel => 'Annuler'; @override String get quickConnectExpired => 'Quick Connect a expirรฉ. Rรฉessayez.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsFr extends TranslationsSettingsEn { @override String get libraryDensity => 'Densitรฉ des bibliothรจques'; @override String get compact => 'Compact'; @override String get comfortable => 'Confortable'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => 'Mode d\'affichage'; @override String get gridView => 'Grille'; @override String get listView => 'Liste'; @@ -311,7 +310,7 @@ class _TranslationsSettingsFr extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'Relais Regarder Ensemble'; @override String get watchTogetherRelayDescription => 'Dรฉfinir un relay personnalisรฉ. Tout le monde doit utiliser le mรชme serveur.'; @override String get watchTogetherRelayHint => 'https://mon-relais.exemple.fr'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'Rapports de plantage'; @override String get crashReportingDescription => 'Envoyer des rapports de plantage pour amรฉliorer l\'application'; @override String get debugLogging => 'Journalisation de dรฉbogage'; @@ -328,12 +327,10 @@ class _TranslationsSettingsFr extends TranslationsSettingsEn { @override String get exportSettings => 'Exporter les paramรจtres'; @override String get exportSettingsDescription => 'Enregistrer vos prรฉfรฉrences dans un fichier'; @override String get exportSettingsSuccess => 'Paramรจtres exportรฉs'; - @override String get exportSettingsFailed => 'Impossible d\'exporter les paramรจtres'; @override String get importSettings => 'Importer les paramรจtres'; @override String get importSettingsDescription => 'Restaurer les prรฉfรฉrences depuis un fichier'; @override String get importSettingsConfirm => 'Cela remplacera vos paramรจtres actuels. Continuer ?'; @override String get importSettingsSuccess => 'Paramรจtres importรฉs'; - @override String get importSettingsFailed => 'Impossible d\'importer les paramรจtres'; @override String get importSettingsInvalidFile => 'Ce fichier n\'est pas un export Plezy valide'; @override String get importSettingsNoUser => 'Connectez-vous avant d\'importer les paramรจtres'; @override String get shortcutsReset => 'Raccourcis rรฉinitialisรฉs aux valeurs par dรฉfaut'; @@ -348,6 +345,7 @@ class _TranslationsSettingsFr extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'La durรฉe doit รชtre comprise entre ${min} et ${max} ${unit}'; @override String shortcutAlreadyAssigned({required Object action}) => 'Raccourci dรฉjร  attribuรฉ ร  ${action}'; @override String shortcutUpdated({required Object action}) => 'Raccourci mis ร  jour pour ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'Skip automatique'; @override String get autoSkipIntro => 'Skip automatique de l\'introduction'; @override String get autoSkipIntroDescription => 'Skipper automatiquement l\'introduction aprรจs quelques secondes'; @@ -373,7 +371,7 @@ class _TranslationsSettingsFr extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'Emplacement de tรฉlรฉchargement modifiรฉ'; @override String get downloadLocationReset => 'Emplacement de tรฉlรฉchargement rรฉinitialisรฉ ร  la valeur par dรฉfaut'; @override String get downloadLocationInvalid => 'Le dossier sรฉlectionnรฉ n\'est pas accessible en รฉcriture'; - @override String get downloadLocationSelectError => 'ร‰chec de la sรฉlection du dossier'; + @override String get downloadLocationPickerUnavailable => 'La sรฉlection de dossier nโ€™est pas disponible sur cet appareil'; @override String get downloadOnWifiOnly => 'Tรฉlรฉcharger uniquement via WiFi'; @override String get downloadOnWifiOnlyDescription => 'Empรชcher les tรฉlรฉchargements lorsque vous utilisez les donnรฉes cellulaires'; @override String get autoRemoveWatchedDownloads => 'Supprimer automatiquement les tรฉlรฉchargements vus'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityFr extends TranslationsAccessibilityEn { @override String get hexColor => 'Couleur hexadรฉcimale'; @override String get expandText => 'Dรฉvelopper le texte'; @override String get collapseText => 'Replier le texte'; + @override String get alphabetNavigation => 'Navigation alphabรฉtique'; + @override String get alphabetScrollHint => 'Balayez vers le haut ou le bas pour changer de lettre'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Ligne ${row} sur ${rowCount}, colonne ${column} sur ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'Ligne ${row} sur ${rowCount}'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsFr extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'Marquรฉ comme non vu'; } +// Path: audioTracks +class _TranslationsAudioTracksFr extends TranslationsAudioTracksEn { + _TranslationsAudioTracksFr._(TranslationsFr root) : this._root = root, super.internal(root); + + final TranslationsFr _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'Piste audio ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsFr extends TranslationsVideoControlsEn { _TranslationsVideoControlsFr._(TranslationsFr root) : this._root = root, super.internal(root); @@ -712,11 +724,11 @@ class _TranslationsMessagesFr extends TranslationsMessagesEn { @override String get streamInterrupted => 'La lecture a รฉtรฉ interrompue. Appuyez sur Lecture ou avancez pour rรฉessayer.'; @override String get liveStreamInterrupted => 'Le direct a รฉtรฉ interrompu. Appuyez sur Lecture pour rรฉessayer.'; @override String get fileInfoNotAvailable => 'Informations sur le fichier non disponibles'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'Erreur lors du chargement des informations sur le fichier: ${error}'; @override String get errorLoadingSeries => 'Erreur lors du chargement de la sรฉrie'; @override String get musicNotSupported => 'La lecture de musique n\'est pas encore prise en charge'; @@ -867,6 +879,7 @@ class _TranslationsProfilesFr extends TranslationsProfilesEn { @override String get borrowExplain => 'Emprunter la connexion d\'un autre profil. Les profils protรฉgรฉs par PIN exigent un PIN.'; @override String get borrowEmpty => 'Rien ร  emprunter pour le moment.'; @override String get borrowEmptySubtitle => 'Connectez d\'abord Plex ou Jellyfin ร  un autre profil.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'De ${displayName}'; @override String get borrowConnectionBorrowed => 'Connexion empruntรฉe.'; @override String get borrowFailed => 'Impossible d\'emprunter la connexion.'; @@ -1150,7 +1163,7 @@ class _TranslationsLiveTvFr extends TranslationsLiveTvEn { @override String get favorites => 'Favoris'; @override String get reorderFavorites => 'Rรฉorganiser les favoris'; @override String get favoritesLoadFailed => 'Impossible de charger les favoris. Vรฉrifiez votre connexion et rรฉessayez.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'Rejoindre la session en cours'; @override String watchFromStart({required Object minutes}) => 'Regarder depuis le dรฉbut (il y a ${minutes} min)'; @override String get watchLive => 'Regarder en direct'; @@ -2149,7 +2162,7 @@ extension on TranslationsFr { 'auth.quickConnectWaiting' => 'En attente d\'approbationโ€ฆ', 'auth.quickConnectCancel' => 'Annuler', 'auth.quickConnectExpired' => 'Quick Connect a expirรฉ. Rรฉessayez.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'Annuler', 'common.save' => 'Sauvegarder', 'common.close' => 'Fermer', @@ -2233,8 +2246,6 @@ extension on TranslationsFr { 'settings.libraryDensity' => 'Densitรฉ des bibliothรจques', 'settings.compact' => 'Compact', 'settings.comfortable' => 'Confortable', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => 'Mode d\'affichage', 'settings.gridView' => 'Grille', 'settings.listView' => 'Liste', @@ -2304,7 +2315,7 @@ extension on TranslationsFr { 'settings.watchTogetherRelay' => 'Relais Regarder Ensemble', 'settings.watchTogetherRelayDescription' => 'Dรฉfinir un relay personnalisรฉ. Tout le monde doit utiliser le mรชme serveur.', 'settings.watchTogetherRelayHint' => 'https://mon-relais.exemple.fr', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'Rapports de plantage', 'settings.crashReportingDescription' => 'Envoyer des rapports de plantage pour amรฉliorer l\'application', 'settings.debugLogging' => 'Journalisation de dรฉbogage', @@ -2321,12 +2332,10 @@ extension on TranslationsFr { 'settings.exportSettings' => 'Exporter les paramรจtres', 'settings.exportSettingsDescription' => 'Enregistrer vos prรฉfรฉrences dans un fichier', 'settings.exportSettingsSuccess' => 'Paramรจtres exportรฉs', - 'settings.exportSettingsFailed' => 'Impossible d\'exporter les paramรจtres', 'settings.importSettings' => 'Importer les paramรจtres', 'settings.importSettingsDescription' => 'Restaurer les prรฉfรฉrences depuis un fichier', 'settings.importSettingsConfirm' => 'Cela remplacera vos paramรจtres actuels. Continuer ?', 'settings.importSettingsSuccess' => 'Paramรจtres importรฉs', - 'settings.importSettingsFailed' => 'Impossible d\'importer les paramรจtres', 'settings.importSettingsInvalidFile' => 'Ce fichier n\'est pas un export Plezy valide', 'settings.importSettingsNoUser' => 'Connectez-vous avant d\'importer les paramรจtres', 'settings.shortcutsReset' => 'Raccourcis rรฉinitialisรฉs aux valeurs par dรฉfaut', @@ -2341,6 +2350,7 @@ extension on TranslationsFr { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'La durรฉe doit รชtre comprise entre ${min} et ${max} ${unit}', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'Raccourci dรฉjร  attribuรฉ ร  ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'Raccourci mis ร  jour pour ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'Skip automatique', 'settings.autoSkipIntro' => 'Skip automatique de l\'introduction', 'settings.autoSkipIntroDescription' => 'Skipper automatiquement l\'introduction aprรจs quelques secondes', @@ -2366,7 +2376,7 @@ extension on TranslationsFr { 'settings.downloadLocationChanged' => 'Emplacement de tรฉlรฉchargement modifiรฉ', 'settings.downloadLocationReset' => 'Emplacement de tรฉlรฉchargement rรฉinitialisรฉ ร  la valeur par dรฉfaut', 'settings.downloadLocationInvalid' => 'Le dossier sรฉlectionnรฉ n\'est pas accessible en รฉcriture', - 'settings.downloadLocationSelectError' => 'ร‰chec de la sรฉlection du dossier', + 'settings.downloadLocationPickerUnavailable' => 'La sรฉlection de dossier nโ€™est pas disponible sur cet appareil', 'settings.downloadOnWifiOnly' => 'Tรฉlรฉcharger uniquement via WiFi', 'settings.downloadOnWifiOnlyDescription' => 'Empรชcher les tรฉlรฉchargements lorsque vous utilisez les donnรฉes cellulaires', 'settings.autoRemoveWatchedDownloads' => 'Supprimer automatiquement les tรฉlรฉchargements vus', @@ -2554,10 +2564,15 @@ extension on TranslationsFr { 'accessibility.hexColor' => 'Couleur hexadรฉcimale', 'accessibility.expandText' => 'Dรฉvelopper le texte', 'accessibility.collapseText' => 'Replier le texte', + 'accessibility.alphabetNavigation' => 'Navigation alphabรฉtique', + 'accessibility.alphabetScrollHint' => 'Balayez vers le haut ou le bas pour changer de lettre', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Ligne ${row} sur ${rowCount}, colonne ${column} sur ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Ligne ${row} sur ${rowCount}', 'tooltips.shufflePlay' => 'Lecture alรฉatoire', 'tooltips.playTrailer' => 'Lire la bande-annonce', 'tooltips.markAsWatched' => 'Marquรฉ comme vu', 'tooltips.markAsUnwatched' => 'Marquรฉ comme non vu', + 'audioTracks.track' => ({required Object n}) => 'Piste audio ${n}', 'videoControls.audioLabel' => 'Audio', 'videoControls.subtitlesLabel' => 'Sous-titres', 'videoControls.resetToZero' => 'Rรฉinitialiser ร  0ms', @@ -2644,20 +2659,20 @@ extension on TranslationsFr { 'messages.markedAsUnwatched' => 'Marquรฉ comme non vu', 'messages.markedAsWatchedOffline' => 'Marquรฉ comme vu (se synchronisera lorsque vous serez en ligne)', 'messages.markedAsUnwatchedOffline' => 'Marquรฉ comme non vu (sera synchronisรฉ lorsque vous serez en ligne)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Supprimรฉ automatiquement : ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))(n, one: '${n} tรฉlรฉchargement vu supprimรฉ automatiquement', other: '${n} tรฉlรฉchargements vus supprimรฉs automatiquement', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Supprimรฉ automatiquement : ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))(n, one: '${n} tรฉlรฉchargement vu supprimรฉ automatiquement', other: '${n} tรฉlรฉchargements vus supprimรฉs automatiquement', ), 'messages.removedFromContinueWatching' => 'Supprimer de "Continuer ร  regarder"', 'messages.errorLoading' => ({required Object error}) => 'Erreur: ${error}', 'messages.streamInterrupted' => 'La lecture a รฉtรฉ interrompue. Appuyez sur Lecture ou avancez pour rรฉessayer.', 'messages.liveStreamInterrupted' => 'Le direct a รฉtรฉ interrompu. Appuyez sur Lecture pour rรฉessayer.', 'messages.fileInfoNotAvailable' => 'Informations sur le fichier non disponibles', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'Erreur lors du chargement des informations sur le fichier: ${error}', 'messages.errorLoadingSeries' => 'Erreur lors du chargement de la sรฉrie', 'messages.musicNotSupported' => 'La lecture de musique n\'est pas encore prise en charge', @@ -2772,6 +2787,7 @@ extension on TranslationsFr { 'profiles.borrowExplain' => 'Emprunter la connexion d\'un autre profil. Les profils protรฉgรฉs par PIN exigent un PIN.', 'profiles.borrowEmpty' => 'Rien ร  emprunter pour le moment.', 'profiles.borrowEmptySubtitle' => 'Connectez d\'abord Plex ou Jellyfin ร  un autre profil.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'De ${displayName}', 'profiles.borrowConnectionBorrowed' => 'Connexion empruntรฉe.', 'profiles.borrowFailed' => 'Impossible d\'emprunter la connexion.', @@ -2997,7 +3013,7 @@ extension on TranslationsFr { 'liveTv.favorites' => 'Favoris', 'liveTv.reorderFavorites' => 'Rรฉorganiser les favoris', 'liveTv.favoritesLoadFailed' => 'Impossible de charger les favoris. Vรฉrifiez votre connexion et rรฉessayez.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'Rejoindre la session en cours', 'liveTv.watchFromStart' => ({required Object minutes}) => 'Regarder depuis le dรฉbut (il y a ${minutes} min)', 'liveTv.watchLive' => 'Regarder en direct', @@ -3157,11 +3173,11 @@ extension on TranslationsFr { 'watchTogether.participantLeft' => ({required Object name}) => '${name} est parti', 'watchTogether.participantPaused' => ({required Object name}) => '${name} a mis en pause', 'watchTogether.participantResumed' => ({required Object name}) => '${name} a repris', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} a avancรฉ', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} met en mรฉmoire tampon', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} utilise une ancienne version de lโ€™app โ€” synchronisation indisponible', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'Reprise sans ${name}', 'watchTogether.waitingForParticipants' => 'En attente du chargement des autres...', 'watchTogether.waitingForName' => ({required Object name}) => 'En attente de ${name}...', diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index f6cbcd27..78ed25fe 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -52,6 +52,7 @@ class TranslationsIt extends Translations with BaseTranslations 'In attesa di approvazioneโ€ฆ'; @override String get quickConnectCancel => 'Annulla'; @override String get quickConnectExpired => 'Quick Connect scaduto. Riprova.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsIt extends TranslationsSettingsEn { @override String get libraryDensity => 'Densitร  libreria'; @override String get compact => 'Compatta'; @override String get comfortable => 'Comoda'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => 'Modalitร  di visualizzazione'; @override String get gridView => 'Griglia'; @override String get listView => 'Elenco'; @@ -311,7 +310,7 @@ class _TranslationsSettingsIt extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'Relay Guarda Insieme'; @override String get watchTogetherRelayDescription => 'Imposta un relay personalizzato. Tutti devono usare lo stesso server.'; @override String get watchTogetherRelayHint => 'https://mio-relay.esempio.it'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'Segnalazione errori'; @override String get crashReportingDescription => 'Invia segnalazioni di errori per migliorare l\'app'; @override String get debugLogging => 'Log di debug'; @@ -328,12 +327,10 @@ class _TranslationsSettingsIt extends TranslationsSettingsEn { @override String get exportSettings => 'Esporta impostazioni'; @override String get exportSettingsDescription => 'Salva le tue preferenze in un file'; @override String get exportSettingsSuccess => 'Impostazioni esportate'; - @override String get exportSettingsFailed => 'Impossibile esportare le impostazioni'; @override String get importSettings => 'Importa impostazioni'; @override String get importSettingsDescription => 'Ripristina le preferenze da un file'; @override String get importSettingsConfirm => 'Questa azione sostituirร  le impostazioni attuali. Continuare?'; @override String get importSettingsSuccess => 'Impostazioni importate'; - @override String get importSettingsFailed => 'Impossibile importare le impostazioni'; @override String get importSettingsInvalidFile => 'Questo file non รจ un\'esportazione Plezy valida'; @override String get importSettingsNoUser => 'Accedi prima di importare le impostazioni'; @override String get shortcutsReset => 'Scorciatoie ripristinate alle impostazioni predefinite'; @@ -348,6 +345,7 @@ class _TranslationsSettingsIt extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'la durata deve essere compresa tra ${min} e ${max} ${unit}'; @override String shortcutAlreadyAssigned({required Object action}) => 'Scorciatoia giร  assegnata a ${action}'; @override String shortcutUpdated({required Object action}) => 'Scorciatoia aggiornata per ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'Salto Automatico'; @override String get autoSkipIntro => 'Salta Intro Automaticamente'; @override String get autoSkipIntroDescription => 'Salta automaticamente i marcatori dell\'intro dopo alcuni secondi'; @@ -373,7 +371,7 @@ class _TranslationsSettingsIt extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'Posizione di download modificata'; @override String get downloadLocationReset => 'Posizione di download ripristinata a predefinita'; @override String get downloadLocationInvalid => 'La cartella selezionata non รจ scrivibile'; - @override String get downloadLocationSelectError => 'Impossibile selezionare la cartella'; + @override String get downloadLocationPickerUnavailable => 'La selezione della cartella non รจ disponibile su questo dispositivo'; @override String get downloadOnWifiOnly => 'Scarica solo con WiFi'; @override String get downloadOnWifiOnlyDescription => 'Impedisci i download quando si utilizza la rete dati cellulare'; @override String get autoRemoveWatchedDownloads => 'Rimuovi automaticamente i download visti'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityIt extends TranslationsAccessibilityEn { @override String get hexColor => 'Colore esadecimale'; @override String get expandText => 'Espandi il testo'; @override String get collapseText => 'Comprimi il testo'; + @override String get alphabetNavigation => 'Navigazione alfabetica'; + @override String get alphabetScrollHint => 'Scorri verso l\'alto o il basso per cambiare lettera'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Riga ${row} di ${rowCount}, colonna ${column} di ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'Riga ${row} di ${rowCount}'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsIt extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'Segna come non visto'; } +// Path: audioTracks +class _TranslationsAudioTracksIt extends TranslationsAudioTracksEn { + _TranslationsAudioTracksIt._(TranslationsIt root) : this._root = root, super.internal(root); + + final TranslationsIt _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'Traccia audio ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsIt extends TranslationsVideoControlsEn { _TranslationsVideoControlsIt._(TranslationsIt root) : this._root = root, super.internal(root); @@ -712,11 +724,11 @@ class _TranslationsMessagesIt extends TranslationsMessagesEn { @override String get streamInterrupted => 'La riproduzione si รจ interrotta. Premi Riproduci o scorri per riprovare.'; @override String get liveStreamInterrupted => 'La diretta si รจ interrotta. Premi Riproduci per riprovare.'; @override String get fileInfoNotAvailable => 'Informazioni sul file non disponibili'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'Errore caricamento informazioni sul file: ${error}'; @override String get errorLoadingSeries => 'Errore caricamento serie'; @override String get musicNotSupported => 'La riproduzione musicale non รจ ancora supportata'; @@ -867,6 +879,7 @@ class _TranslationsProfilesIt extends TranslationsProfilesEn { @override String get borrowExplain => 'Prendi in prestito la connessione di un altro profilo. I profili protetti da PIN richiedono un PIN.'; @override String get borrowEmpty => 'Nulla da prendere in prestito al momento.'; @override String get borrowEmptySubtitle => 'Collega prima Plex o Jellyfin a un altro profilo.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'Da ${displayName}'; @override String get borrowConnectionBorrowed => 'Connessione presa in prestito.'; @override String get borrowFailed => 'Impossibile prendere in prestito la connessione.'; @@ -1150,7 +1163,7 @@ class _TranslationsLiveTvIt extends TranslationsLiveTvEn { @override String get favorites => 'Preferiti'; @override String get reorderFavorites => 'Riordina preferiti'; @override String get favoritesLoadFailed => 'Impossibile caricare i preferiti. Controlla la connessione e riprova.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'Partecipa alla sessione in corso'; @override String watchFromStart({required Object minutes}) => 'Guarda dall\'inizio (${minutes} min fa)'; @override String get watchLive => 'Guarda in diretta'; @@ -2149,7 +2162,7 @@ extension on TranslationsIt { 'auth.quickConnectWaiting' => 'In attesa di approvazioneโ€ฆ', 'auth.quickConnectCancel' => 'Annulla', 'auth.quickConnectExpired' => 'Quick Connect scaduto. Riprova.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'Cancella', 'common.save' => 'Salva', 'common.close' => 'Chiudi', @@ -2233,8 +2246,6 @@ extension on TranslationsIt { 'settings.libraryDensity' => 'Densitร  libreria', 'settings.compact' => 'Compatta', 'settings.comfortable' => 'Comoda', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => 'Modalitร  di visualizzazione', 'settings.gridView' => 'Griglia', 'settings.listView' => 'Elenco', @@ -2304,7 +2315,7 @@ extension on TranslationsIt { 'settings.watchTogetherRelay' => 'Relay Guarda Insieme', 'settings.watchTogetherRelayDescription' => 'Imposta un relay personalizzato. Tutti devono usare lo stesso server.', 'settings.watchTogetherRelayHint' => 'https://mio-relay.esempio.it', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'Segnalazione errori', 'settings.crashReportingDescription' => 'Invia segnalazioni di errori per migliorare l\'app', 'settings.debugLogging' => 'Log di debug', @@ -2321,12 +2332,10 @@ extension on TranslationsIt { 'settings.exportSettings' => 'Esporta impostazioni', 'settings.exportSettingsDescription' => 'Salva le tue preferenze in un file', 'settings.exportSettingsSuccess' => 'Impostazioni esportate', - 'settings.exportSettingsFailed' => 'Impossibile esportare le impostazioni', 'settings.importSettings' => 'Importa impostazioni', 'settings.importSettingsDescription' => 'Ripristina le preferenze da un file', 'settings.importSettingsConfirm' => 'Questa azione sostituirร  le impostazioni attuali. Continuare?', 'settings.importSettingsSuccess' => 'Impostazioni importate', - 'settings.importSettingsFailed' => 'Impossibile importare le impostazioni', 'settings.importSettingsInvalidFile' => 'Questo file non รจ un\'esportazione Plezy valida', 'settings.importSettingsNoUser' => 'Accedi prima di importare le impostazioni', 'settings.shortcutsReset' => 'Scorciatoie ripristinate alle impostazioni predefinite', @@ -2341,6 +2350,7 @@ extension on TranslationsIt { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'la durata deve essere compresa tra ${min} e ${max} ${unit}', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'Scorciatoia giร  assegnata a ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'Scorciatoia aggiornata per ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'Salto Automatico', 'settings.autoSkipIntro' => 'Salta Intro Automaticamente', 'settings.autoSkipIntroDescription' => 'Salta automaticamente i marcatori dell\'intro dopo alcuni secondi', @@ -2366,7 +2376,7 @@ extension on TranslationsIt { 'settings.downloadLocationChanged' => 'Posizione di download modificata', 'settings.downloadLocationReset' => 'Posizione di download ripristinata a predefinita', 'settings.downloadLocationInvalid' => 'La cartella selezionata non รจ scrivibile', - 'settings.downloadLocationSelectError' => 'Impossibile selezionare la cartella', + 'settings.downloadLocationPickerUnavailable' => 'La selezione della cartella non รจ disponibile su questo dispositivo', 'settings.downloadOnWifiOnly' => 'Scarica solo con WiFi', 'settings.downloadOnWifiOnlyDescription' => 'Impedisci i download quando si utilizza la rete dati cellulare', 'settings.autoRemoveWatchedDownloads' => 'Rimuovi automaticamente i download visti', @@ -2554,10 +2564,15 @@ extension on TranslationsIt { 'accessibility.hexColor' => 'Colore esadecimale', 'accessibility.expandText' => 'Espandi il testo', 'accessibility.collapseText' => 'Comprimi il testo', + 'accessibility.alphabetNavigation' => 'Navigazione alfabetica', + 'accessibility.alphabetScrollHint' => 'Scorri verso l\'alto o il basso per cambiare lettera', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Riga ${row} di ${rowCount}, colonna ${column} di ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Riga ${row} di ${rowCount}', 'tooltips.shufflePlay' => 'Riproduzione casuale', 'tooltips.playTrailer' => 'Riproduci trailer', 'tooltips.markAsWatched' => 'Segna come visto', 'tooltips.markAsUnwatched' => 'Segna come non visto', + 'audioTracks.track' => ({required Object n}) => 'Traccia audio ${n}', 'videoControls.audioLabel' => 'Audio', 'videoControls.subtitlesLabel' => 'Sottotitoli', 'videoControls.resetToZero' => 'Riporta a 0ms', @@ -2644,20 +2659,20 @@ extension on TranslationsIt { 'messages.markedAsUnwatched' => 'Segna come non visto', 'messages.markedAsWatchedOffline' => 'Segnato come visto (sincronizzato online)', 'messages.markedAsUnwatchedOffline' => 'Segnato come non visto (sincronizzato online)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Rimosso automaticamente: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('it'))(n, one: 'Rimosso automaticamente ${n} download giร  visto', other: 'Rimossi automaticamente ${n} download giร  visti', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Rimosso automaticamente: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('it'))(n, one: 'Rimosso automaticamente ${n} download giร  visto', other: 'Rimossi automaticamente ${n} download giร  visti', ), 'messages.removedFromContinueWatching' => 'Rimosso da Continua a guardare', 'messages.errorLoading' => ({required Object error}) => 'Errore: ${error}', 'messages.streamInterrupted' => 'La riproduzione si รจ interrotta. Premi Riproduci o scorri per riprovare.', 'messages.liveStreamInterrupted' => 'La diretta si รจ interrotta. Premi Riproduci per riprovare.', 'messages.fileInfoNotAvailable' => 'Informazioni sul file non disponibili', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'Errore caricamento informazioni sul file: ${error}', 'messages.errorLoadingSeries' => 'Errore caricamento serie', 'messages.musicNotSupported' => 'La riproduzione musicale non รจ ancora supportata', @@ -2772,6 +2787,7 @@ extension on TranslationsIt { 'profiles.borrowExplain' => 'Prendi in prestito la connessione di un altro profilo. I profili protetti da PIN richiedono un PIN.', 'profiles.borrowEmpty' => 'Nulla da prendere in prestito al momento.', 'profiles.borrowEmptySubtitle' => 'Collega prima Plex o Jellyfin a un altro profilo.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'Da ${displayName}', 'profiles.borrowConnectionBorrowed' => 'Connessione presa in prestito.', 'profiles.borrowFailed' => 'Impossibile prendere in prestito la connessione.', @@ -2997,7 +3013,7 @@ extension on TranslationsIt { 'liveTv.favorites' => 'Preferiti', 'liveTv.reorderFavorites' => 'Riordina preferiti', 'liveTv.favoritesLoadFailed' => 'Impossibile caricare i preferiti. Controlla la connessione e riprova.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'Partecipa alla sessione in corso', 'liveTv.watchFromStart' => ({required Object minutes}) => 'Guarda dall\'inizio (${minutes} min fa)', 'liveTv.watchLive' => 'Guarda in diretta', @@ -3157,11 +3173,11 @@ extension on TranslationsIt { 'watchTogether.participantLeft' => ({required Object name}) => '${name} se ne รจ andato', 'watchTogether.participantPaused' => ({required Object name}) => '${name} ha messo in pausa', 'watchTogether.participantResumed' => ({required Object name}) => '${name} ha ripreso', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} ha cercato', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} sta caricando', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} usa una versione precedente dell\'app โ€” sincronizzazione non disponibile', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'Ripresa senza ${name}', 'watchTogether.waitingForParticipants' => 'In attesa che gli altri carichino...', 'watchTogether.waitingForName' => ({required Object name}) => 'In attesa di ${name}...', diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index b48ce00e..58985922 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -52,6 +52,7 @@ class TranslationsJa extends Translations with BaseTranslations 'ๆ‰ฟ่ชใ‚’ๅพ…ใฃใฆใ„ใพใ™โ€ฆ'; @override String get quickConnectCancel => 'ใ‚ญใƒฃใƒณใ‚ปใƒซ'; @override String get quickConnectExpired => 'Quick Connectใฎๆœ‰ๅŠนๆœŸ้™ใŒๅˆ‡ใ‚Œใพใ—ใŸใ€‚ใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„ใ€‚'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsJa extends TranslationsSettingsEn { @override String get libraryDensity => 'ใƒฉใ‚คใƒ–ใƒฉใƒชใฎๅฏ†ๅบฆ'; @override String get compact => 'ใ‚ณใƒณใƒ‘ใ‚ฏใƒˆ'; @override String get comfortable => 'ใ‚†ใฃใŸใ‚Š'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => '่กจ็คบใƒขใƒผใƒ‰'; @override String get gridView => 'ใ‚ฐใƒชใƒƒใƒ‰'; @override String get listView => 'ใƒชใ‚นใƒˆ'; @@ -311,7 +310,7 @@ class _TranslationsSettingsJa extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'ไธ€็ท’ใซ่ฆ–่ดใƒชใƒฌใƒผใ‚ตใƒผใƒใƒผ'; @override String get watchTogetherRelayDescription => 'ใ‚ซใ‚นใ‚ฟใƒ ใƒชใƒฌใƒผใ‚’่จญๅฎšใ—ใพใ™ใ€‚ๅ…จๅ“กใŒๅŒใ˜ใ‚ตใƒผใƒใƒผใ‚’ไฝฟใ†ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚'; @override String get watchTogetherRelayHint => 'https://my-relay.example.com'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'ใ‚ฏใƒฉใƒƒใ‚ทใƒฅใƒฌใƒใƒผใƒˆ'; @override String get crashReportingDescription => 'ใ‚ขใƒ—ใƒชใฎๆ”นๅ–„ใซๅฝน็ซ‹ใคใ‚ฏใƒฉใƒƒใ‚ทใƒฅใƒฌใƒใƒผใƒˆใ‚’้€ไฟก'; @override String get debugLogging => 'ใƒ‡ใƒใƒƒใ‚ฐใƒญใ‚ฐ'; @@ -328,12 +327,10 @@ class _TranslationsSettingsJa extends TranslationsSettingsEn { @override String get exportSettings => '่จญๅฎšใ‚’ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆ'; @override String get exportSettingsDescription => '่จญๅฎšใ‚’ใƒ•ใ‚กใ‚คใƒซใซไฟๅญ˜'; @override String get exportSettingsSuccess => '่จญๅฎšใ‚’ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใ—ใพใ—ใŸ'; - @override String get exportSettingsFailed => '่จญๅฎšใ‚’ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใงใใพใ›ใ‚“ใงใ—ใŸ'; @override String get importSettings => '่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆ'; @override String get importSettingsDescription => 'ใƒ•ใ‚กใ‚คใƒซใ‹ใ‚‰่จญๅฎšใ‚’ๅพฉๅ…ƒ'; @override String get importSettingsConfirm => '็พๅœจใฎ่จญๅฎšใ‚’็ฝฎใๆ›ใˆใพใ™ใ€‚็ถš่กŒใ—ใพใ™ใ‹๏ผŸ'; @override String get importSettingsSuccess => '่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆใ—ใพใ—ใŸ'; - @override String get importSettingsFailed => '่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆใงใใพใ›ใ‚“ใงใ—ใŸ'; @override String get importSettingsInvalidFile => 'ใ“ใฎใƒ•ใ‚กใ‚คใƒซใฏๆœ‰ๅŠนใชPlezyใฎ่จญๅฎšใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใงใฏใ‚ใ‚Šใพใ›ใ‚“'; @override String get importSettingsNoUser => '่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆใ™ใ‚‹ๅ‰ใซใ‚ตใ‚คใƒณใ‚คใƒณใ—ใฆใใ ใ•ใ„'; @override String get shortcutsReset => 'ใ‚ทใƒงใƒผใƒˆใ‚ซใƒƒใƒˆใ‚’ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใซใƒชใ‚ปใƒƒใƒˆใ—ใพใ—ใŸ'; @@ -348,6 +345,7 @@ class _TranslationsSettingsJa extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'ๆ™‚้–“ใฏ${min}ใ‹ใ‚‰${max} ${unit}ใฎ้–“ใงใ‚ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™'; @override String shortcutAlreadyAssigned({required Object action}) => 'ใ‚ทใƒงใƒผใƒˆใ‚ซใƒƒใƒˆใฏๆ—ขใซ${action}ใซๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใฆใ„ใพใ™'; @override String shortcutUpdated({required Object action}) => '${action}ใฎใ‚ทใƒงใƒผใƒˆใ‚ซใƒƒใƒˆใ‚’ๆ›ดๆ–ฐใ—ใพใ—ใŸ'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => '่‡ชๅ‹•ใ‚นใ‚ญใƒƒใƒ—'; @override String get autoSkipIntro => 'ใ‚คใƒณใƒˆใƒญใ‚’่‡ชๅ‹•ใ‚นใ‚ญใƒƒใƒ—'; @override String get autoSkipIntroDescription => 'ๆ•ฐ็ง’ๅพŒใซใ‚คใƒณใƒˆใƒญใƒžใƒผใ‚ซใƒผใ‚’่‡ชๅ‹•็š„ใซใ‚นใ‚ญใƒƒใƒ—'; @@ -373,7 +371,7 @@ class _TranslationsSettingsJa extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ๅ ดๆ‰€ใ‚’ๅค‰ๆ›ดใ—ใพใ—ใŸ'; @override String get downloadLocationReset => 'ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ๅ ดๆ‰€ใ‚’ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใซใƒชใ‚ปใƒƒใƒˆใ—ใพใ—ใŸ'; @override String get downloadLocationInvalid => '้ธๆŠžใ—ใŸใƒ•ใ‚ฉใƒซใƒ€ใฏๆ›ธใ่พผใฟใงใใพใ›ใ‚“'; - @override String get downloadLocationSelectError => 'ใƒ•ใ‚ฉใƒซใƒ€ใฎ้ธๆŠžใซๅคฑๆ•—ใ—ใพใ—ใŸ'; + @override String get downloadLocationPickerUnavailable => 'ใ“ใฎใƒ‡ใƒใ‚คใ‚นใงใฏใƒ•ใ‚ฉใƒซใƒ€ใ‚’้ธๆŠžใงใใพใ›ใ‚“'; @override String get downloadOnWifiOnly => 'WiFiใฎใฟใงใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰'; @override String get downloadOnWifiOnlyDescription => 'ใƒขใƒใ‚คใƒซใƒ‡ใƒผใ‚ฟ้€šไฟกๆ™‚ใฎใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใ‚’้˜ฒๆญข'; @override String get autoRemoveWatchedDownloads => '่ฆ–่ดๆธˆใฟใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใฎ่‡ชๅ‹•ๅ‰Š้™ค'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityJa extends TranslationsAccessibilityEn { @override String get hexColor => '16้€ฒใ‚ซใƒฉใƒผ'; @override String get expandText => 'ใƒ†ใ‚ญใ‚นใƒˆใ‚’ๅฑ•้–‹'; @override String get collapseText => 'ใƒ†ใ‚ญใ‚นใƒˆใ‚’ๆŠ˜ใ‚ŠใŸใŸใ‚€'; + @override String get alphabetNavigation => 'ใ‚ขใƒซใƒ•ใ‚กใƒ™ใƒƒใƒˆใƒŠใƒ“ใ‚ฒใƒผใ‚ทใƒงใƒณ'; + @override String get alphabetScrollHint => 'ไธŠไธ‹ใซใ‚นใƒฏใ‚คใƒ—ใ—ใฆๆ–‡ๅญ—ใ”ใจใซ็งปๅ‹•'; + @override String rowColumnPosition({required Object rowCount, required Object row, required Object columnCount, required Object column}) => '${rowCount}่กŒไธญ${row}่กŒใ€${columnCount}ๅˆ—ไธญ${column}ๅˆ—'; + @override String rowPosition({required Object rowCount, required Object row}) => '${rowCount}่กŒไธญ${row}่กŒ'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsJa extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'ๆœช่ฆ–่ดใซใ™ใ‚‹'; } +// Path: audioTracks +class _TranslationsAudioTracksJa extends TranslationsAudioTracksEn { + _TranslationsAudioTracksJa._(TranslationsJa root) : this._root = root, super.internal(root); + + final TranslationsJa _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => '้Ÿณๅฃฐใƒˆใƒฉใƒƒใ‚ฏ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsJa extends TranslationsVideoControlsEn { _TranslationsVideoControlsJa._(TranslationsJa root) : this._root = root, super.internal(root); @@ -711,11 +723,11 @@ class _TranslationsMessagesJa extends TranslationsMessagesEn { @override String get streamInterrupted => 'ใ‚นใƒˆใƒชใƒผใƒ ใŒไธญๆ–ญใ•ใ‚Œใพใ—ใŸใ€‚ๅ†็”Ÿใ‚’ๆŠผใ™ใ‹ใ‚ทใƒผใ‚ฏใ—ใฆๅ†่ฉฆ่กŒใ—ใฆใใ ใ•ใ„ใ€‚'; @override String get liveStreamInterrupted => 'ใƒฉใ‚คใƒ–ใ‚นใƒˆใƒชใƒผใƒ ใŒไธญๆ–ญใ•ใ‚Œใพใ—ใŸใ€‚ๅ†็”Ÿใ‚’ๆŠผใ—ใฆๅ†่ฉฆ่กŒใ—ใฆใใ ใ•ใ„ใ€‚'; @override String get fileInfoNotAvailable => 'ใƒ•ใ‚กใ‚คใƒซๆƒ…ๅ ฑใŒๅˆฉ็”จใงใใพใ›ใ‚“'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'ใƒ•ใ‚กใ‚คใƒซๆƒ…ๅ ฑใฎ่ชญใฟ่พผใฟใ‚จใƒฉใƒผ: ${error}'; @override String get errorLoadingSeries => 'ใ‚ทใƒชใƒผใ‚บใฎ่ชญใฟ่พผใฟใ‚จใƒฉใƒผ'; @override String get musicNotSupported => '้Ÿณๆฅฝใฎๅ†็”Ÿใฏใพใ ใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“'; @@ -866,6 +878,7 @@ class _TranslationsProfilesJa extends TranslationsProfilesEn { @override String get borrowExplain => 'ๅˆฅใฎใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใฎๆŽฅ็ถšใ‚’ๅ€Ÿ็”จใ—ใพใ™ใ€‚PINไฟ่ญทใ•ใ‚ŒใŸใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใซใฏPINใŒๅฟ…่ฆใงใ™ใ€‚'; @override String get borrowEmpty => 'ใพใ ๅ€Ÿใ‚Šใ‚‹ใ‚‚ใฎใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚'; @override String get borrowEmptySubtitle => 'ใพใšๅˆฅใฎใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใซPlexใพใŸใฏJellyfinใ‚’ๆŽฅ็ถšใ—ใฆใใ ใ•ใ„ใ€‚'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => '${displayName}ใ‹ใ‚‰'; @override String get borrowConnectionBorrowed => 'ๆŽฅ็ถšใ‚’ๅ€Ÿ็”จใ—ใพใ—ใŸใ€‚'; @override String get borrowFailed => 'ๆŽฅ็ถšใ‚’ๅ€Ÿ็”จใงใใพใ›ใ‚“ใงใ—ใŸใ€‚'; @@ -1148,7 +1161,7 @@ class _TranslationsLiveTvJa extends TranslationsLiveTvEn { @override String get favorites => 'ใŠๆฐ—ใซๅ…ฅใ‚Š'; @override String get reorderFavorites => 'ใŠๆฐ—ใซๅ…ฅใ‚Šใ‚’ไธฆในๆ›ฟใˆ'; @override String get favoritesLoadFailed => 'ใŠๆฐ—ใซๅ…ฅใ‚Šใ‚’่ชญใฟ่พผใ‚ใพใ›ใ‚“ใงใ—ใŸใ€‚ๆŽฅ็ถšใ‚’็ขบ่ชใ—ใฆใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„ใ€‚'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => '้€ฒ่กŒไธญใฎใ‚ปใƒƒใ‚ทใƒงใƒณใซๅ‚ๅŠ '; @override String watchFromStart({required Object minutes}) => 'ๆœ€ๅˆใ‹ใ‚‰่ฆ–่ด๏ผˆ${minutes}ๅˆ†ๅ‰ใซ้–‹ๅง‹๏ผ‰'; @override String get watchLive => 'ใƒฉใ‚คใƒ–ใง่ฆ–่ด'; @@ -2146,7 +2159,7 @@ extension on TranslationsJa { 'auth.quickConnectWaiting' => 'ๆ‰ฟ่ชใ‚’ๅพ…ใฃใฆใ„ใพใ™โ€ฆ', 'auth.quickConnectCancel' => 'ใ‚ญใƒฃใƒณใ‚ปใƒซ', 'auth.quickConnectExpired' => 'Quick Connectใฎๆœ‰ๅŠนๆœŸ้™ใŒๅˆ‡ใ‚Œใพใ—ใŸใ€‚ใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„ใ€‚', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'ใ‚ญใƒฃใƒณใ‚ปใƒซ', 'common.save' => 'ไฟๅญ˜', 'common.close' => '้–‰ใ˜ใ‚‹', @@ -2230,8 +2243,6 @@ extension on TranslationsJa { 'settings.libraryDensity' => 'ใƒฉใ‚คใƒ–ใƒฉใƒชใฎๅฏ†ๅบฆ', 'settings.compact' => 'ใ‚ณใƒณใƒ‘ใ‚ฏใƒˆ', 'settings.comfortable' => 'ใ‚†ใฃใŸใ‚Š', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => '่กจ็คบใƒขใƒผใƒ‰', 'settings.gridView' => 'ใ‚ฐใƒชใƒƒใƒ‰', 'settings.listView' => 'ใƒชใ‚นใƒˆ', @@ -2301,7 +2312,7 @@ extension on TranslationsJa { 'settings.watchTogetherRelay' => 'ไธ€็ท’ใซ่ฆ–่ดใƒชใƒฌใƒผใ‚ตใƒผใƒใƒผ', 'settings.watchTogetherRelayDescription' => 'ใ‚ซใ‚นใ‚ฟใƒ ใƒชใƒฌใƒผใ‚’่จญๅฎšใ—ใพใ™ใ€‚ๅ…จๅ“กใŒๅŒใ˜ใ‚ตใƒผใƒใƒผใ‚’ไฝฟใ†ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚', 'settings.watchTogetherRelayHint' => 'https://my-relay.example.com', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'ใ‚ฏใƒฉใƒƒใ‚ทใƒฅใƒฌใƒใƒผใƒˆ', 'settings.crashReportingDescription' => 'ใ‚ขใƒ—ใƒชใฎๆ”นๅ–„ใซๅฝน็ซ‹ใคใ‚ฏใƒฉใƒƒใ‚ทใƒฅใƒฌใƒใƒผใƒˆใ‚’้€ไฟก', 'settings.debugLogging' => 'ใƒ‡ใƒใƒƒใ‚ฐใƒญใ‚ฐ', @@ -2318,12 +2329,10 @@ extension on TranslationsJa { 'settings.exportSettings' => '่จญๅฎšใ‚’ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆ', 'settings.exportSettingsDescription' => '่จญๅฎšใ‚’ใƒ•ใ‚กใ‚คใƒซใซไฟๅญ˜', 'settings.exportSettingsSuccess' => '่จญๅฎšใ‚’ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใ—ใพใ—ใŸ', - 'settings.exportSettingsFailed' => '่จญๅฎšใ‚’ใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใงใใพใ›ใ‚“ใงใ—ใŸ', 'settings.importSettings' => '่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆ', 'settings.importSettingsDescription' => 'ใƒ•ใ‚กใ‚คใƒซใ‹ใ‚‰่จญๅฎšใ‚’ๅพฉๅ…ƒ', 'settings.importSettingsConfirm' => '็พๅœจใฎ่จญๅฎšใ‚’็ฝฎใๆ›ใˆใพใ™ใ€‚็ถš่กŒใ—ใพใ™ใ‹๏ผŸ', 'settings.importSettingsSuccess' => '่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆใ—ใพใ—ใŸ', - 'settings.importSettingsFailed' => '่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆใงใใพใ›ใ‚“ใงใ—ใŸ', 'settings.importSettingsInvalidFile' => 'ใ“ใฎใƒ•ใ‚กใ‚คใƒซใฏๆœ‰ๅŠนใชPlezyใฎ่จญๅฎšใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใงใฏใ‚ใ‚Šใพใ›ใ‚“', 'settings.importSettingsNoUser' => '่จญๅฎšใ‚’ใ‚คใƒณใƒใƒผใƒˆใ™ใ‚‹ๅ‰ใซใ‚ตใ‚คใƒณใ‚คใƒณใ—ใฆใใ ใ•ใ„', 'settings.shortcutsReset' => 'ใ‚ทใƒงใƒผใƒˆใ‚ซใƒƒใƒˆใ‚’ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใซใƒชใ‚ปใƒƒใƒˆใ—ใพใ—ใŸ', @@ -2338,6 +2347,7 @@ extension on TranslationsJa { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'ๆ™‚้–“ใฏ${min}ใ‹ใ‚‰${max} ${unit}ใฎ้–“ใงใ‚ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'ใ‚ทใƒงใƒผใƒˆใ‚ซใƒƒใƒˆใฏๆ—ขใซ${action}ใซๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใฆใ„ใพใ™', 'settings.shortcutUpdated' => ({required Object action}) => '${action}ใฎใ‚ทใƒงใƒผใƒˆใ‚ซใƒƒใƒˆใ‚’ๆ›ดๆ–ฐใ—ใพใ—ใŸ', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => '่‡ชๅ‹•ใ‚นใ‚ญใƒƒใƒ—', 'settings.autoSkipIntro' => 'ใ‚คใƒณใƒˆใƒญใ‚’่‡ชๅ‹•ใ‚นใ‚ญใƒƒใƒ—', 'settings.autoSkipIntroDescription' => 'ๆ•ฐ็ง’ๅพŒใซใ‚คใƒณใƒˆใƒญใƒžใƒผใ‚ซใƒผใ‚’่‡ชๅ‹•็š„ใซใ‚นใ‚ญใƒƒใƒ—', @@ -2363,7 +2373,7 @@ extension on TranslationsJa { 'settings.downloadLocationChanged' => 'ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ๅ ดๆ‰€ใ‚’ๅค‰ๆ›ดใ—ใพใ—ใŸ', 'settings.downloadLocationReset' => 'ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ๅ ดๆ‰€ใ‚’ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใซใƒชใ‚ปใƒƒใƒˆใ—ใพใ—ใŸ', 'settings.downloadLocationInvalid' => '้ธๆŠžใ—ใŸใƒ•ใ‚ฉใƒซใƒ€ใฏๆ›ธใ่พผใฟใงใใพใ›ใ‚“', - 'settings.downloadLocationSelectError' => 'ใƒ•ใ‚ฉใƒซใƒ€ใฎ้ธๆŠžใซๅคฑๆ•—ใ—ใพใ—ใŸ', + 'settings.downloadLocationPickerUnavailable' => 'ใ“ใฎใƒ‡ใƒใ‚คใ‚นใงใฏใƒ•ใ‚ฉใƒซใƒ€ใ‚’้ธๆŠžใงใใพใ›ใ‚“', 'settings.downloadOnWifiOnly' => 'WiFiใฎใฟใงใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰', 'settings.downloadOnWifiOnlyDescription' => 'ใƒขใƒใ‚คใƒซใƒ‡ใƒผใ‚ฟ้€šไฟกๆ™‚ใฎใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใ‚’้˜ฒๆญข', 'settings.autoRemoveWatchedDownloads' => '่ฆ–่ดๆธˆใฟใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใฎ่‡ชๅ‹•ๅ‰Š้™ค', @@ -2551,10 +2561,15 @@ extension on TranslationsJa { 'accessibility.hexColor' => '16้€ฒใ‚ซใƒฉใƒผ', 'accessibility.expandText' => 'ใƒ†ใ‚ญใ‚นใƒˆใ‚’ๅฑ•้–‹', 'accessibility.collapseText' => 'ใƒ†ใ‚ญใ‚นใƒˆใ‚’ๆŠ˜ใ‚ŠใŸใŸใ‚€', + 'accessibility.alphabetNavigation' => 'ใ‚ขใƒซใƒ•ใ‚กใƒ™ใƒƒใƒˆใƒŠใƒ“ใ‚ฒใƒผใ‚ทใƒงใƒณ', + 'accessibility.alphabetScrollHint' => 'ไธŠไธ‹ใซใ‚นใƒฏใ‚คใƒ—ใ—ใฆๆ–‡ๅญ—ใ”ใจใซ็งปๅ‹•', + 'accessibility.rowColumnPosition' => ({required Object rowCount, required Object row, required Object columnCount, required Object column}) => '${rowCount}่กŒไธญ${row}่กŒใ€${columnCount}ๅˆ—ไธญ${column}ๅˆ—', + 'accessibility.rowPosition' => ({required Object rowCount, required Object row}) => '${rowCount}่กŒไธญ${row}่กŒ', 'tooltips.shufflePlay' => 'ใ‚ทใƒฃใƒƒใƒ•ใƒซๅ†็”Ÿ', 'tooltips.playTrailer' => 'ไบˆๅ‘Š็ทจใ‚’ๅ†็”Ÿ', 'tooltips.markAsWatched' => '่ฆ–่ดๆธˆใฟใซใ™ใ‚‹', 'tooltips.markAsUnwatched' => 'ๆœช่ฆ–่ดใซใ™ใ‚‹', + 'audioTracks.track' => ({required Object n}) => '้Ÿณๅฃฐใƒˆใƒฉใƒƒใ‚ฏ${n}', 'videoControls.audioLabel' => '้Ÿณๅฃฐ', 'videoControls.subtitlesLabel' => 'ๅญ—ๅน•', 'videoControls.resetToZero' => '0msใซใƒชใ‚ปใƒƒใƒˆ', @@ -2641,20 +2656,20 @@ extension on TranslationsJa { 'messages.markedAsUnwatched' => 'ๆœช่ฆ–่ดใซใ—ใพใ—ใŸ', 'messages.markedAsWatchedOffline' => '่ฆ–่ดๆธˆใฟใซใ—ใพใ—ใŸ๏ผˆใ‚ชใƒณใƒฉใ‚คใƒณๆ™‚ใซๅŒๆœŸ๏ผ‰', 'messages.markedAsUnwatchedOffline' => 'ๆœช่ฆ–่ดใซใ—ใพใ—ใŸ๏ผˆใ‚ชใƒณใƒฉใ‚คใƒณๆ™‚ใซๅŒๆœŸ๏ผ‰', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => '่‡ชๅ‹•ๅ‰Š้™ค: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ja'))(n, other: '่ฆ–่ดๆธˆใฟใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใ‚’${n}ไปถ่‡ชๅ‹•ๅ‰Š้™คใ—ใพใ—ใŸ', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => '่‡ชๅ‹•ๅ‰Š้™ค: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ja'))(n, other: '่ฆ–่ดๆธˆใฟใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใ‚’${n}ไปถ่‡ชๅ‹•ๅ‰Š้™คใ—ใพใ—ใŸ', ), 'messages.removedFromContinueWatching' => '่ฆ–่ดไธญใ‹ใ‚‰ๅ‰Š้™คใ—ใพใ—ใŸ', 'messages.errorLoading' => ({required Object error}) => 'ใ‚จใƒฉใƒผ: ${error}', 'messages.streamInterrupted' => 'ใ‚นใƒˆใƒชใƒผใƒ ใŒไธญๆ–ญใ•ใ‚Œใพใ—ใŸใ€‚ๅ†็”Ÿใ‚’ๆŠผใ™ใ‹ใ‚ทใƒผใ‚ฏใ—ใฆๅ†่ฉฆ่กŒใ—ใฆใใ ใ•ใ„ใ€‚', 'messages.liveStreamInterrupted' => 'ใƒฉใ‚คใƒ–ใ‚นใƒˆใƒชใƒผใƒ ใŒไธญๆ–ญใ•ใ‚Œใพใ—ใŸใ€‚ๅ†็”Ÿใ‚’ๆŠผใ—ใฆๅ†่ฉฆ่กŒใ—ใฆใใ ใ•ใ„ใ€‚', 'messages.fileInfoNotAvailable' => 'ใƒ•ใ‚กใ‚คใƒซๆƒ…ๅ ฑใŒๅˆฉ็”จใงใใพใ›ใ‚“', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'ใƒ•ใ‚กใ‚คใƒซๆƒ…ๅ ฑใฎ่ชญใฟ่พผใฟใ‚จใƒฉใƒผ: ${error}', 'messages.errorLoadingSeries' => 'ใ‚ทใƒชใƒผใ‚บใฎ่ชญใฟ่พผใฟใ‚จใƒฉใƒผ', 'messages.musicNotSupported' => '้Ÿณๆฅฝใฎๅ†็”Ÿใฏใพใ ใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“', @@ -2769,6 +2784,7 @@ extension on TranslationsJa { 'profiles.borrowExplain' => 'ๅˆฅใฎใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใฎๆŽฅ็ถšใ‚’ๅ€Ÿ็”จใ—ใพใ™ใ€‚PINไฟ่ญทใ•ใ‚ŒใŸใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใซใฏPINใŒๅฟ…่ฆใงใ™ใ€‚', 'profiles.borrowEmpty' => 'ใพใ ๅ€Ÿใ‚Šใ‚‹ใ‚‚ใฎใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚', 'profiles.borrowEmptySubtitle' => 'ใพใšๅˆฅใฎใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใซPlexใพใŸใฏJellyfinใ‚’ๆŽฅ็ถšใ—ใฆใใ ใ•ใ„ใ€‚', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => '${displayName}ใ‹ใ‚‰', 'profiles.borrowConnectionBorrowed' => 'ๆŽฅ็ถšใ‚’ๅ€Ÿ็”จใ—ใพใ—ใŸใ€‚', 'profiles.borrowFailed' => 'ๆŽฅ็ถšใ‚’ๅ€Ÿ็”จใงใใพใ›ใ‚“ใงใ—ใŸใ€‚', @@ -2994,7 +3010,7 @@ extension on TranslationsJa { 'liveTv.favorites' => 'ใŠๆฐ—ใซๅ…ฅใ‚Š', 'liveTv.reorderFavorites' => 'ใŠๆฐ—ใซๅ…ฅใ‚Šใ‚’ไธฆในๆ›ฟใˆ', 'liveTv.favoritesLoadFailed' => 'ใŠๆฐ—ใซๅ…ฅใ‚Šใ‚’่ชญใฟ่พผใ‚ใพใ›ใ‚“ใงใ—ใŸใ€‚ๆŽฅ็ถšใ‚’็ขบ่ชใ—ใฆใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„ใ€‚', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => '้€ฒ่กŒไธญใฎใ‚ปใƒƒใ‚ทใƒงใƒณใซๅ‚ๅŠ ', 'liveTv.watchFromStart' => ({required Object minutes}) => 'ๆœ€ๅˆใ‹ใ‚‰่ฆ–่ด๏ผˆ${minutes}ๅˆ†ๅ‰ใซ้–‹ๅง‹๏ผ‰', 'liveTv.watchLive' => 'ใƒฉใ‚คใƒ–ใง่ฆ–่ด', @@ -3154,11 +3170,11 @@ extension on TranslationsJa { 'watchTogether.participantLeft' => ({required Object name}) => '${name}ใŒ้€€ๅ‡บใ—ใพใ—ใŸ', 'watchTogether.participantPaused' => ({required Object name}) => '${name}ใŒไธ€ๆ™‚ๅœๆญขใ—ใพใ—ใŸ', 'watchTogether.participantResumed' => ({required Object name}) => '${name}ใŒๅ†้–‹ใ—ใพใ—ใŸ', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name}ใŒใ‚ทใƒผใ‚ฏใ—ใพใ—ใŸ', 'watchTogether.participantBuffering' => ({required Object name}) => '${name}ใŒใƒใƒƒใƒ•ใ‚กใƒชใƒณใ‚ฐไธญ', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} ใฏๅคใ„ใƒใƒผใ‚ธใƒงใƒณใฎใ‚ขใƒ—ใƒชใ‚’ไฝฟ็”จใ—ใฆใ„ใ‚‹ใŸใ‚ใ€ๅŒๆœŸใงใใพใ›ใ‚“', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => '${name} ใชใ—ใงๅ†้–‹', 'watchTogether.waitingForParticipants' => 'ไป–ใฎๅ‚ๅŠ ่€…ใฎ่ชญใฟ่พผใฟใ‚’ๅพ…ใฃใฆใ„ใพใ™...', 'watchTogether.waitingForName' => ({required Object name}) => '${name}ใ‚’ๅพ…ใฃใฆใ„ใพใ™...', diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index 1ad98e9f..3d90175b 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -52,6 +52,7 @@ class TranslationsKo extends Translations with BaseTranslations '์Šน์ธ ๋Œ€๊ธฐ ์ค‘โ€ฆ'; @override String get quickConnectCancel => '์ทจ์†Œ'; @override String get quickConnectExpired => 'Quick Connect๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsKo extends TranslationsSettingsEn { @override String get libraryDensity => '๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ‘œ์‹œ ๋ฐ€๋„'; @override String get compact => '์ข๊ฒŒ'; @override String get comfortable => '๋„“๊ฒŒ'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => '๋ณด๊ธฐ ๋ชจ๋“œ'; @override String get gridView => '๊ทธ๋ฆฌ๋“œ ๋ณด๊ธฐ'; @override String get listView => '๋ชฉ๋ก ๋ณด๊ธฐ'; @@ -311,7 +310,7 @@ class _TranslationsSettingsKo extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'ํ•จ๊ป˜ ๋ณด๊ธฐ ๋ฆด๋ ˆ์ด'; @override String get watchTogetherRelayDescription => '์‚ฌ์šฉ์ž ์ง€์ • ๋ฆด๋ ˆ์ด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ๊ฐ™์€ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.'; @override String get watchTogetherRelayHint => 'https://my-relay.example.com'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => '์ถฉ๋Œ ๋ณด๊ณ '; @override String get crashReportingDescription => '์•ฑ ๊ฐœ์„ ์„ ์œ„ํ•ด ์ถฉ๋Œ ๋ณด๊ณ ์„œ ์ „์†ก'; @override String get debugLogging => '๋””๋ฒ„๊ทธ ๋กœ๊น…'; @@ -328,12 +327,10 @@ class _TranslationsSettingsKo extends TranslationsSettingsEn { @override String get exportSettings => '์„ค์ • ๋‚ด๋ณด๋‚ด๊ธฐ'; @override String get exportSettingsDescription => '๊ธฐ๋ณธ ์„ค์ •์„ ํŒŒ์ผ๋กœ ์ €์žฅ'; @override String get exportSettingsSuccess => '์„ค์ • ๋‚ด๋ณด๋‚ด๊ธฐ ์™„๋ฃŒ'; - @override String get exportSettingsFailed => '์„ค์ •์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค'; @override String get importSettings => '์„ค์ • ๊ฐ€์ ธ์˜ค๊ธฐ'; @override String get importSettingsDescription => 'ํŒŒ์ผ์—์„œ ๊ธฐ๋ณธ ์„ค์ • ๋ณต์›'; @override String get importSettingsConfirm => 'ํ˜„์žฌ ์„ค์ •์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?'; @override String get importSettingsSuccess => '์„ค์ • ๊ฐ€์ ธ์˜ค๊ธฐ ์™„๋ฃŒ'; - @override String get importSettingsFailed => '์„ค์ •์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค'; @override String get importSettingsInvalidFile => '์œ ํšจํ•œ Plezy ์„ค์ • ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค'; @override String get importSettingsNoUser => '์„ค์ •์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์ „์— ๋กœ๊ทธ์ธํ•˜์„ธ์š”'; @override String get shortcutsReset => '๋‹จ์ถ•ํ‚ค๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žฌ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค'; @@ -348,6 +345,7 @@ class _TranslationsSettingsKo extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => '๊ธฐ๊ฐ„์€ ${min}๊ณผ ${max} ${unit} ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค'; @override String shortcutAlreadyAssigned({required Object action}) => '๋‹จ์ถ•ํ‚ค๊ฐ€ ์ด๋ฏธ ${action}์— ํ• ๋‹น ๋˜์—ˆ์Šต๋‹ˆ๋‹ค'; @override String shortcutUpdated({required Object action}) => '๋‹จ์ถ•ํ‚ค๊ฐ€ ${action}์— ๋Œ€ํ•ด ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => '์ž๋™ ๊ฑด๋„ˆ๋›ฐ๊ธฐ'; @override String get autoSkipIntro => '์ž๋™์œผ๋กœ ์˜คํ”„๋‹ ๊ฑด๋„ˆ๋›ฐ๊ธฐ'; @override String get autoSkipIntroDescription => '๋ช‡ ์ดˆ ํ›„ ์˜คํ”„๋‹์„ ์ž๋™์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ'; @@ -373,7 +371,7 @@ class _TranslationsSettingsKo extends TranslationsSettingsEn { @override String get downloadLocationChanged => '๋‹ค์šด๋กœ๋“œ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค'; @override String get downloadLocationReset => '๋‹ค์šด๋กœ๋“œ ์œ„์น˜๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žฌ์„ค์ • ๋˜์—ˆ์Šต๋‹ˆ๋‹ค'; @override String get downloadLocationInvalid => '์„ ํƒํ•œ ํด๋”์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค'; - @override String get downloadLocationSelectError => 'ํด๋” ์„ ํƒ ์‹คํŒจ'; + @override String get downloadLocationPickerUnavailable => '์ด ๊ธฐ๊ธฐ์—์„œ๋Š” ํด๋”๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค'; @override String get downloadOnWifiOnly => 'WiFi ์—ฐ๊ฒฐ ์‹œ์—๋งŒ ๋‹ค์šด๋กœ๋“œ'; @override String get downloadOnWifiOnlyDescription => '์…€๋ฃฐ๋Ÿฌ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ์‹œ ๋‹ค์šด๋กœ๋“œ ๋ถˆ๊ฐ€'; @override String get autoRemoveWatchedDownloads => '์‹œ์ฒญํ•œ ๋‹ค์šด๋กœ๋“œ ์ž๋™ ์‚ญ์ œ'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityKo extends TranslationsAccessibilityEn { @override String get hexColor => '16์ง„์ˆ˜ ์ƒ‰์ƒ'; @override String get expandText => 'ํ…์ŠคํŠธ ํŽผ์น˜๊ธฐ'; @override String get collapseText => 'ํ…์ŠคํŠธ ์ ‘๊ธฐ'; + @override String get alphabetNavigation => '์•ŒํŒŒ๋ฒณ ํƒ์ƒ‰'; + @override String get alphabetScrollHint => '์œ„์•„๋ž˜๋กœ ์Šค์™€์ดํ”„ํ•˜์—ฌ ๊ธ€์ž๋ณ„๋กœ ์ด๋™'; + @override String rowColumnPosition({required Object rowCount, required Object row, required Object columnCount, required Object column}) => '${rowCount}ํ–‰ ์ค‘ ${row}ํ–‰, ${columnCount}์—ด ์ค‘ ${column}์—ด'; + @override String rowPosition({required Object rowCount, required Object row}) => '${rowCount}ํ–‰ ์ค‘ ${row}ํ–‰'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsKo extends TranslationsTooltipsEn { @override String get markAsUnwatched => '์‹œ์ฒญ ์•ˆ ํ•จ์œผ๋กœ ํ‘œ์‹œ'; } +// Path: audioTracks +class _TranslationsAudioTracksKo extends TranslationsAudioTracksEn { + _TranslationsAudioTracksKo._(TranslationsKo root) : this._root = root, super.internal(root); + + final TranslationsKo _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => '์˜ค๋””์˜ค ํŠธ๋ž™ ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsKo extends TranslationsVideoControlsEn { _TranslationsVideoControlsKo._(TranslationsKo root) : this._root = root, super.internal(root); @@ -711,11 +723,11 @@ class _TranslationsMessagesKo extends TranslationsMessagesEn { @override String get streamInterrupted => '์ŠคํŠธ๋ฆผ์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ƒ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ํƒ์ƒ‰ํ•˜์—ฌ ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.'; @override String get liveStreamInterrupted => '๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆผ์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ƒ์„ ๋ˆŒ๋Ÿฌ ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.'; @override String get fileInfoNotAvailable => 'ํŒŒ์ผ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'ํŒŒ์ผ ์ •๋ณด ๋กœ๋”ฉ ์ค‘ ์˜ค๋ฅ˜: ${error}'; @override String get errorLoadingSeries => '์‹œ๋ฆฌ์ฆˆ ๋กœ๋”ฉ ์ค‘ ์˜ค๋ฅ˜'; @override String get musicNotSupported => '์Œ์•… ์žฌ์ƒ ๋ฏธ์ง€์›'; @@ -866,6 +878,7 @@ class _TranslationsProfilesKo extends TranslationsProfilesEn { @override String get borrowExplain => '๋‹ค๋ฅธ ํ”„๋กœํ•„์˜ ์—ฐ๊ฒฐ์„ ๋นŒ๋ฆฝ๋‹ˆ๋‹ค. PIN์œผ๋กœ ๋ณดํ˜ธ๋œ ํ”„๋กœํ•„์—๋Š” PIN์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'; @override String get borrowEmpty => '์•„์ง ๋นŒ๋ฆด ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.'; @override String get borrowEmptySubtitle => '๋จผ์ € ๋‹ค๋ฅธ ํ”„๋กœํ•„์— Plex ๋˜๋Š” Jellyfin์„ ์—ฐ๊ฒฐํ•˜์„ธ์š”.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => '${displayName}์—์„œ'; @override String get borrowConnectionBorrowed => '์—ฐ๊ฒฐ์„ ๋นŒ๋ ธ์Šต๋‹ˆ๋‹ค.'; @override String get borrowFailed => '์—ฐ๊ฒฐ์„ ๋นŒ๋ฆฌ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.'; @@ -1148,7 +1161,7 @@ class _TranslationsLiveTvKo extends TranslationsLiveTvEn { @override String get favorites => '์ฆ๊ฒจ์ฐพ๊ธฐ'; @override String get reorderFavorites => '์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆœ์„œ ๋ณ€๊ฒฝ'; @override String get favoritesLoadFailed => '์ฆ๊ฒจ์ฐพ๊ธฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => '์ง„ํ–‰ ์ค‘์ธ ์„ธ์…˜ ์ฐธ์—ฌ'; @override String watchFromStart({required Object minutes}) => '์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ฒญ (${minutes}๋ถ„ ์ „ ์‹œ์ž‘)'; @override String get watchLive => '์‹ค์‹œ๊ฐ„ ์‹œ์ฒญ'; @@ -2146,7 +2159,7 @@ extension on TranslationsKo { 'auth.quickConnectWaiting' => '์Šน์ธ ๋Œ€๊ธฐ ์ค‘โ€ฆ', 'auth.quickConnectCancel' => '์ทจ์†Œ', 'auth.quickConnectExpired' => 'Quick Connect๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => '์ทจ์†Œ', 'common.save' => '์ €์žฅ', 'common.close' => '๋‹ซ๊ธฐ', @@ -2230,8 +2243,6 @@ extension on TranslationsKo { 'settings.libraryDensity' => '๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ‘œ์‹œ ๋ฐ€๋„', 'settings.compact' => '์ข๊ฒŒ', 'settings.comfortable' => '๋„“๊ฒŒ', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => '๋ณด๊ธฐ ๋ชจ๋“œ', 'settings.gridView' => '๊ทธ๋ฆฌ๋“œ ๋ณด๊ธฐ', 'settings.listView' => '๋ชฉ๋ก ๋ณด๊ธฐ', @@ -2301,7 +2312,7 @@ extension on TranslationsKo { 'settings.watchTogetherRelay' => 'ํ•จ๊ป˜ ๋ณด๊ธฐ ๋ฆด๋ ˆ์ด', 'settings.watchTogetherRelayDescription' => '์‚ฌ์šฉ์ž ์ง€์ • ๋ฆด๋ ˆ์ด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ๊ฐ™์€ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.', 'settings.watchTogetherRelayHint' => 'https://my-relay.example.com', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => '์ถฉ๋Œ ๋ณด๊ณ ', 'settings.crashReportingDescription' => '์•ฑ ๊ฐœ์„ ์„ ์œ„ํ•ด ์ถฉ๋Œ ๋ณด๊ณ ์„œ ์ „์†ก', 'settings.debugLogging' => '๋””๋ฒ„๊ทธ ๋กœ๊น…', @@ -2318,12 +2329,10 @@ extension on TranslationsKo { 'settings.exportSettings' => '์„ค์ • ๋‚ด๋ณด๋‚ด๊ธฐ', 'settings.exportSettingsDescription' => '๊ธฐ๋ณธ ์„ค์ •์„ ํŒŒ์ผ๋กœ ์ €์žฅ', 'settings.exportSettingsSuccess' => '์„ค์ • ๋‚ด๋ณด๋‚ด๊ธฐ ์™„๋ฃŒ', - 'settings.exportSettingsFailed' => '์„ค์ •์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค', 'settings.importSettings' => '์„ค์ • ๊ฐ€์ ธ์˜ค๊ธฐ', 'settings.importSettingsDescription' => 'ํŒŒ์ผ์—์„œ ๊ธฐ๋ณธ ์„ค์ • ๋ณต์›', 'settings.importSettingsConfirm' => 'ํ˜„์žฌ ์„ค์ •์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?', 'settings.importSettingsSuccess' => '์„ค์ • ๊ฐ€์ ธ์˜ค๊ธฐ ์™„๋ฃŒ', - 'settings.importSettingsFailed' => '์„ค์ •์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค', 'settings.importSettingsInvalidFile' => '์œ ํšจํ•œ Plezy ์„ค์ • ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค', 'settings.importSettingsNoUser' => '์„ค์ •์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์ „์— ๋กœ๊ทธ์ธํ•˜์„ธ์š”', 'settings.shortcutsReset' => '๋‹จ์ถ•ํ‚ค๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žฌ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค', @@ -2338,6 +2347,7 @@ extension on TranslationsKo { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => '๊ธฐ๊ฐ„์€ ${min}๊ณผ ${max} ${unit} ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => '๋‹จ์ถ•ํ‚ค๊ฐ€ ์ด๋ฏธ ${action}์— ํ• ๋‹น ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', 'settings.shortcutUpdated' => ({required Object action}) => '๋‹จ์ถ•ํ‚ค๊ฐ€ ${action}์— ๋Œ€ํ•ด ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => '์ž๋™ ๊ฑด๋„ˆ๋›ฐ๊ธฐ', 'settings.autoSkipIntro' => '์ž๋™์œผ๋กœ ์˜คํ”„๋‹ ๊ฑด๋„ˆ๋›ฐ๊ธฐ', 'settings.autoSkipIntroDescription' => '๋ช‡ ์ดˆ ํ›„ ์˜คํ”„๋‹์„ ์ž๋™์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ', @@ -2363,7 +2373,7 @@ extension on TranslationsKo { 'settings.downloadLocationChanged' => '๋‹ค์šด๋กœ๋“œ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', 'settings.downloadLocationReset' => '๋‹ค์šด๋กœ๋“œ ์œ„์น˜๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žฌ์„ค์ • ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', 'settings.downloadLocationInvalid' => '์„ ํƒํ•œ ํด๋”์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค', - 'settings.downloadLocationSelectError' => 'ํด๋” ์„ ํƒ ์‹คํŒจ', + 'settings.downloadLocationPickerUnavailable' => '์ด ๊ธฐ๊ธฐ์—์„œ๋Š” ํด๋”๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค', 'settings.downloadOnWifiOnly' => 'WiFi ์—ฐ๊ฒฐ ์‹œ์—๋งŒ ๋‹ค์šด๋กœ๋“œ', 'settings.downloadOnWifiOnlyDescription' => '์…€๋ฃฐ๋Ÿฌ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ์‹œ ๋‹ค์šด๋กœ๋“œ ๋ถˆ๊ฐ€', 'settings.autoRemoveWatchedDownloads' => '์‹œ์ฒญํ•œ ๋‹ค์šด๋กœ๋“œ ์ž๋™ ์‚ญ์ œ', @@ -2551,10 +2561,15 @@ extension on TranslationsKo { 'accessibility.hexColor' => '16์ง„์ˆ˜ ์ƒ‰์ƒ', 'accessibility.expandText' => 'ํ…์ŠคํŠธ ํŽผ์น˜๊ธฐ', 'accessibility.collapseText' => 'ํ…์ŠคํŠธ ์ ‘๊ธฐ', + 'accessibility.alphabetNavigation' => '์•ŒํŒŒ๋ฒณ ํƒ์ƒ‰', + 'accessibility.alphabetScrollHint' => '์œ„์•„๋ž˜๋กœ ์Šค์™€์ดํ”„ํ•˜์—ฌ ๊ธ€์ž๋ณ„๋กœ ์ด๋™', + 'accessibility.rowColumnPosition' => ({required Object rowCount, required Object row, required Object columnCount, required Object column}) => '${rowCount}ํ–‰ ์ค‘ ${row}ํ–‰, ${columnCount}์—ด ์ค‘ ${column}์—ด', + 'accessibility.rowPosition' => ({required Object rowCount, required Object row}) => '${rowCount}ํ–‰ ์ค‘ ${row}ํ–‰', 'tooltips.shufflePlay' => '๋ฌด์ž‘์œ„ ์žฌ์ƒ', 'tooltips.playTrailer' => '์˜ˆ๊ณ ํŽธ ์žฌ์ƒ', 'tooltips.markAsWatched' => '์‹œ์ฒญ ์™„๋ฃŒ๋กœ ํ‘œ์‹œ', 'tooltips.markAsUnwatched' => '์‹œ์ฒญ ์•ˆ ํ•จ์œผ๋กœ ํ‘œ์‹œ', + 'audioTracks.track' => ({required Object n}) => '์˜ค๋””์˜ค ํŠธ๋ž™ ${n}', 'videoControls.audioLabel' => '์˜ค๋””์˜ค', 'videoControls.subtitlesLabel' => '์ž๋ง‰', 'videoControls.resetToZero' => '0ms๋กœ ์žฌ์„ค์ •', @@ -2641,20 +2656,20 @@ extension on TranslationsKo { 'messages.markedAsUnwatched' => '์‹œ์ฒญ ์•ˆ ํ•จ์œผ๋กœ ํ‘œ์‹œ๋จ', 'messages.markedAsWatchedOffline' => '์‹œ์ฒญ ์™„๋ฃŒ๋กœ ํ‘œ์‹œ๋จ (์—ฐ๊ฒฐ ์‹œ ๋™๊ธฐํ™”๋จ)', 'messages.markedAsUnwatchedOffline' => '๋ฏธ์‹œ์ฒญ์œผ๋กœ ํ‘œ์‹œ๋จ (์—ฐ๊ฒฐ ์‹œ ๋™๊ธฐํ™”๋จ)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => '์ž๋™ ์‚ญ์ œ๋จ: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, other: '์‹œ์ฒญํ•œ ๋‹ค์šด๋กœ๋“œ ${n}๊ฐœ๋ฅผ ์ž๋™ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => '์ž๋™ ์‚ญ์ œ๋จ: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, other: '์‹œ์ฒญํ•œ ๋‹ค์šด๋กœ๋“œ ${n}๊ฐœ๋ฅผ ์ž๋™ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค', ), 'messages.removedFromContinueWatching' => '๊ณ„์† ์‹œ์ฒญ ๋ชฉ๋ก์—์„œ ์ œ๊ฑฐ๋จ', 'messages.errorLoading' => ({required Object error}) => '์˜ค๋ฅ˜: ${error}', 'messages.streamInterrupted' => '์ŠคํŠธ๋ฆผ์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ƒ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ํƒ์ƒ‰ํ•˜์—ฌ ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.', 'messages.liveStreamInterrupted' => '๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆผ์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ƒ์„ ๋ˆŒ๋Ÿฌ ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.', 'messages.fileInfoNotAvailable' => 'ํŒŒ์ผ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'ํŒŒ์ผ ์ •๋ณด ๋กœ๋”ฉ ์ค‘ ์˜ค๋ฅ˜: ${error}', 'messages.errorLoadingSeries' => '์‹œ๋ฆฌ์ฆˆ ๋กœ๋”ฉ ์ค‘ ์˜ค๋ฅ˜', 'messages.musicNotSupported' => '์Œ์•… ์žฌ์ƒ ๋ฏธ์ง€์›', @@ -2769,6 +2784,7 @@ extension on TranslationsKo { 'profiles.borrowExplain' => '๋‹ค๋ฅธ ํ”„๋กœํ•„์˜ ์—ฐ๊ฒฐ์„ ๋นŒ๋ฆฝ๋‹ˆ๋‹ค. PIN์œผ๋กœ ๋ณดํ˜ธ๋œ ํ”„๋กœํ•„์—๋Š” PIN์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.', 'profiles.borrowEmpty' => '์•„์ง ๋นŒ๋ฆด ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.', 'profiles.borrowEmptySubtitle' => '๋จผ์ € ๋‹ค๋ฅธ ํ”„๋กœํ•„์— Plex ๋˜๋Š” Jellyfin์„ ์—ฐ๊ฒฐํ•˜์„ธ์š”.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => '${displayName}์—์„œ', 'profiles.borrowConnectionBorrowed' => '์—ฐ๊ฒฐ์„ ๋นŒ๋ ธ์Šต๋‹ˆ๋‹ค.', 'profiles.borrowFailed' => '์—ฐ๊ฒฐ์„ ๋นŒ๋ฆฌ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', @@ -2994,7 +3010,7 @@ extension on TranslationsKo { 'liveTv.favorites' => '์ฆ๊ฒจ์ฐพ๊ธฐ', 'liveTv.reorderFavorites' => '์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆœ์„œ ๋ณ€๊ฒฝ', 'liveTv.favoritesLoadFailed' => '์ฆ๊ฒจ์ฐพ๊ธฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => '์ง„ํ–‰ ์ค‘์ธ ์„ธ์…˜ ์ฐธ์—ฌ', 'liveTv.watchFromStart' => ({required Object minutes}) => '์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ฒญ (${minutes}๋ถ„ ์ „ ์‹œ์ž‘)', 'liveTv.watchLive' => '์‹ค์‹œ๊ฐ„ ์‹œ์ฒญ', @@ -3154,11 +3170,11 @@ extension on TranslationsKo { 'watchTogether.participantLeft' => ({required Object name}) => '${name}๋‹˜์ด ๋‚˜๊ฐ”์Šต๋‹ˆ๋‹ค', 'watchTogether.participantPaused' => ({required Object name}) => '${name}๋‹˜์ด ์ผ์‹œ์ •์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค', 'watchTogether.participantResumed' => ({required Object name}) => '${name}๋‹˜์ด ์žฌ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name}๋‹˜์ด ํƒ์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค', 'watchTogether.participantBuffering' => ({required Object name}) => '${name}๋‹˜์ด ๋ฒ„ํผ๋ง ์ค‘์ž…๋‹ˆ๋‹ค', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name}๋‹˜์ด ์ด์ „ ๋ฒ„์ „์˜ ์•ฑ์„ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค โ€” ๋™๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => '${name}๋‹˜ ์—†์ด ์žฌ์ƒ์„ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค', 'watchTogether.waitingForParticipants' => '๋‹ค๋ฅธ ์ฐธ๊ฐ€์ž์˜ ๋กœ๋”ฉ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘...', 'watchTogether.waitingForName' => ({required Object name}) => '${name}๋‹˜์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘...', diff --git a/lib/i18n/strings_nb.g.dart b/lib/i18n/strings_nb.g.dart index 2681dce7..6dec8ec6 100644 --- a/lib/i18n/strings_nb.g.dart +++ b/lib/i18n/strings_nb.g.dart @@ -52,6 +52,7 @@ class TranslationsNb extends Translations with BaseTranslations 'Venter pรฅ godkjenningโ€ฆ'; @override String get quickConnectCancel => 'Avbryt'; @override String get quickConnectExpired => 'Quick Connect er utlรธpt. Prรธv igjen.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsNb extends TranslationsSettingsEn { @override String get libraryDensity => 'Bibliotekets tetthet'; @override String get compact => 'Kompakt'; @override String get comfortable => 'Komfortabel'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => 'Visningsmodus'; @override String get gridView => 'Rutenett'; @override String get listView => 'Liste'; @@ -311,7 +310,7 @@ class _TranslationsSettingsNb extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'Se Sammen-relay'; @override String get watchTogetherRelayDescription => 'Angi en egendefinert relay. Alle mรฅ bruke samme server.'; @override String get watchTogetherRelayHint => 'https://min-relay.eksempel.no'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'Krasjrapportering'; @override String get crashReportingDescription => 'Send krasjrapporter for รฅ hjelpe med รฅ forbedre appen'; @override String get debugLogging => 'Feilsรธkingslogging'; @@ -328,12 +327,10 @@ class _TranslationsSettingsNb extends TranslationsSettingsEn { @override String get exportSettings => 'Eksporter innstillinger'; @override String get exportSettingsDescription => 'Lagre innstillingene i en fil'; @override String get exportSettingsSuccess => 'Innstillinger eksportert'; - @override String get exportSettingsFailed => 'Kunne ikke eksportere innstillinger'; @override String get importSettings => 'Importer innstillinger'; @override String get importSettingsDescription => 'Gjenopprett innstillinger fra en fil'; @override String get importSettingsConfirm => 'Dette vil erstatte nรฅvรฆrende innstillinger. Fortsette?'; @override String get importSettingsSuccess => 'Innstillinger importert'; - @override String get importSettingsFailed => 'Kunne ikke importere innstillinger'; @override String get importSettingsInvalidFile => 'Denne filen er ikke en gyldig Plezy-innstillingseksport'; @override String get importSettingsNoUser => 'Logg inn fรธr import av innstillinger'; @override String get shortcutsReset => 'Snarveier tilbakestilt til standard'; @@ -348,6 +345,7 @@ class _TranslationsSettingsNb extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'Varigheten mรฅ vรฆre mellom ${min} og ${max} ${unit}'; @override String shortcutAlreadyAssigned({required Object action}) => 'Snarvei allerede tilordnet til ${action}'; @override String shortcutUpdated({required Object action}) => 'Snarvei oppdatert for ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'Automatisk hopp'; @override String get autoSkipIntro => 'Hopp over intro automatisk'; @override String get autoSkipIntroDescription => 'Hopp automatisk over intromarkรธrer etter noen sekunder'; @@ -373,7 +371,7 @@ class _TranslationsSettingsNb extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'Nedlastingsplassering endret'; @override String get downloadLocationReset => 'Nedlastingsplassering tilbakestilt til standard'; @override String get downloadLocationInvalid => 'Valgt mappe er ikke skrivbar'; - @override String get downloadLocationSelectError => 'Kunne ikke velge mappe'; + @override String get downloadLocationPickerUnavailable => 'Mappevalg er ikke tilgjengelig pรฅ denne enheten'; @override String get downloadOnWifiOnly => 'Last ned kun pรฅ WiFi'; @override String get downloadOnWifiOnlyDescription => 'Forhindre nedlastinger pรฅ mobildata'; @override String get autoRemoveWatchedDownloads => 'Fjern sette nedlastinger automatisk'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityNb extends TranslationsAccessibilityEn { @override String get hexColor => 'Heksadesimal farge'; @override String get expandText => 'Utvid tekst'; @override String get collapseText => 'Fold sammen tekst'; + @override String get alphabetNavigation => 'Alfabetisk navigasjon'; + @override String get alphabetScrollHint => 'Sveip opp eller ned for รฅ flytte รฉn bokstav'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rad ${row} av ${rowCount}, kolonne ${column} av ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'Rad ${row} av ${rowCount}'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsNb extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'Merk som usett'; } +// Path: audioTracks +class _TranslationsAudioTracksNb extends TranslationsAudioTracksEn { + _TranslationsAudioTracksNb._(TranslationsNb root) : this._root = root, super.internal(root); + + final TranslationsNb _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'Lydspor ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsNb extends TranslationsVideoControlsEn { _TranslationsVideoControlsNb._(TranslationsNb root) : this._root = root, super.internal(root); @@ -712,11 +724,11 @@ class _TranslationsMessagesNb extends TranslationsMessagesEn { @override String get streamInterrupted => 'Avspillingen ble avbrutt. Trykk pรฅ Spill av eller spol for รฅ prรธve pรฅ nytt.'; @override String get liveStreamInterrupted => 'Direktesendingen ble avbrutt. Trykk pรฅ Spill av for รฅ prรธve pรฅ nytt.'; @override String get fileInfoNotAvailable => 'Filinformasjon ikke tilgjengelig'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'Feil ved lasting av filinformasjon: ${error}'; @override String get errorLoadingSeries => 'Feil ved lasting av serie'; @override String get musicNotSupported => 'Musikkavspilling stรธttes ikke ennรฅ'; @@ -867,6 +879,7 @@ class _TranslationsProfilesNb extends TranslationsProfilesEn { @override String get borrowExplain => 'Lรฅn en annen profils tilkobling. PIN-beskyttede profiler krever PIN.'; @override String get borrowEmpty => 'Ingenting รฅ lรฅne enda.'; @override String get borrowEmptySubtitle => 'Koble Plex eller Jellyfin til en annen profil fรธrst.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'Fra ${displayName}'; @override String get borrowConnectionBorrowed => 'Tilkobling lรฅnt.'; @override String get borrowFailed => 'Kunne ikke lรฅne tilkoblingen.'; @@ -1150,7 +1163,7 @@ class _TranslationsLiveTvNb extends TranslationsLiveTvEn { @override String get favorites => 'Favoritter'; @override String get reorderFavorites => 'Endre rekkefรธlge pรฅ favoritter'; @override String get favoritesLoadFailed => 'Kunne ikke laste inn favoritter. Kontroller tilkoblingen og prรธv pรฅ nytt.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'Bli med i pรฅgรฅende รธkt'; @override String watchFromStart({required Object minutes}) => 'Se fra starten (${minutes} min siden)'; @override String get watchLive => 'Se direkte'; @@ -2149,7 +2162,7 @@ extension on TranslationsNb { 'auth.quickConnectWaiting' => 'Venter pรฅ godkjenningโ€ฆ', 'auth.quickConnectCancel' => 'Avbryt', 'auth.quickConnectExpired' => 'Quick Connect er utlรธpt. Prรธv igjen.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'Avbryt', 'common.save' => 'Lagre', 'common.close' => 'Lukk', @@ -2233,8 +2246,6 @@ extension on TranslationsNb { 'settings.libraryDensity' => 'Bibliotekets tetthet', 'settings.compact' => 'Kompakt', 'settings.comfortable' => 'Komfortabel', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => 'Visningsmodus', 'settings.gridView' => 'Rutenett', 'settings.listView' => 'Liste', @@ -2304,7 +2315,7 @@ extension on TranslationsNb { 'settings.watchTogetherRelay' => 'Se Sammen-relay', 'settings.watchTogetherRelayDescription' => 'Angi en egendefinert relay. Alle mรฅ bruke samme server.', 'settings.watchTogetherRelayHint' => 'https://min-relay.eksempel.no', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'Krasjrapportering', 'settings.crashReportingDescription' => 'Send krasjrapporter for รฅ hjelpe med รฅ forbedre appen', 'settings.debugLogging' => 'Feilsรธkingslogging', @@ -2321,12 +2332,10 @@ extension on TranslationsNb { 'settings.exportSettings' => 'Eksporter innstillinger', 'settings.exportSettingsDescription' => 'Lagre innstillingene i en fil', 'settings.exportSettingsSuccess' => 'Innstillinger eksportert', - 'settings.exportSettingsFailed' => 'Kunne ikke eksportere innstillinger', 'settings.importSettings' => 'Importer innstillinger', 'settings.importSettingsDescription' => 'Gjenopprett innstillinger fra en fil', 'settings.importSettingsConfirm' => 'Dette vil erstatte nรฅvรฆrende innstillinger. Fortsette?', 'settings.importSettingsSuccess' => 'Innstillinger importert', - 'settings.importSettingsFailed' => 'Kunne ikke importere innstillinger', 'settings.importSettingsInvalidFile' => 'Denne filen er ikke en gyldig Plezy-innstillingseksport', 'settings.importSettingsNoUser' => 'Logg inn fรธr import av innstillinger', 'settings.shortcutsReset' => 'Snarveier tilbakestilt til standard', @@ -2341,6 +2350,7 @@ extension on TranslationsNb { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'Varigheten mรฅ vรฆre mellom ${min} og ${max} ${unit}', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'Snarvei allerede tilordnet til ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'Snarvei oppdatert for ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'Automatisk hopp', 'settings.autoSkipIntro' => 'Hopp over intro automatisk', 'settings.autoSkipIntroDescription' => 'Hopp automatisk over intromarkรธrer etter noen sekunder', @@ -2366,7 +2376,7 @@ extension on TranslationsNb { 'settings.downloadLocationChanged' => 'Nedlastingsplassering endret', 'settings.downloadLocationReset' => 'Nedlastingsplassering tilbakestilt til standard', 'settings.downloadLocationInvalid' => 'Valgt mappe er ikke skrivbar', - 'settings.downloadLocationSelectError' => 'Kunne ikke velge mappe', + 'settings.downloadLocationPickerUnavailable' => 'Mappevalg er ikke tilgjengelig pรฅ denne enheten', 'settings.downloadOnWifiOnly' => 'Last ned kun pรฅ WiFi', 'settings.downloadOnWifiOnlyDescription' => 'Forhindre nedlastinger pรฅ mobildata', 'settings.autoRemoveWatchedDownloads' => 'Fjern sette nedlastinger automatisk', @@ -2554,10 +2564,15 @@ extension on TranslationsNb { 'accessibility.hexColor' => 'Heksadesimal farge', 'accessibility.expandText' => 'Utvid tekst', 'accessibility.collapseText' => 'Fold sammen tekst', + 'accessibility.alphabetNavigation' => 'Alfabetisk navigasjon', + 'accessibility.alphabetScrollHint' => 'Sveip opp eller ned for รฅ flytte รฉn bokstav', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rad ${row} av ${rowCount}, kolonne ${column} av ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Rad ${row} av ${rowCount}', 'tooltips.shufflePlay' => 'Tilfeldig avspilling', 'tooltips.playTrailer' => 'Spill trailer', 'tooltips.markAsWatched' => 'Merk som sett', 'tooltips.markAsUnwatched' => 'Merk som usett', + 'audioTracks.track' => ({required Object n}) => 'Lydspor ${n}', 'videoControls.audioLabel' => 'Lyd', 'videoControls.subtitlesLabel' => 'Undertekster', 'videoControls.resetToZero' => 'Tilbakestill til 0ms', @@ -2644,20 +2659,20 @@ extension on TranslationsNb { 'messages.markedAsUnwatched' => 'Merket som usett', 'messages.markedAsWatchedOffline' => 'Merket som sett (synkroniseres nรฅr tilkoblet)', 'messages.markedAsUnwatchedOffline' => 'Merket som usett (synkroniseres nรฅr tilkoblet)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatisk fjernet: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nb'))(n, one: 'Fjernet automatisk ${n} sett nedlasting', other: 'Fjernet automatisk ${n} sette nedlastinger', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatisk fjernet: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nb'))(n, one: 'Fjernet automatisk ${n} sett nedlasting', other: 'Fjernet automatisk ${n} sette nedlastinger', ), 'messages.removedFromContinueWatching' => 'Fjernet fra Fortsett รฅ se', 'messages.errorLoading' => ({required Object error}) => 'Feil: ${error}', 'messages.streamInterrupted' => 'Avspillingen ble avbrutt. Trykk pรฅ Spill av eller spol for รฅ prรธve pรฅ nytt.', 'messages.liveStreamInterrupted' => 'Direktesendingen ble avbrutt. Trykk pรฅ Spill av for รฅ prรธve pรฅ nytt.', 'messages.fileInfoNotAvailable' => 'Filinformasjon ikke tilgjengelig', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'Feil ved lasting av filinformasjon: ${error}', 'messages.errorLoadingSeries' => 'Feil ved lasting av serie', 'messages.musicNotSupported' => 'Musikkavspilling stรธttes ikke ennรฅ', @@ -2772,6 +2787,7 @@ extension on TranslationsNb { 'profiles.borrowExplain' => 'Lรฅn en annen profils tilkobling. PIN-beskyttede profiler krever PIN.', 'profiles.borrowEmpty' => 'Ingenting รฅ lรฅne enda.', 'profiles.borrowEmptySubtitle' => 'Koble Plex eller Jellyfin til en annen profil fรธrst.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'Fra ${displayName}', 'profiles.borrowConnectionBorrowed' => 'Tilkobling lรฅnt.', 'profiles.borrowFailed' => 'Kunne ikke lรฅne tilkoblingen.', @@ -2997,7 +3013,7 @@ extension on TranslationsNb { 'liveTv.favorites' => 'Favoritter', 'liveTv.reorderFavorites' => 'Endre rekkefรธlge pรฅ favoritter', 'liveTv.favoritesLoadFailed' => 'Kunne ikke laste inn favoritter. Kontroller tilkoblingen og prรธv pรฅ nytt.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'Bli med i pรฅgรฅende รธkt', 'liveTv.watchFromStart' => ({required Object minutes}) => 'Se fra starten (${minutes} min siden)', 'liveTv.watchLive' => 'Se direkte', @@ -3157,11 +3173,11 @@ extension on TranslationsNb { 'watchTogether.participantLeft' => ({required Object name}) => '${name} forlot', 'watchTogether.participantPaused' => ({required Object name}) => '${name} pauset', 'watchTogether.participantResumed' => ({required Object name}) => '${name} gjenopptok', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} spolet', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} buffrer', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} bruker en eldre appversjon โ€” synkronisering er ikke tilgjengelig', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'Fortsetter uten ${name}', 'watchTogether.waitingForParticipants' => 'Venter pรฅ at andre laster inn...', 'watchTogether.waitingForName' => ({required Object name}) => 'Venter pรฅ ${name}...', diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index 694031eb..001288fd 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -52,6 +52,7 @@ class TranslationsNl extends Translations with BaseTranslations 'Wachten op goedkeuringโ€ฆ'; @override String get quickConnectCancel => 'Annuleren'; @override String get quickConnectExpired => 'Quick Connect is verlopen. Probeer opnieuw.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsNl extends TranslationsSettingsEn { @override String get libraryDensity => 'Bibliotheek dichtheid'; @override String get compact => 'Compact'; @override String get comfortable => 'Comfortabel'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => 'Weergavemodus'; @override String get gridView => 'Raster'; @override String get listView => 'Lijst'; @@ -311,7 +310,7 @@ class _TranslationsSettingsNl extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'Samen Kijken Relay'; @override String get watchTogetherRelayDescription => 'Stel een aangepaste relay in. Iedereen moet dezelfde server gebruiken.'; @override String get watchTogetherRelayHint => 'https://mijn-relay.voorbeeld.nl'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'Crashrapportage'; @override String get crashReportingDescription => 'Crashrapporten verzenden om de app te verbeteren'; @override String get debugLogging => 'Debug logging'; @@ -328,12 +327,10 @@ class _TranslationsSettingsNl extends TranslationsSettingsEn { @override String get exportSettings => 'Instellingen exporteren'; @override String get exportSettingsDescription => 'Sla je voorkeuren op in een bestand'; @override String get exportSettingsSuccess => 'Instellingen geรซxporteerd'; - @override String get exportSettingsFailed => 'Kon instellingen niet exporteren'; @override String get importSettings => 'Instellingen importeren'; @override String get importSettingsDescription => 'Voorkeuren herstellen vanuit een bestand'; @override String get importSettingsConfirm => 'Hiermee worden je huidige instellingen vervangen. Doorgaan?'; @override String get importSettingsSuccess => 'Instellingen geรฏmporteerd'; - @override String get importSettingsFailed => 'Kon instellingen niet importeren'; @override String get importSettingsInvalidFile => 'Dit bestand is geen geldige Plezy-export'; @override String get importSettingsNoUser => 'Meld je aan voordat je instellingen importeert'; @override String get shortcutsReset => 'Sneltoetsen gereset naar standaard'; @@ -348,6 +345,7 @@ class _TranslationsSettingsNl extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'Duur moet tussen ${min} en ${max} ${unit} zijn'; @override String shortcutAlreadyAssigned({required Object action}) => 'Sneltoets al toegewezen aan ${action}'; @override String shortcutUpdated({required Object action}) => 'Sneltoets bijgewerkt voor ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'Automatisch Overslaan'; @override String get autoSkipIntro => 'Intro Automatisch Overslaan'; @override String get autoSkipIntroDescription => 'Intro-markeringen na enkele seconden automatisch overslaan'; @@ -373,7 +371,7 @@ class _TranslationsSettingsNl extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'Downloadlocatie gewijzigd'; @override String get downloadLocationReset => 'Downloadlocatie hersteld naar standaard'; @override String get downloadLocationInvalid => 'Geselecteerde map is niet beschrijfbaar'; - @override String get downloadLocationSelectError => 'Kan map niet selecteren'; + @override String get downloadLocationPickerUnavailable => 'Mapselectie is niet beschikbaar op dit apparaat'; @override String get downloadOnWifiOnly => 'Alleen via WiFi downloaden'; @override String get downloadOnWifiOnlyDescription => 'Voorkom downloads bij gebruik van mobiele data'; @override String get autoRemoveWatchedDownloads => 'Bekeken downloads automatisch verwijderen'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityNl extends TranslationsAccessibilityEn { @override String get hexColor => 'Hexkleur'; @override String get expandText => 'Tekst uitvouwen'; @override String get collapseText => 'Tekst samenvouwen'; + @override String get alphabetNavigation => 'Alfabetische navigatie'; + @override String get alphabetScrollHint => 'Veeg omhoog of omlaag om per letter te bewegen'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rij ${row} van ${rowCount}, kolom ${column} van ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'Rij ${row} van ${rowCount}'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsNl extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'Markeer als ongekeken'; } +// Path: audioTracks +class _TranslationsAudioTracksNl extends TranslationsAudioTracksEn { + _TranslationsAudioTracksNl._(TranslationsNl root) : this._root = root, super.internal(root); + + final TranslationsNl _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'Audiospoor ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsNl extends TranslationsVideoControlsEn { _TranslationsVideoControlsNl._(TranslationsNl root) : this._root = root, super.internal(root); @@ -712,11 +724,11 @@ class _TranslationsMessagesNl extends TranslationsMessagesEn { @override String get streamInterrupted => 'De stream is onderbroken. Druk op afspelen of spoel om het opnieuw te proberen.'; @override String get liveStreamInterrupted => 'De livestream is onderbroken. Druk op afspelen om het opnieuw te proberen.'; @override String get fileInfoNotAvailable => 'Bestand informatie niet beschikbaar'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'Fout bij laden bestand info: ${error}'; @override String get errorLoadingSeries => 'Fout bij laden serie'; @override String get musicNotSupported => 'Muziek afspelen wordt nog niet ondersteund'; @@ -867,6 +879,7 @@ class _TranslationsProfilesNl extends TranslationsProfilesEn { @override String get borrowExplain => 'Leen de verbinding van een ander profiel. PIN-beveiligde profielen vereisen een PIN.'; @override String get borrowEmpty => 'Nog niets te lenen.'; @override String get borrowEmptySubtitle => 'Verbind Plex of Jellyfin eerst met een ander profiel.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'Van ${displayName}'; @override String get borrowConnectionBorrowed => 'Verbinding geleend.'; @override String get borrowFailed => 'Kan verbinding niet lenen.'; @@ -1150,7 +1163,7 @@ class _TranslationsLiveTvNl extends TranslationsLiveTvEn { @override String get favorites => 'Favorieten'; @override String get reorderFavorites => 'Favorieten herordenen'; @override String get favoritesLoadFailed => 'Favorieten konden niet worden geladen. Controleer je verbinding en probeer het opnieuw.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'Deelnemen aan lopende sessie'; @override String watchFromStart({required Object minutes}) => 'Kijk vanaf het begin (${minutes} min geleden)'; @override String get watchLive => 'Live kijken'; @@ -2149,7 +2162,7 @@ extension on TranslationsNl { 'auth.quickConnectWaiting' => 'Wachten op goedkeuringโ€ฆ', 'auth.quickConnectCancel' => 'Annuleren', 'auth.quickConnectExpired' => 'Quick Connect is verlopen. Probeer opnieuw.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'Annuleren', 'common.save' => 'Opslaan', 'common.close' => 'Sluiten', @@ -2233,8 +2246,6 @@ extension on TranslationsNl { 'settings.libraryDensity' => 'Bibliotheek dichtheid', 'settings.compact' => 'Compact', 'settings.comfortable' => 'Comfortabel', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => 'Weergavemodus', 'settings.gridView' => 'Raster', 'settings.listView' => 'Lijst', @@ -2304,7 +2315,7 @@ extension on TranslationsNl { 'settings.watchTogetherRelay' => 'Samen Kijken Relay', 'settings.watchTogetherRelayDescription' => 'Stel een aangepaste relay in. Iedereen moet dezelfde server gebruiken.', 'settings.watchTogetherRelayHint' => 'https://mijn-relay.voorbeeld.nl', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'Crashrapportage', 'settings.crashReportingDescription' => 'Crashrapporten verzenden om de app te verbeteren', 'settings.debugLogging' => 'Debug logging', @@ -2321,12 +2332,10 @@ extension on TranslationsNl { 'settings.exportSettings' => 'Instellingen exporteren', 'settings.exportSettingsDescription' => 'Sla je voorkeuren op in een bestand', 'settings.exportSettingsSuccess' => 'Instellingen geรซxporteerd', - 'settings.exportSettingsFailed' => 'Kon instellingen niet exporteren', 'settings.importSettings' => 'Instellingen importeren', 'settings.importSettingsDescription' => 'Voorkeuren herstellen vanuit een bestand', 'settings.importSettingsConfirm' => 'Hiermee worden je huidige instellingen vervangen. Doorgaan?', 'settings.importSettingsSuccess' => 'Instellingen geรฏmporteerd', - 'settings.importSettingsFailed' => 'Kon instellingen niet importeren', 'settings.importSettingsInvalidFile' => 'Dit bestand is geen geldige Plezy-export', 'settings.importSettingsNoUser' => 'Meld je aan voordat je instellingen importeert', 'settings.shortcutsReset' => 'Sneltoetsen gereset naar standaard', @@ -2341,6 +2350,7 @@ extension on TranslationsNl { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'Duur moet tussen ${min} en ${max} ${unit} zijn', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'Sneltoets al toegewezen aan ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'Sneltoets bijgewerkt voor ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'Automatisch Overslaan', 'settings.autoSkipIntro' => 'Intro Automatisch Overslaan', 'settings.autoSkipIntroDescription' => 'Intro-markeringen na enkele seconden automatisch overslaan', @@ -2366,7 +2376,7 @@ extension on TranslationsNl { 'settings.downloadLocationChanged' => 'Downloadlocatie gewijzigd', 'settings.downloadLocationReset' => 'Downloadlocatie hersteld naar standaard', 'settings.downloadLocationInvalid' => 'Geselecteerde map is niet beschrijfbaar', - 'settings.downloadLocationSelectError' => 'Kan map niet selecteren', + 'settings.downloadLocationPickerUnavailable' => 'Mapselectie is niet beschikbaar op dit apparaat', 'settings.downloadOnWifiOnly' => 'Alleen via WiFi downloaden', 'settings.downloadOnWifiOnlyDescription' => 'Voorkom downloads bij gebruik van mobiele data', 'settings.autoRemoveWatchedDownloads' => 'Bekeken downloads automatisch verwijderen', @@ -2554,10 +2564,15 @@ extension on TranslationsNl { 'accessibility.hexColor' => 'Hexkleur', 'accessibility.expandText' => 'Tekst uitvouwen', 'accessibility.collapseText' => 'Tekst samenvouwen', + 'accessibility.alphabetNavigation' => 'Alfabetische navigatie', + 'accessibility.alphabetScrollHint' => 'Veeg omhoog of omlaag om per letter te bewegen', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rij ${row} van ${rowCount}, kolom ${column} van ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Rij ${row} van ${rowCount}', 'tooltips.shufflePlay' => 'Willekeurig afspelen', 'tooltips.playTrailer' => 'Trailer afspelen', 'tooltips.markAsWatched' => 'Markeer als gekeken', 'tooltips.markAsUnwatched' => 'Markeer als ongekeken', + 'audioTracks.track' => ({required Object n}) => 'Audiospoor ${n}', 'videoControls.audioLabel' => 'Audio', 'videoControls.subtitlesLabel' => 'Ondertitels', 'videoControls.resetToZero' => 'Reset naar 0ms', @@ -2644,20 +2659,20 @@ extension on TranslationsNl { 'messages.markedAsUnwatched' => 'Gemarkeerd als ongekeken', 'messages.markedAsWatchedOffline' => 'Gemarkeerd als gekeken (sync wanneer online)', 'messages.markedAsUnwatchedOffline' => 'Gemarkeerd als ongekeken (sync wanneer online)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatisch verwijderd: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nl'))(n, one: 'Automatisch ${n} bekeken download verwijderd', other: 'Automatisch ${n} bekeken downloads verwijderd', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatisch verwijderd: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nl'))(n, one: 'Automatisch ${n} bekeken download verwijderd', other: 'Automatisch ${n} bekeken downloads verwijderd', ), 'messages.removedFromContinueWatching' => 'Verwijderd uit Doorgaan met kijken', 'messages.errorLoading' => ({required Object error}) => 'Fout: ${error}', 'messages.streamInterrupted' => 'De stream is onderbroken. Druk op afspelen of spoel om het opnieuw te proberen.', 'messages.liveStreamInterrupted' => 'De livestream is onderbroken. Druk op afspelen om het opnieuw te proberen.', 'messages.fileInfoNotAvailable' => 'Bestand informatie niet beschikbaar', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'Fout bij laden bestand info: ${error}', 'messages.errorLoadingSeries' => 'Fout bij laden serie', 'messages.musicNotSupported' => 'Muziek afspelen wordt nog niet ondersteund', @@ -2772,6 +2787,7 @@ extension on TranslationsNl { 'profiles.borrowExplain' => 'Leen de verbinding van een ander profiel. PIN-beveiligde profielen vereisen een PIN.', 'profiles.borrowEmpty' => 'Nog niets te lenen.', 'profiles.borrowEmptySubtitle' => 'Verbind Plex of Jellyfin eerst met een ander profiel.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'Van ${displayName}', 'profiles.borrowConnectionBorrowed' => 'Verbinding geleend.', 'profiles.borrowFailed' => 'Kan verbinding niet lenen.', @@ -2997,7 +3013,7 @@ extension on TranslationsNl { 'liveTv.favorites' => 'Favorieten', 'liveTv.reorderFavorites' => 'Favorieten herordenen', 'liveTv.favoritesLoadFailed' => 'Favorieten konden niet worden geladen. Controleer je verbinding en probeer het opnieuw.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'Deelnemen aan lopende sessie', 'liveTv.watchFromStart' => ({required Object minutes}) => 'Kijk vanaf het begin (${minutes} min geleden)', 'liveTv.watchLive' => 'Live kijken', @@ -3157,11 +3173,11 @@ extension on TranslationsNl { 'watchTogether.participantLeft' => ({required Object name}) => '${name} heeft de sessie verlaten', 'watchTogether.participantPaused' => ({required Object name}) => '${name} heeft gepauzeerd', 'watchTogether.participantResumed' => ({required Object name}) => '${name} heeft hervat', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} heeft gespoeld', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} is aan het bufferen', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} gebruikt een oudere appversie โ€” synchronisatie niet beschikbaar', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'Hervatten zonder ${name}', 'watchTogether.waitingForParticipants' => 'Wachten tot anderen geladen zijn...', 'watchTogether.waitingForName' => ({required Object name}) => 'Wachten op ${name}...', diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index 5a69c6c3..f05e2267 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -52,6 +52,7 @@ class TranslationsPl extends Translations with BaseTranslations 'Oczekiwanie na zatwierdzenieโ€ฆ'; @override String get quickConnectCancel => 'Anuluj'; @override String get quickConnectExpired => 'Quick Connect wygasล‚. Sprรณbuj ponownie.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsPl extends TranslationsSettingsEn { @override String get libraryDensity => 'Gฤ™stoล›ฤ‡ biblioteki'; @override String get compact => 'Kompaktowy'; @override String get comfortable => 'Wygodny'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => 'Tryb widoku'; @override String get gridView => 'Siatka'; @override String get listView => 'Lista'; @@ -311,7 +310,7 @@ class _TranslationsSettingsPl extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'Relay Oglฤ…daj Razem'; @override String get watchTogetherRelayDescription => 'Ustaw wล‚asny relay. Wszyscy muszฤ… uลผywaฤ‡ tego samego serwera.'; @override String get watchTogetherRelayHint => 'https://moj-relay.przyklad.pl'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'Raportowanie bล‚ฤ™dรณw'; @override String get crashReportingDescription => 'Wysyล‚aj raporty o bล‚ฤ™dach, aby pomรณc ulepszyฤ‡ aplikacjฤ™'; @override String get debugLogging => 'Logowanie debugowania'; @@ -328,12 +327,10 @@ class _TranslationsSettingsPl extends TranslationsSettingsEn { @override String get exportSettings => 'Eksportuj ustawienia'; @override String get exportSettingsDescription => 'Zapisz swoje preferencje do pliku'; @override String get exportSettingsSuccess => 'Ustawienia wyeksportowane'; - @override String get exportSettingsFailed => 'Nie moลผna wyeksportowaฤ‡ ustawieล„'; @override String get importSettings => 'Importuj ustawienia'; @override String get importSettingsDescription => 'Przywrรณฤ‡ preferencje z pliku'; @override String get importSettingsConfirm => 'Bieลผฤ…ce ustawienia zostanฤ… zastฤ…pione. Kontynuowaฤ‡?'; @override String get importSettingsSuccess => 'Ustawienia zaimportowane'; - @override String get importSettingsFailed => 'Nie moลผna zaimportowaฤ‡ ustawieล„'; @override String get importSettingsInvalidFile => 'Ten plik nie jest prawidล‚owym eksportem Plezy'; @override String get importSettingsNoUser => 'Zaloguj siฤ™ przed importem ustawieล„'; @override String get shortcutsReset => 'Skrรณty przywrรณcone do domyล›lnych'; @@ -348,6 +345,7 @@ class _TranslationsSettingsPl extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'Czas musi byฤ‡ miฤ™dzy ${min} a ${max} ${unit}'; @override String shortcutAlreadyAssigned({required Object action}) => 'Skrรณt jest juลผ przypisany do ${action}'; @override String shortcutUpdated({required Object action}) => 'Skrรณt zaktualizowany dla ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'Automatyczne pomijanie'; @override String get autoSkipIntro => 'Automatyczne pomijanie intro'; @override String get autoSkipIntroDescription => 'Automatycznie pomijaj znaczniki intro po kilku sekundach'; @@ -373,7 +371,7 @@ class _TranslationsSettingsPl extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'Lokalizacja pobierania zmieniona'; @override String get downloadLocationReset => 'Lokalizacja pobierania przywrรณcona do domyล›lnej'; @override String get downloadLocationInvalid => 'Wybrany folder nie jest zapisywalny'; - @override String get downloadLocationSelectError => 'Nie udaล‚o siฤ™ wybraฤ‡ folderu'; + @override String get downloadLocationPickerUnavailable => 'Wybรณr folderu nie jest dostฤ™pny na tym urzฤ…dzeniu'; @override String get downloadOnWifiOnly => 'Pobieraj tylko przez WiFi'; @override String get downloadOnWifiOnlyDescription => 'Blokuj pobieranie na danych komรณrkowych'; @override String get autoRemoveWatchedDownloads => 'Automatycznie usuwaj obejrzane pobrania'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityPl extends TranslationsAccessibilityEn { @override String get hexColor => 'Kolor szesnastkowy'; @override String get expandText => 'Rozwiล„ tekst'; @override String get collapseText => 'Zwiล„ tekst'; + @override String get alphabetNavigation => 'Nawigacja alfabetyczna'; + @override String get alphabetScrollHint => 'Przesuล„ w gรณrฤ™ lub w dรณล‚, aby przejล›ฤ‡ o literฤ™'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Wiersz ${row} z ${rowCount}, kolumna ${column} z ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'Wiersz ${row} z ${rowCount}'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsPl extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'Oznacz jako nieobejrzane'; } +// Path: audioTracks +class _TranslationsAudioTracksPl extends TranslationsAudioTracksEn { + _TranslationsAudioTracksPl._(TranslationsPl root) : this._root = root, super.internal(root); + + final TranslationsPl _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'ลšcieลผka audio ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsPl extends TranslationsVideoControlsEn { _TranslationsVideoControlsPl._(TranslationsPl root) : this._root = root, super.internal(root); @@ -714,11 +726,11 @@ class _TranslationsMessagesPl extends TranslationsMessagesEn { @override String get streamInterrupted => 'Strumieล„ zostaล‚ przerwany. Naciล›nij odtwarzanie lub przewiล„, aby sprรณbowaฤ‡ ponownie.'; @override String get liveStreamInterrupted => 'Transmisja na ลผywo zostaล‚a przerwana. Naciล›nij odtwarzanie, aby sprรณbowaฤ‡ ponownie.'; @override String get fileInfoNotAvailable => 'Informacje o pliku niedostฤ™pne'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'Bล‚ฤ…d ล‚adowania informacji o pliku: ${error}'; @override String get errorLoadingSeries => 'Bล‚ฤ…d ล‚adowania serialu'; @override String get musicNotSupported => 'Odtwarzanie muzyki nie jest jeszcze obsล‚ugiwane'; @@ -869,6 +881,7 @@ class _TranslationsProfilesPl extends TranslationsProfilesEn { @override String get borrowExplain => 'Poลผycz poล‚ฤ…czenie z innego profilu. Profile chronione PIN wymagajฤ… PIN-u.'; @override String get borrowEmpty => 'Nic do poลผyczenia.'; @override String get borrowEmptySubtitle => 'Najpierw poล‚ฤ…cz Plex lub Jellyfin z innym profilem.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'Od ${displayName}'; @override String get borrowConnectionBorrowed => 'Poล‚ฤ…czenie poลผyczone.'; @override String get borrowFailed => 'Nie udaล‚o siฤ™ poลผyczyฤ‡ poล‚ฤ…czenia.'; @@ -1154,7 +1167,7 @@ class _TranslationsLiveTvPl extends TranslationsLiveTvEn { @override String get favorites => 'Ulubione'; @override String get reorderFavorites => 'Zmieล„ kolejnoล›ฤ‡ ulubionych'; @override String get favoritesLoadFailed => 'Nie udaล‚o siฤ™ wczytaฤ‡ ulubionych. Sprawdลบ poล‚ฤ…czenie i sprรณbuj ponownie.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'Doล‚ฤ…cz do trwajฤ…cej sesji'; @override String watchFromStart({required Object minutes}) => 'Oglฤ…daj od poczฤ…tku (${minutes} min temu)'; @override String get watchLive => 'Oglฤ…daj na ลผywo'; @@ -2155,7 +2168,7 @@ extension on TranslationsPl { 'auth.quickConnectWaiting' => 'Oczekiwanie na zatwierdzenieโ€ฆ', 'auth.quickConnectCancel' => 'Anuluj', 'auth.quickConnectExpired' => 'Quick Connect wygasล‚. Sprรณbuj ponownie.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'Anuluj', 'common.save' => 'Zapisz', 'common.close' => 'Zamknij', @@ -2239,8 +2252,6 @@ extension on TranslationsPl { 'settings.libraryDensity' => 'Gฤ™stoล›ฤ‡ biblioteki', 'settings.compact' => 'Kompaktowy', 'settings.comfortable' => 'Wygodny', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => 'Tryb widoku', 'settings.gridView' => 'Siatka', 'settings.listView' => 'Lista', @@ -2310,7 +2321,7 @@ extension on TranslationsPl { 'settings.watchTogetherRelay' => 'Relay Oglฤ…daj Razem', 'settings.watchTogetherRelayDescription' => 'Ustaw wล‚asny relay. Wszyscy muszฤ… uลผywaฤ‡ tego samego serwera.', 'settings.watchTogetherRelayHint' => 'https://moj-relay.przyklad.pl', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'Raportowanie bล‚ฤ™dรณw', 'settings.crashReportingDescription' => 'Wysyล‚aj raporty o bล‚ฤ™dach, aby pomรณc ulepszyฤ‡ aplikacjฤ™', 'settings.debugLogging' => 'Logowanie debugowania', @@ -2327,12 +2338,10 @@ extension on TranslationsPl { 'settings.exportSettings' => 'Eksportuj ustawienia', 'settings.exportSettingsDescription' => 'Zapisz swoje preferencje do pliku', 'settings.exportSettingsSuccess' => 'Ustawienia wyeksportowane', - 'settings.exportSettingsFailed' => 'Nie moลผna wyeksportowaฤ‡ ustawieล„', 'settings.importSettings' => 'Importuj ustawienia', 'settings.importSettingsDescription' => 'Przywrรณฤ‡ preferencje z pliku', 'settings.importSettingsConfirm' => 'Bieลผฤ…ce ustawienia zostanฤ… zastฤ…pione. Kontynuowaฤ‡?', 'settings.importSettingsSuccess' => 'Ustawienia zaimportowane', - 'settings.importSettingsFailed' => 'Nie moลผna zaimportowaฤ‡ ustawieล„', 'settings.importSettingsInvalidFile' => 'Ten plik nie jest prawidล‚owym eksportem Plezy', 'settings.importSettingsNoUser' => 'Zaloguj siฤ™ przed importem ustawieล„', 'settings.shortcutsReset' => 'Skrรณty przywrรณcone do domyล›lnych', @@ -2347,6 +2356,7 @@ extension on TranslationsPl { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'Czas musi byฤ‡ miฤ™dzy ${min} a ${max} ${unit}', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'Skrรณt jest juลผ przypisany do ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'Skrรณt zaktualizowany dla ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'Automatyczne pomijanie', 'settings.autoSkipIntro' => 'Automatyczne pomijanie intro', 'settings.autoSkipIntroDescription' => 'Automatycznie pomijaj znaczniki intro po kilku sekundach', @@ -2372,7 +2382,7 @@ extension on TranslationsPl { 'settings.downloadLocationChanged' => 'Lokalizacja pobierania zmieniona', 'settings.downloadLocationReset' => 'Lokalizacja pobierania przywrรณcona do domyล›lnej', 'settings.downloadLocationInvalid' => 'Wybrany folder nie jest zapisywalny', - 'settings.downloadLocationSelectError' => 'Nie udaล‚o siฤ™ wybraฤ‡ folderu', + 'settings.downloadLocationPickerUnavailable' => 'Wybรณr folderu nie jest dostฤ™pny na tym urzฤ…dzeniu', 'settings.downloadOnWifiOnly' => 'Pobieraj tylko przez WiFi', 'settings.downloadOnWifiOnlyDescription' => 'Blokuj pobieranie na danych komรณrkowych', 'settings.autoRemoveWatchedDownloads' => 'Automatycznie usuwaj obejrzane pobrania', @@ -2560,10 +2570,15 @@ extension on TranslationsPl { 'accessibility.hexColor' => 'Kolor szesnastkowy', 'accessibility.expandText' => 'Rozwiล„ tekst', 'accessibility.collapseText' => 'Zwiล„ tekst', + 'accessibility.alphabetNavigation' => 'Nawigacja alfabetyczna', + 'accessibility.alphabetScrollHint' => 'Przesuล„ w gรณrฤ™ lub w dรณล‚, aby przejล›ฤ‡ o literฤ™', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Wiersz ${row} z ${rowCount}, kolumna ${column} z ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Wiersz ${row} z ${rowCount}', 'tooltips.shufflePlay' => 'Odtwarzanie losowe', 'tooltips.playTrailer' => 'Odtwรณrz zwiastun', 'tooltips.markAsWatched' => 'Oznacz jako obejrzane', 'tooltips.markAsUnwatched' => 'Oznacz jako nieobejrzane', + 'audioTracks.track' => ({required Object n}) => 'ลšcieลผka audio ${n}', 'videoControls.audioLabel' => 'Audio', 'videoControls.subtitlesLabel' => 'Napisy', 'videoControls.resetToZero' => 'Zresetuj do 0ms', @@ -2650,20 +2665,20 @@ extension on TranslationsPl { 'messages.markedAsUnwatched' => 'Oznaczono jako nieobejrzane', 'messages.markedAsWatchedOffline' => 'Oznaczono jako obejrzane (zsynchronizuje siฤ™ po poล‚ฤ…czeniu)', 'messages.markedAsUnwatchedOffline' => 'Oznaczono jako nieobejrzane (zsynchronizuje siฤ™ po poล‚ฤ…czeniu)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatycznie usuniฤ™to: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pl'))(n, one: 'Automatycznie usuniฤ™to ${n} obejrzane pobranie', few: 'Automatycznie usuniฤ™to ${n} obejrzane pobrania', many: 'Automatycznie usuniฤ™to ${n} obejrzanych pobraล„', other: 'Automatycznie usuniฤ™to ${n} obejrzanego pobrania', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatycznie usuniฤ™to: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pl'))(n, one: 'Automatycznie usuniฤ™to ${n} obejrzane pobranie', few: 'Automatycznie usuniฤ™to ${n} obejrzane pobrania', many: 'Automatycznie usuniฤ™to ${n} obejrzanych pobraล„', other: 'Automatycznie usuniฤ™to ${n} obejrzanego pobrania', ), 'messages.removedFromContinueWatching' => 'Usuniฤ™to z kontynuowania oglฤ…dania', 'messages.errorLoading' => ({required Object error}) => 'Bล‚ฤ…d: ${error}', 'messages.streamInterrupted' => 'Strumieล„ zostaล‚ przerwany. Naciล›nij odtwarzanie lub przewiล„, aby sprรณbowaฤ‡ ponownie.', 'messages.liveStreamInterrupted' => 'Transmisja na ลผywo zostaล‚a przerwana. Naciล›nij odtwarzanie, aby sprรณbowaฤ‡ ponownie.', 'messages.fileInfoNotAvailable' => 'Informacje o pliku niedostฤ™pne', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'Bล‚ฤ…d ล‚adowania informacji o pliku: ${error}', 'messages.errorLoadingSeries' => 'Bล‚ฤ…d ล‚adowania serialu', 'messages.musicNotSupported' => 'Odtwarzanie muzyki nie jest jeszcze obsล‚ugiwane', @@ -2778,6 +2793,7 @@ extension on TranslationsPl { 'profiles.borrowExplain' => 'Poลผycz poล‚ฤ…czenie z innego profilu. Profile chronione PIN wymagajฤ… PIN-u.', 'profiles.borrowEmpty' => 'Nic do poลผyczenia.', 'profiles.borrowEmptySubtitle' => 'Najpierw poล‚ฤ…cz Plex lub Jellyfin z innym profilem.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'Od ${displayName}', 'profiles.borrowConnectionBorrowed' => 'Poล‚ฤ…czenie poลผyczone.', 'profiles.borrowFailed' => 'Nie udaล‚o siฤ™ poลผyczyฤ‡ poล‚ฤ…czenia.', @@ -3003,7 +3019,7 @@ extension on TranslationsPl { 'liveTv.favorites' => 'Ulubione', 'liveTv.reorderFavorites' => 'Zmieล„ kolejnoล›ฤ‡ ulubionych', 'liveTv.favoritesLoadFailed' => 'Nie udaล‚o siฤ™ wczytaฤ‡ ulubionych. Sprawdลบ poล‚ฤ…czenie i sprรณbuj ponownie.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'Doล‚ฤ…cz do trwajฤ…cej sesji', 'liveTv.watchFromStart' => ({required Object minutes}) => 'Oglฤ…daj od poczฤ…tku (${minutes} min temu)', 'liveTv.watchLive' => 'Oglฤ…daj na ลผywo', @@ -3163,11 +3179,11 @@ extension on TranslationsPl { 'watchTogether.participantLeft' => ({required Object name}) => '${name} opuล›ciล‚', 'watchTogether.participantPaused' => ({required Object name}) => '${name} wstrzymaล‚', 'watchTogether.participantResumed' => ({required Object name}) => '${name} wznowiล‚', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} przewinฤ…ล‚', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} buforuje', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} uลผywa starszej wersji aplikacji โ€” synchronizacja jest niedostฤ™pna', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'Wznawianie bez ${name}', 'watchTogether.waitingForParticipants' => 'Oczekiwanie na zaล‚adowanie u innych...', 'watchTogether.waitingForName' => ({required Object name}) => 'Oczekiwanie na ${name}...', diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index 9c6c030d..27e968ba 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -52,6 +52,7 @@ class TranslationsPt extends Translations with BaseTranslations 'A aguardar aprovaรงรฃoโ€ฆ'; @override String get quickConnectCancel => 'Cancelar'; @override String get quickConnectExpired => 'Quick Connect expirou. Tente novamente.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsPt extends TranslationsSettingsEn { @override String get libraryDensity => 'Densidade da Biblioteca'; @override String get compact => 'Compacto'; @override String get comfortable => 'Confortรกvel'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => 'Modo de Visualizaรงรฃo'; @override String get gridView => 'Grade'; @override String get listView => 'Lista'; @@ -311,7 +310,7 @@ class _TranslationsSettingsPt extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'Relay do Assistir Juntos'; @override String get watchTogetherRelayDescription => 'Defina um relay personalizado. Todos devem usar o mesmo servidor.'; @override String get watchTogetherRelayHint => 'https://meu-relay.exemplo.com.br'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'Relatรณrio de Erros'; @override String get crashReportingDescription => 'Enviar relatรณrios de erros para ajudar a melhorar o app'; @override String get debugLogging => 'Log de Depuraรงรฃo'; @@ -328,12 +327,10 @@ class _TranslationsSettingsPt extends TranslationsSettingsEn { @override String get exportSettings => 'Exportar Configuraรงรตes'; @override String get exportSettingsDescription => 'Salve suas preferรชncias em um arquivo'; @override String get exportSettingsSuccess => 'Configuraรงรตes exportadas'; - @override String get exportSettingsFailed => 'Nรฃo foi possรญvel exportar as configuraรงรตes'; @override String get importSettings => 'Importar Configuraรงรตes'; @override String get importSettingsDescription => 'Restaurar preferรชncias a partir de um arquivo'; @override String get importSettingsConfirm => 'Isso substituirรก suas configuraรงรตes atuais. Continuar?'; @override String get importSettingsSuccess => 'Configuraรงรตes importadas'; - @override String get importSettingsFailed => 'Nรฃo foi possรญvel importar as configuraรงรตes'; @override String get importSettingsInvalidFile => 'Este arquivo nรฃo รฉ uma exportaรงรฃo vรกlida do Plezy'; @override String get importSettingsNoUser => 'Entre na conta antes de importar as configuraรงรตes'; @override String get shortcutsReset => 'Atalhos redefinidos para o padrรฃo'; @@ -348,6 +345,7 @@ class _TranslationsSettingsPt extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'A duraรงรฃo deve ser entre ${min} e ${max} ${unit}'; @override String shortcutAlreadyAssigned({required Object action}) => 'Atalho jรก atribuรญdo a ${action}'; @override String shortcutUpdated({required Object action}) => 'Atalho atualizado para ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'Pular Automaticamente'; @override String get autoSkipIntro => 'Pular Intro Automaticamente'; @override String get autoSkipIntroDescription => 'Pular marcadores de intro automaticamente apรณs alguns segundos'; @@ -373,7 +371,7 @@ class _TranslationsSettingsPt extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'Local de download alterado'; @override String get downloadLocationReset => 'Local de download redefinido para padrรฃo'; @override String get downloadLocationInvalid => 'A pasta selecionada nรฃo permite gravaรงรฃo'; - @override String get downloadLocationSelectError => 'Falha ao selecionar pasta'; + @override String get downloadLocationPickerUnavailable => 'A seleรงรฃo de pasta nรฃo estรก disponรญvel neste dispositivo'; @override String get downloadOnWifiOnly => 'Baixar apenas no WiFi'; @override String get downloadOnWifiOnlyDescription => 'Impedir downloads quando em dados mรณveis'; @override String get autoRemoveWatchedDownloads => 'Remover downloads assistidos automaticamente'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityPt extends TranslationsAccessibilityEn { @override String get hexColor => 'Cor hexadecimal'; @override String get expandText => 'Expandir texto'; @override String get collapseText => 'Recolher texto'; + @override String get alphabetNavigation => 'Navegaรงรฃo alfabรฉtica'; + @override String get alphabetScrollHint => 'Deslize para cima ou para baixo para avanรงar por letra'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Linha ${row} de ${rowCount}, coluna ${column} de ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'Linha ${row} de ${rowCount}'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsPt extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'Marcar como nรฃo assistido'; } +// Path: audioTracks +class _TranslationsAudioTracksPt extends TranslationsAudioTracksEn { + _TranslationsAudioTracksPt._(TranslationsPt root) : this._root = root, super.internal(root); + + final TranslationsPt _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'Faixa de รกudio ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsPt extends TranslationsVideoControlsEn { _TranslationsVideoControlsPt._(TranslationsPt root) : this._root = root, super.internal(root); @@ -712,11 +724,11 @@ class _TranslationsMessagesPt extends TranslationsMessagesEn { @override String get streamInterrupted => 'A transmissรฃo foi interrompida. Toque em reproduzir ou avance para tentar novamente.'; @override String get liveStreamInterrupted => 'A transmissรฃo ao vivo foi interrompida. Toque em reproduzir para tentar novamente.'; @override String get fileInfoNotAvailable => 'Informaรงรตes do arquivo nรฃo disponรญveis'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'Erro ao carregar info do arquivo: ${error}'; @override String get errorLoadingSeries => 'Erro ao carregar sรฉrie'; @override String get musicNotSupported => 'Reproduรงรฃo de mรบsica ainda nรฃo รฉ suportada'; @@ -867,6 +879,7 @@ class _TranslationsProfilesPt extends TranslationsProfilesEn { @override String get borrowExplain => 'Use a conexรฃo de outro perfil. Perfis protegidos por PIN exigem PIN.'; @override String get borrowEmpty => 'Nada para emprestar ainda.'; @override String get borrowEmptySubtitle => 'Conecte Plex ou Jellyfin a outro perfil primeiro.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'De ${displayName}'; @override String get borrowConnectionBorrowed => 'Conexรฃo tomada emprestada.'; @override String get borrowFailed => 'Nรฃo foi possรญvel tomar a conexรฃo emprestada.'; @@ -1150,7 +1163,7 @@ class _TranslationsLiveTvPt extends TranslationsLiveTvEn { @override String get favorites => 'Favoritos'; @override String get reorderFavorites => 'Reordenar favoritos'; @override String get favoritesLoadFailed => 'Nรฃo foi possรญvel carregar os favoritos. Verifique sua conexรฃo e tente novamente.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'Entrar na sessรฃo em andamento'; @override String watchFromStart({required Object minutes}) => 'Assistir do inรญcio (${minutes} min atrรกs)'; @override String get watchLive => 'Assistir ao vivo'; @@ -2149,7 +2162,7 @@ extension on TranslationsPt { 'auth.quickConnectWaiting' => 'A aguardar aprovaรงรฃoโ€ฆ', 'auth.quickConnectCancel' => 'Cancelar', 'auth.quickConnectExpired' => 'Quick Connect expirou. Tente novamente.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'Cancelar', 'common.save' => 'Salvar', 'common.close' => 'Fechar', @@ -2233,8 +2246,6 @@ extension on TranslationsPt { 'settings.libraryDensity' => 'Densidade da Biblioteca', 'settings.compact' => 'Compacto', 'settings.comfortable' => 'Confortรกvel', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => 'Modo de Visualizaรงรฃo', 'settings.gridView' => 'Grade', 'settings.listView' => 'Lista', @@ -2304,7 +2315,7 @@ extension on TranslationsPt { 'settings.watchTogetherRelay' => 'Relay do Assistir Juntos', 'settings.watchTogetherRelayDescription' => 'Defina um relay personalizado. Todos devem usar o mesmo servidor.', 'settings.watchTogetherRelayHint' => 'https://meu-relay.exemplo.com.br', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'Relatรณrio de Erros', 'settings.crashReportingDescription' => 'Enviar relatรณrios de erros para ajudar a melhorar o app', 'settings.debugLogging' => 'Log de Depuraรงรฃo', @@ -2321,12 +2332,10 @@ extension on TranslationsPt { 'settings.exportSettings' => 'Exportar Configuraรงรตes', 'settings.exportSettingsDescription' => 'Salve suas preferรชncias em um arquivo', 'settings.exportSettingsSuccess' => 'Configuraรงรตes exportadas', - 'settings.exportSettingsFailed' => 'Nรฃo foi possรญvel exportar as configuraรงรตes', 'settings.importSettings' => 'Importar Configuraรงรตes', 'settings.importSettingsDescription' => 'Restaurar preferรชncias a partir de um arquivo', 'settings.importSettingsConfirm' => 'Isso substituirรก suas configuraรงรตes atuais. Continuar?', 'settings.importSettingsSuccess' => 'Configuraรงรตes importadas', - 'settings.importSettingsFailed' => 'Nรฃo foi possรญvel importar as configuraรงรตes', 'settings.importSettingsInvalidFile' => 'Este arquivo nรฃo รฉ uma exportaรงรฃo vรกlida do Plezy', 'settings.importSettingsNoUser' => 'Entre na conta antes de importar as configuraรงรตes', 'settings.shortcutsReset' => 'Atalhos redefinidos para o padrรฃo', @@ -2341,6 +2350,7 @@ extension on TranslationsPt { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'A duraรงรฃo deve ser entre ${min} e ${max} ${unit}', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'Atalho jรก atribuรญdo a ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'Atalho atualizado para ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'Pular Automaticamente', 'settings.autoSkipIntro' => 'Pular Intro Automaticamente', 'settings.autoSkipIntroDescription' => 'Pular marcadores de intro automaticamente apรณs alguns segundos', @@ -2366,7 +2376,7 @@ extension on TranslationsPt { 'settings.downloadLocationChanged' => 'Local de download alterado', 'settings.downloadLocationReset' => 'Local de download redefinido para padrรฃo', 'settings.downloadLocationInvalid' => 'A pasta selecionada nรฃo permite gravaรงรฃo', - 'settings.downloadLocationSelectError' => 'Falha ao selecionar pasta', + 'settings.downloadLocationPickerUnavailable' => 'A seleรงรฃo de pasta nรฃo estรก disponรญvel neste dispositivo', 'settings.downloadOnWifiOnly' => 'Baixar apenas no WiFi', 'settings.downloadOnWifiOnlyDescription' => 'Impedir downloads quando em dados mรณveis', 'settings.autoRemoveWatchedDownloads' => 'Remover downloads assistidos automaticamente', @@ -2554,10 +2564,15 @@ extension on TranslationsPt { 'accessibility.hexColor' => 'Cor hexadecimal', 'accessibility.expandText' => 'Expandir texto', 'accessibility.collapseText' => 'Recolher texto', + 'accessibility.alphabetNavigation' => 'Navegaรงรฃo alfabรฉtica', + 'accessibility.alphabetScrollHint' => 'Deslize para cima ou para baixo para avanรงar por letra', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Linha ${row} de ${rowCount}, coluna ${column} de ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Linha ${row} de ${rowCount}', 'tooltips.shufflePlay' => 'Reproduรงรฃo aleatรณria', 'tooltips.playTrailer' => 'Reproduzir trailer', 'tooltips.markAsWatched' => 'Marcar como assistido', 'tooltips.markAsUnwatched' => 'Marcar como nรฃo assistido', + 'audioTracks.track' => ({required Object n}) => 'Faixa de รกudio ${n}', 'videoControls.audioLabel' => 'รudio', 'videoControls.subtitlesLabel' => 'Legendas', 'videoControls.resetToZero' => 'Redefinir para 0ms', @@ -2644,20 +2659,20 @@ extension on TranslationsPt { 'messages.markedAsUnwatched' => 'Marcado como nรฃo assistido', 'messages.markedAsWatchedOffline' => 'Marcado como assistido (serรก sincronizado quando online)', 'messages.markedAsUnwatchedOffline' => 'Marcado como nรฃo assistido (serรก sincronizado quando online)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Removido automaticamente: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))(n, one: 'Removido automaticamente ${n} download assistido', other: 'Removidos automaticamente ${n} downloads assistidos', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Removido automaticamente: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))(n, one: 'Removido automaticamente ${n} download assistido', other: 'Removidos automaticamente ${n} downloads assistidos', ), 'messages.removedFromContinueWatching' => 'Removido de Continuar Assistindo', 'messages.errorLoading' => ({required Object error}) => 'Erro: ${error}', 'messages.streamInterrupted' => 'A transmissรฃo foi interrompida. Toque em reproduzir ou avance para tentar novamente.', 'messages.liveStreamInterrupted' => 'A transmissรฃo ao vivo foi interrompida. Toque em reproduzir para tentar novamente.', 'messages.fileInfoNotAvailable' => 'Informaรงรตes do arquivo nรฃo disponรญveis', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'Erro ao carregar info do arquivo: ${error}', 'messages.errorLoadingSeries' => 'Erro ao carregar sรฉrie', 'messages.musicNotSupported' => 'Reproduรงรฃo de mรบsica ainda nรฃo รฉ suportada', @@ -2772,6 +2787,7 @@ extension on TranslationsPt { 'profiles.borrowExplain' => 'Use a conexรฃo de outro perfil. Perfis protegidos por PIN exigem PIN.', 'profiles.borrowEmpty' => 'Nada para emprestar ainda.', 'profiles.borrowEmptySubtitle' => 'Conecte Plex ou Jellyfin a outro perfil primeiro.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'De ${displayName}', 'profiles.borrowConnectionBorrowed' => 'Conexรฃo tomada emprestada.', 'profiles.borrowFailed' => 'Nรฃo foi possรญvel tomar a conexรฃo emprestada.', @@ -2997,7 +3013,7 @@ extension on TranslationsPt { 'liveTv.favorites' => 'Favoritos', 'liveTv.reorderFavorites' => 'Reordenar favoritos', 'liveTv.favoritesLoadFailed' => 'Nรฃo foi possรญvel carregar os favoritos. Verifique sua conexรฃo e tente novamente.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'Entrar na sessรฃo em andamento', 'liveTv.watchFromStart' => ({required Object minutes}) => 'Assistir do inรญcio (${minutes} min atrรกs)', 'liveTv.watchLive' => 'Assistir ao vivo', @@ -3157,11 +3173,11 @@ extension on TranslationsPt { 'watchTogether.participantLeft' => ({required Object name}) => '${name} saiu', 'watchTogether.participantPaused' => ({required Object name}) => '${name} pausou', 'watchTogether.participantResumed' => ({required Object name}) => '${name} retomou', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} avanรงou', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} estรก carregando', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} estรก em uma versรฃo mais antiga do aplicativo โ€” sincronizaรงรฃo indisponรญvel', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'Retomando sem ${name}', 'watchTogether.waitingForParticipants' => 'Aguardando outros carregarem...', 'watchTogether.waitingForName' => ({required Object name}) => 'Aguardando ${name}...', diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index b783415b..3a2cb641 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -52,6 +52,7 @@ class TranslationsRu extends Translations with BaseTranslations 'ะžะถะธะดะฐะฝะธะต ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธัโ€ฆ'; @override String get quickConnectCancel => 'ะžั‚ะผะตะฝะฐ'; @override String get quickConnectExpired => 'ะกั€ะพะบ Quick Connect ะธัั‚ะตะบ. ะŸะพะฟั€ะพะฑัƒะนั‚ะต ัะฝะพะฒะฐ.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsRu extends TranslationsSettingsEn { @override String get libraryDensity => 'ะŸะปะพั‚ะฝะพัั‚ัŒ ะฑะธะฑะปะธะพั‚ะตะบะธ'; @override String get compact => 'ะšะพะผะฟะฐะบั‚ะฝั‹ะน'; @override String get comfortable => 'ะšะพะผั„ะพั€ั‚ะฝั‹ะน'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => 'ะ ะตะถะธะผ ะฟั€ะพัะผะพั‚ั€ะฐ'; @override String get gridView => 'ะกะตั‚ะบะฐ'; @override String get listView => 'ะกะฟะธัะพะบ'; @@ -311,7 +310,7 @@ class _TranslationsSettingsRu extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'Relay ัะพะฒะผะตัั‚ะฝะพะณะพ ะฟั€ะพัะผะพั‚ั€ะฐ'; @override String get watchTogetherRelayDescription => 'ะ—ะฐะดะฐะนั‚ะต ัะฒะพะน relay. ะ’ัะต ะดะพะปะถะฝั‹ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะพะดะธะฝ ัะตั€ะฒะตั€.'; @override String get watchTogetherRelayHint => 'https://my-relay.example.com'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'ะžั‚ั‡ั‘ั‚ั‹ ะพะฑ ะพัˆะธะฑะบะฐั…'; @override String get crashReportingDescription => 'ะžั‚ะฟั€ะฐะฒะปัั‚ัŒ ะพั‚ั‡ั‘ั‚ั‹ ะพะฑ ะพัˆะธะฑะบะฐั… ะดะปั ัƒะปัƒั‡ัˆะตะฝะธั ะฟั€ะธะปะพะถะตะฝะธั'; @override String get debugLogging => 'ะ–ัƒั€ะฝะฐะป ะพั‚ะปะฐะดะบะธ'; @@ -328,12 +327,10 @@ class _TranslationsSettingsRu extends TranslationsSettingsEn { @override String get exportSettings => 'ะญะบัะฟะพั€ั‚ ะฝะฐัั‚ั€ะพะตะบ'; @override String get exportSettingsDescription => 'ะกะพั…ั€ะฐะฝะธั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ ะฒ ั„ะฐะนะป'; @override String get exportSettingsSuccess => 'ะะฐัั‚ั€ะพะนะบะธ ัะบัะฟะพั€ั‚ะธั€ะพะฒะฐะฝั‹'; - @override String get exportSettingsFailed => 'ะะต ัƒะดะฐะปะพััŒ ัะบัะฟะพั€ั‚ะธั€ะพะฒะฐั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ'; @override String get importSettings => 'ะ˜ะผะฟะพั€ั‚ ะฝะฐัั‚ั€ะพะตะบ'; @override String get importSettingsDescription => 'ะ’ะพััั‚ะฐะฝะพะฒะธั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ ะธะท ั„ะฐะนะปะฐ'; @override String get importSettingsConfirm => 'ะญั‚ะพ ะทะฐะผะตะฝะธั‚ ะฒะฐัˆะธ ั‚ะตะบัƒั‰ะธะต ะฝะฐัั‚ั€ะพะนะบะธ. ะŸั€ะพะดะพะปะถะธั‚ัŒ?'; @override String get importSettingsSuccess => 'ะะฐัั‚ั€ะพะนะบะธ ะธะผะฟะพั€ั‚ะธั€ะพะฒะฐะฝั‹'; - @override String get importSettingsFailed => 'ะะต ัƒะดะฐะปะพััŒ ะธะผะฟะพั€ั‚ะธั€ะพะฒะฐั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ'; @override String get importSettingsInvalidFile => 'ะญั‚ะพั‚ ั„ะฐะนะป ะฝะต ัะฒะปัะตั‚ัั ะดะตะนัั‚ะฒะธั‚ะตะปัŒะฝั‹ะผ ัะบัะฟะพั€ั‚ะพะผ ะฝะฐัั‚ั€ะพะตะบ Plezy'; @override String get importSettingsNoUser => 'ะ’ะพะนะดะธั‚ะต ะฒ ัะธัั‚ะตะผัƒ ะฟะตั€ะตะด ะธะผะฟะพั€ั‚ะพะผ ะฝะฐัั‚ั€ะพะตะบ'; @override String get shortcutsReset => 'ะ“ะพั€ัั‡ะธะต ะบะปะฐะฒะธัˆะธ ัะฑั€ะพัˆะตะฝั‹ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ'; @@ -348,6 +345,7 @@ class _TranslationsSettingsRu extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'ะ”ะปะธั‚ะตะปัŒะฝะพัั‚ัŒ ะดะพะปะถะฝะฐ ะฑั‹ั‚ัŒ ะพั‚ ${min} ะดะพ ${max} ${unit}'; @override String shortcutAlreadyAssigned({required Object action}) => 'ะšะปะฐะฒะธัˆะฐ ัƒะถะต ะฝะฐะทะฝะฐั‡ะตะฝะฐ ะดะปั ${action}'; @override String shortcutUpdated({required Object action}) => 'ะšะปะฐะฒะธัˆะฐ ะพะฑะฝะพะฒะปะตะฝะฐ ะดะปั ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'ะะฒั‚ะพะฟั€ะพะฟัƒัะบ'; @override String get autoSkipIntro => 'ะะฒั‚ะพะฟั€ะพะฟัƒัะบ ะฒัั‚ัƒะฟะปะตะฝะธั'; @override String get autoSkipIntroDescription => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะฟั€ะพะฟัƒัะบะฐั‚ัŒ ะผะฐั€ะบะตั€ั‹ ะฒัั‚ัƒะฟะปะตะฝะธั ั‡ะตั€ะตะท ะฝะตัะบะพะปัŒะบะพ ัะตะบัƒะฝะด'; @@ -373,7 +371,7 @@ class _TranslationsSettingsRu extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'ะœะตัั‚ะพ ะทะฐะณั€ัƒะทะบะธ ะธะทะผะตะฝะตะฝะพ'; @override String get downloadLocationReset => 'ะœะตัั‚ะพ ะทะฐะณั€ัƒะทะบะธ ัะฑั€ะพัˆะตะฝะพ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ'; @override String get downloadLocationInvalid => 'ะ’ั‹ะฑั€ะฐะฝะฝะฐั ะฟะฐะฟะบะฐ ะฝะตะดะพัั‚ัƒะฟะฝะฐ ะดะปั ะทะฐะฟะธัะธ'; - @override String get downloadLocationSelectError => 'ะะต ัƒะดะฐะปะพััŒ ะฒั‹ะฑั€ะฐั‚ัŒ ะฟะฐะฟะบัƒ'; + @override String get downloadLocationPickerUnavailable => 'ะ’ั‹ะฑะพั€ ะฟะฐะฟะบะธ ะฝะตะดะพัั‚ัƒะฟะตะฝ ะฝะฐ ัั‚ะพะผ ัƒัั‚ั€ะพะนัั‚ะฒะต'; @override String get downloadOnWifiOnly => 'ะ—ะฐะณั€ัƒะถะฐั‚ัŒ ั‚ะพะปัŒะบะพ ะฟะพ WiFi'; @override String get downloadOnWifiOnlyDescription => 'ะ—ะฐะฟั€ะตั‚ะธั‚ัŒ ะทะฐะณั€ัƒะทะบัƒ ะฟะพ ะผะพะฑะธะปัŒะฝั‹ะผ ะดะฐะฝะฝั‹ะผ'; @override String get autoRemoveWatchedDownloads => 'ะะฒั‚ะพัƒะดะฐะปะตะฝะธะต ะฟั€ะพัะผะพั‚ั€ะตะฝะฝั‹ั… ะทะฐะณั€ัƒะทะพะบ'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityRu extends TranslationsAccessibilityEn { @override String get hexColor => 'ะจะตัั‚ะฝะฐะดั†ะฐั‚ะตั€ะธั‡ะฝั‹ะน ั†ะฒะตั‚'; @override String get expandText => 'ะ ะฐะทะฒะตั€ะฝัƒั‚ัŒ ั‚ะตะบัั‚'; @override String get collapseText => 'ะกะฒะตั€ะฝัƒั‚ัŒ ั‚ะตะบัั‚'; + @override String get alphabetNavigation => 'ะะฐะฒะธะณะฐั†ะธั ะฟะพ ะฐะปั„ะฐะฒะธั‚ัƒ'; + @override String get alphabetScrollHint => 'ะŸั€ะพะฒะตะดะธั‚ะต ะฒะฒะตั€ั… ะธะปะธ ะฒะฝะธะท ะดะปั ะฟะตั€ะตั…ะพะดะฐ ะฟะพ ะฑัƒะบะฒะฐะผ'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'ะกั‚ั€ะพะบะฐ ${row} ะธะท ${rowCount}, ัั‚ะพะปะฑะตั† ${column} ะธะท ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'ะกั‚ั€ะพะบะฐ ${row} ะธะท ${rowCount}'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsRu extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'ะžั‚ะผะตั‚ะธั‚ัŒ ะบะฐะบ ะฝะตะฟั€ะพัะผะพั‚ั€ะตะฝะฝะพะต'; } +// Path: audioTracks +class _TranslationsAudioTracksRu extends TranslationsAudioTracksEn { + _TranslationsAudioTracksRu._(TranslationsRu root) : this._root = root, super.internal(root); + + final TranslationsRu _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'ะัƒะดะธะพะดะพั€ะพะถะบะฐ ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsRu extends TranslationsVideoControlsEn { _TranslationsVideoControlsRu._(TranslationsRu root) : this._root = root, super.internal(root); @@ -714,11 +726,11 @@ class _TranslationsMessagesRu extends TranslationsMessagesEn { @override String get streamInterrupted => 'ะŸะพั‚ะพะบ ะฟั€ะตั€ะฒะฐะปัั. ะะฐะถะผะธั‚ะต ยซะ’ะพัะฟั€ะพะธะทะฒะตัั‚ะธยป ะธะปะธ ะฟะตั€ะตะผะพั‚ะฐะนั‚ะต, ั‡ั‚ะพะฑั‹ ะฟะพะฒั‚ะพั€ะธั‚ัŒ ะฟะพะฟั‹ั‚ะบัƒ.'; @override String get liveStreamInterrupted => 'ะŸั€ัะผะฐั ั‚ั€ะฐะฝัะปัั†ะธั ะฟั€ะตั€ะฒะฐะปะฐััŒ. ะะฐะถะผะธั‚ะต ยซะ’ะพัะฟั€ะพะธะทะฒะตัั‚ะธยป, ั‡ั‚ะพะฑั‹ ะฟะพะฒั‚ะพั€ะธั‚ัŒ ะฟะพะฟั‹ั‚ะบัƒ.'; @override String get fileInfoNotAvailable => 'ะ˜ะฝั„ะพั€ะผะฐั†ะธั ะพ ั„ะฐะนะปะต ะฝะตะดะพัั‚ัƒะฟะฝะฐ'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'ะžัˆะธะฑะบะฐ ะทะฐะณั€ัƒะทะบะธ ะธะฝั„ะพั€ะผะฐั†ะธะธ ะพ ั„ะฐะนะปะต: ${error}'; @override String get errorLoadingSeries => 'ะžัˆะธะฑะบะฐ ะทะฐะณั€ัƒะทะบะธ ัะตั€ะธะฐะปะฐ'; @override String get musicNotSupported => 'ะ’ะพัะฟั€ะพะธะทะฒะตะดะตะฝะธะต ะผัƒะทั‹ะบะธ ะฟะพะบะฐ ะฝะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ัั'; @@ -869,6 +881,7 @@ class _TranslationsProfilesRu extends TranslationsProfilesEn { @override String get borrowExplain => 'ะ—ะฐะธะผัั‚ะฒัƒะนั‚ะต ะฟะพะดะบะปัŽั‡ะตะฝะธะต ะดั€ัƒะณะพะณะพ ะฟั€ะพั„ะธะปั. ะ”ะปั ะฟั€ะพั„ะธะปะตะน ั PIN ะฝัƒะถะตะฝ PIN.'; @override String get borrowEmpty => 'ะŸะพะบะฐ ะฝะตั‡ะตะณะพ ะทะฐะธะผัั‚ะฒะพะฒะฐั‚ัŒ.'; @override String get borrowEmptySubtitle => 'ะกะฝะฐั‡ะฐะปะฐ ะฟะพะดะบะปัŽั‡ะธั‚ะต Plex ะธะปะธ Jellyfin ะบ ะดั€ัƒะณะพะผัƒ ะฟั€ะพั„ะธะปัŽ.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'ะ˜ะท ${displayName}'; @override String get borrowConnectionBorrowed => 'ะŸะพะดะบะปัŽั‡ะตะฝะธะต ะทะฐะธะผัั‚ะฒะพะฒะฐะฝะพ.'; @override String get borrowFailed => 'ะะต ัƒะดะฐะปะพััŒ ะทะฐะธะผัั‚ะฒะพะฒะฐั‚ัŒ ะฟะพะดะบะปัŽั‡ะตะฝะธะต.'; @@ -1154,7 +1167,7 @@ class _TranslationsLiveTvRu extends TranslationsLiveTvEn { @override String get favorites => 'ะ˜ะทะฑั€ะฐะฝะฝะพะต'; @override String get reorderFavorites => 'ะ˜ะทะผะตะฝะธั‚ัŒ ะฟะพั€ัะดะพะบ ะธะทะฑั€ะฐะฝะฝะพะณะพ'; @override String get favoritesLoadFailed => 'ะะต ัƒะดะฐะปะพััŒ ะทะฐะณั€ัƒะทะธั‚ัŒ ะธะทะฑั€ะฐะฝะฝะพะต. ะŸั€ะพะฒะตั€ัŒั‚ะต ะฟะพะดะบะปัŽั‡ะตะฝะธะต ะธ ะฟะพะฒั‚ะพั€ะธั‚ะต ะฟะพะฟั‹ั‚ะบัƒ.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'ะŸั€ะธัะพะตะดะธะฝะธั‚ัŒัั ะบ ั‚ะตะบัƒั‰ะตะผัƒ ัะตะฐะฝััƒ'; @override String watchFromStart({required Object minutes}) => 'ะกะผะพั‚ั€ะตั‚ัŒ ัะฝะฐั‡ะฐะปะฐ (${minutes} ะผะธะฝ. ะฝะฐะทะฐะด)'; @override String get watchLive => 'ะกะผะพั‚ั€ะตั‚ัŒ ะฒ ะฟั€ัะผะพะผ ัั„ะธั€ะต'; @@ -2155,7 +2168,7 @@ extension on TranslationsRu { 'auth.quickConnectWaiting' => 'ะžะถะธะดะฐะฝะธะต ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธัโ€ฆ', 'auth.quickConnectCancel' => 'ะžั‚ะผะตะฝะฐ', 'auth.quickConnectExpired' => 'ะกั€ะพะบ Quick Connect ะธัั‚ะตะบ. ะŸะพะฟั€ะพะฑัƒะนั‚ะต ัะฝะพะฒะฐ.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'ะžั‚ะผะตะฝะฐ', 'common.save' => 'ะกะพั…ั€ะฐะฝะธั‚ัŒ', 'common.close' => 'ะ—ะฐะบั€ั‹ั‚ัŒ', @@ -2239,8 +2252,6 @@ extension on TranslationsRu { 'settings.libraryDensity' => 'ะŸะปะพั‚ะฝะพัั‚ัŒ ะฑะธะฑะปะธะพั‚ะตะบะธ', 'settings.compact' => 'ะšะพะผะฟะฐะบั‚ะฝั‹ะน', 'settings.comfortable' => 'ะšะพะผั„ะพั€ั‚ะฝั‹ะน', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => 'ะ ะตะถะธะผ ะฟั€ะพัะผะพั‚ั€ะฐ', 'settings.gridView' => 'ะกะตั‚ะบะฐ', 'settings.listView' => 'ะกะฟะธัะพะบ', @@ -2310,7 +2321,7 @@ extension on TranslationsRu { 'settings.watchTogetherRelay' => 'Relay ัะพะฒะผะตัั‚ะฝะพะณะพ ะฟั€ะพัะผะพั‚ั€ะฐ', 'settings.watchTogetherRelayDescription' => 'ะ—ะฐะดะฐะนั‚ะต ัะฒะพะน relay. ะ’ัะต ะดะพะปะถะฝั‹ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะพะดะธะฝ ัะตั€ะฒะตั€.', 'settings.watchTogetherRelayHint' => 'https://my-relay.example.com', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'ะžั‚ั‡ั‘ั‚ั‹ ะพะฑ ะพัˆะธะฑะบะฐั…', 'settings.crashReportingDescription' => 'ะžั‚ะฟั€ะฐะฒะปัั‚ัŒ ะพั‚ั‡ั‘ั‚ั‹ ะพะฑ ะพัˆะธะฑะบะฐั… ะดะปั ัƒะปัƒั‡ัˆะตะฝะธั ะฟั€ะธะปะพะถะตะฝะธั', 'settings.debugLogging' => 'ะ–ัƒั€ะฝะฐะป ะพั‚ะปะฐะดะบะธ', @@ -2327,12 +2338,10 @@ extension on TranslationsRu { 'settings.exportSettings' => 'ะญะบัะฟะพั€ั‚ ะฝะฐัั‚ั€ะพะตะบ', 'settings.exportSettingsDescription' => 'ะกะพั…ั€ะฐะฝะธั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ ะฒ ั„ะฐะนะป', 'settings.exportSettingsSuccess' => 'ะะฐัั‚ั€ะพะนะบะธ ัะบัะฟะพั€ั‚ะธั€ะพะฒะฐะฝั‹', - 'settings.exportSettingsFailed' => 'ะะต ัƒะดะฐะปะพััŒ ัะบัะฟะพั€ั‚ะธั€ะพะฒะฐั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ', 'settings.importSettings' => 'ะ˜ะผะฟะพั€ั‚ ะฝะฐัั‚ั€ะพะตะบ', 'settings.importSettingsDescription' => 'ะ’ะพััั‚ะฐะฝะพะฒะธั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ ะธะท ั„ะฐะนะปะฐ', 'settings.importSettingsConfirm' => 'ะญั‚ะพ ะทะฐะผะตะฝะธั‚ ะฒะฐัˆะธ ั‚ะตะบัƒั‰ะธะต ะฝะฐัั‚ั€ะพะนะบะธ. ะŸั€ะพะดะพะปะถะธั‚ัŒ?', 'settings.importSettingsSuccess' => 'ะะฐัั‚ั€ะพะนะบะธ ะธะผะฟะพั€ั‚ะธั€ะพะฒะฐะฝั‹', - 'settings.importSettingsFailed' => 'ะะต ัƒะดะฐะปะพััŒ ะธะผะฟะพั€ั‚ะธั€ะพะฒะฐั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ', 'settings.importSettingsInvalidFile' => 'ะญั‚ะพั‚ ั„ะฐะนะป ะฝะต ัะฒะปัะตั‚ัั ะดะตะนัั‚ะฒะธั‚ะตะปัŒะฝั‹ะผ ัะบัะฟะพั€ั‚ะพะผ ะฝะฐัั‚ั€ะพะตะบ Plezy', 'settings.importSettingsNoUser' => 'ะ’ะพะนะดะธั‚ะต ะฒ ัะธัั‚ะตะผัƒ ะฟะตั€ะตะด ะธะผะฟะพั€ั‚ะพะผ ะฝะฐัั‚ั€ะพะตะบ', 'settings.shortcutsReset' => 'ะ“ะพั€ัั‡ะธะต ะบะปะฐะฒะธัˆะธ ัะฑั€ะพัˆะตะฝั‹ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ', @@ -2347,6 +2356,7 @@ extension on TranslationsRu { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'ะ”ะปะธั‚ะตะปัŒะฝะพัั‚ัŒ ะดะพะปะถะฝะฐ ะฑั‹ั‚ัŒ ะพั‚ ${min} ะดะพ ${max} ${unit}', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'ะšะปะฐะฒะธัˆะฐ ัƒะถะต ะฝะฐะทะฝะฐั‡ะตะฝะฐ ะดะปั ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'ะšะปะฐะฒะธัˆะฐ ะพะฑะฝะพะฒะปะตะฝะฐ ะดะปั ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'ะะฒั‚ะพะฟั€ะพะฟัƒัะบ', 'settings.autoSkipIntro' => 'ะะฒั‚ะพะฟั€ะพะฟัƒัะบ ะฒัั‚ัƒะฟะปะตะฝะธั', 'settings.autoSkipIntroDescription' => 'ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะฟั€ะพะฟัƒัะบะฐั‚ัŒ ะผะฐั€ะบะตั€ั‹ ะฒัั‚ัƒะฟะปะตะฝะธั ั‡ะตั€ะตะท ะฝะตัะบะพะปัŒะบะพ ัะตะบัƒะฝะด', @@ -2372,7 +2382,7 @@ extension on TranslationsRu { 'settings.downloadLocationChanged' => 'ะœะตัั‚ะพ ะทะฐะณั€ัƒะทะบะธ ะธะทะผะตะฝะตะฝะพ', 'settings.downloadLocationReset' => 'ะœะตัั‚ะพ ะทะฐะณั€ัƒะทะบะธ ัะฑั€ะพัˆะตะฝะพ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ', 'settings.downloadLocationInvalid' => 'ะ’ั‹ะฑั€ะฐะฝะฝะฐั ะฟะฐะฟะบะฐ ะฝะตะดะพัั‚ัƒะฟะฝะฐ ะดะปั ะทะฐะฟะธัะธ', - 'settings.downloadLocationSelectError' => 'ะะต ัƒะดะฐะปะพััŒ ะฒั‹ะฑั€ะฐั‚ัŒ ะฟะฐะฟะบัƒ', + 'settings.downloadLocationPickerUnavailable' => 'ะ’ั‹ะฑะพั€ ะฟะฐะฟะบะธ ะฝะตะดะพัั‚ัƒะฟะตะฝ ะฝะฐ ัั‚ะพะผ ัƒัั‚ั€ะพะนัั‚ะฒะต', 'settings.downloadOnWifiOnly' => 'ะ—ะฐะณั€ัƒะถะฐั‚ัŒ ั‚ะพะปัŒะบะพ ะฟะพ WiFi', 'settings.downloadOnWifiOnlyDescription' => 'ะ—ะฐะฟั€ะตั‚ะธั‚ัŒ ะทะฐะณั€ัƒะทะบัƒ ะฟะพ ะผะพะฑะธะปัŒะฝั‹ะผ ะดะฐะฝะฝั‹ะผ', 'settings.autoRemoveWatchedDownloads' => 'ะะฒั‚ะพัƒะดะฐะปะตะฝะธะต ะฟั€ะพัะผะพั‚ั€ะตะฝะฝั‹ั… ะทะฐะณั€ัƒะทะพะบ', @@ -2560,10 +2570,15 @@ extension on TranslationsRu { 'accessibility.hexColor' => 'ะจะตัั‚ะฝะฐะดั†ะฐั‚ะตั€ะธั‡ะฝั‹ะน ั†ะฒะตั‚', 'accessibility.expandText' => 'ะ ะฐะทะฒะตั€ะฝัƒั‚ัŒ ั‚ะตะบัั‚', 'accessibility.collapseText' => 'ะกะฒะตั€ะฝัƒั‚ัŒ ั‚ะตะบัั‚', + 'accessibility.alphabetNavigation' => 'ะะฐะฒะธะณะฐั†ะธั ะฟะพ ะฐะปั„ะฐะฒะธั‚ัƒ', + 'accessibility.alphabetScrollHint' => 'ะŸั€ะพะฒะตะดะธั‚ะต ะฒะฒะตั€ั… ะธะปะธ ะฒะฝะธะท ะดะปั ะฟะตั€ะตั…ะพะดะฐ ะฟะพ ะฑัƒะบะฒะฐะผ', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'ะกั‚ั€ะพะบะฐ ${row} ะธะท ${rowCount}, ัั‚ะพะปะฑะตั† ${column} ะธะท ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'ะกั‚ั€ะพะบะฐ ${row} ะธะท ${rowCount}', 'tooltips.shufflePlay' => 'ะกะปัƒั‡ะฐะนะฝะพะต ะฒะพัะฟั€ะพะธะทะฒะตะดะตะฝะธะต', 'tooltips.playTrailer' => 'ะ’ะพัะฟั€ะพะธะทะฒะตัั‚ะธ ั‚ั€ะตะนะปะตั€', 'tooltips.markAsWatched' => 'ะžั‚ะผะตั‚ะธั‚ัŒ ะบะฐะบ ะฟั€ะพัะผะพั‚ั€ะตะฝะฝะพะต', 'tooltips.markAsUnwatched' => 'ะžั‚ะผะตั‚ะธั‚ัŒ ะบะฐะบ ะฝะตะฟั€ะพัะผะพั‚ั€ะตะฝะฝะพะต', + 'audioTracks.track' => ({required Object n}) => 'ะัƒะดะธะพะดะพั€ะพะถะบะฐ ${n}', 'videoControls.audioLabel' => 'ะัƒะดะธะพ', 'videoControls.subtitlesLabel' => 'ะกัƒะฑั‚ะธั‚ั€ั‹', 'videoControls.resetToZero' => 'ะกะฑั€ะพัะธั‚ัŒ ะดะพ 0ะผั', @@ -2650,20 +2665,20 @@ extension on TranslationsRu { 'messages.markedAsUnwatched' => 'ะžั‚ะผะตั‡ะตะฝะพ ะบะฐะบ ะฝะตะฟั€ะพัะผะพั‚ั€ะตะฝะฝะพะต', 'messages.markedAsWatchedOffline' => 'ะžั‚ะผะตั‡ะตะฝะพ ะบะฐะบ ะฟั€ะพัะผะพั‚ั€ะตะฝะฝะพะต (ัะธะฝั…ั€ะพะฝะธะทะธั€ัƒะตั‚ัั ะฟั€ะธ ะฟะพะดะบะปัŽั‡ะตะฝะธะธ)', 'messages.markedAsUnwatchedOffline' => 'ะžั‚ะผะตั‡ะตะฝะพ ะบะฐะบ ะฝะตะฟั€ะพัะผะพั‚ั€ะตะฝะฝะพะต (ัะธะฝั…ั€ะพะฝะธะทะธั€ัƒะตั‚ัั ะฟั€ะธ ะฟะพะดะบะปัŽั‡ะตะฝะธะธ)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'ะะฒั‚ะพัƒะดะฐะปะตะฝะพ: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ru'))(n, one: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัƒะดะฐะปะตะฝะฐ ${n} ะฟั€ะพัะผะพั‚ั€ะตะฝะฝะฐั ะทะฐะณั€ัƒะทะบะฐ', few: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัƒะดะฐะปะตะฝั‹ ${n} ะฟั€ะพัะผะพั‚ั€ะตะฝะฝั‹ะต ะทะฐะณั€ัƒะทะบะธ', many: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัƒะดะฐะปะตะฝะพ ${n} ะฟั€ะพัะผะพั‚ั€ะตะฝะฝั‹ั… ะทะฐะณั€ัƒะทะพะบ', other: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัƒะดะฐะปะตะฝะพ ${n} ะฟั€ะพัะผะพั‚ั€ะตะฝะฝะพะน ะทะฐะณั€ัƒะทะบะธ', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'ะะฒั‚ะพัƒะดะฐะปะตะฝะพ: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ru'))(n, one: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัƒะดะฐะปะตะฝะฐ ${n} ะฟั€ะพัะผะพั‚ั€ะตะฝะฝะฐั ะทะฐะณั€ัƒะทะบะฐ', few: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัƒะดะฐะปะตะฝั‹ ${n} ะฟั€ะพัะผะพั‚ั€ะตะฝะฝั‹ะต ะทะฐะณั€ัƒะทะบะธ', many: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัƒะดะฐะปะตะฝะพ ${n} ะฟั€ะพัะผะพั‚ั€ะตะฝะฝั‹ั… ะทะฐะณั€ัƒะทะพะบ', other: 'ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ัƒะดะฐะปะตะฝะพ ${n} ะฟั€ะพัะผะพั‚ั€ะตะฝะฝะพะน ะทะฐะณั€ัƒะทะบะธ', ), 'messages.removedFromContinueWatching' => 'ะฃะดะฐะปะตะฝะพ ะธะท ยซะŸั€ะพะดะพะปะถะธั‚ัŒ ะฟั€ะพัะผะพั‚ั€ยป', 'messages.errorLoading' => ({required Object error}) => 'ะžัˆะธะฑะบะฐ: ${error}', 'messages.streamInterrupted' => 'ะŸะพั‚ะพะบ ะฟั€ะตั€ะฒะฐะปัั. ะะฐะถะผะธั‚ะต ยซะ’ะพัะฟั€ะพะธะทะฒะตัั‚ะธยป ะธะปะธ ะฟะตั€ะตะผะพั‚ะฐะนั‚ะต, ั‡ั‚ะพะฑั‹ ะฟะพะฒั‚ะพั€ะธั‚ัŒ ะฟะพะฟั‹ั‚ะบัƒ.', 'messages.liveStreamInterrupted' => 'ะŸั€ัะผะฐั ั‚ั€ะฐะฝัะปัั†ะธั ะฟั€ะตั€ะฒะฐะปะฐััŒ. ะะฐะถะผะธั‚ะต ยซะ’ะพัะฟั€ะพะธะทะฒะตัั‚ะธยป, ั‡ั‚ะพะฑั‹ ะฟะพะฒั‚ะพั€ะธั‚ัŒ ะฟะพะฟั‹ั‚ะบัƒ.', 'messages.fileInfoNotAvailable' => 'ะ˜ะฝั„ะพั€ะผะฐั†ะธั ะพ ั„ะฐะนะปะต ะฝะตะดะพัั‚ัƒะฟะฝะฐ', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'ะžัˆะธะฑะบะฐ ะทะฐะณั€ัƒะทะบะธ ะธะฝั„ะพั€ะผะฐั†ะธะธ ะพ ั„ะฐะนะปะต: ${error}', 'messages.errorLoadingSeries' => 'ะžัˆะธะฑะบะฐ ะทะฐะณั€ัƒะทะบะธ ัะตั€ะธะฐะปะฐ', 'messages.musicNotSupported' => 'ะ’ะพัะฟั€ะพะธะทะฒะตะดะตะฝะธะต ะผัƒะทั‹ะบะธ ะฟะพะบะฐ ะฝะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ัั', @@ -2778,6 +2793,7 @@ extension on TranslationsRu { 'profiles.borrowExplain' => 'ะ—ะฐะธะผัั‚ะฒัƒะนั‚ะต ะฟะพะดะบะปัŽั‡ะตะฝะธะต ะดั€ัƒะณะพะณะพ ะฟั€ะพั„ะธะปั. ะ”ะปั ะฟั€ะพั„ะธะปะตะน ั PIN ะฝัƒะถะตะฝ PIN.', 'profiles.borrowEmpty' => 'ะŸะพะบะฐ ะฝะตั‡ะตะณะพ ะทะฐะธะผัั‚ะฒะพะฒะฐั‚ัŒ.', 'profiles.borrowEmptySubtitle' => 'ะกะฝะฐั‡ะฐะปะฐ ะฟะพะดะบะปัŽั‡ะธั‚ะต Plex ะธะปะธ Jellyfin ะบ ะดั€ัƒะณะพะผัƒ ะฟั€ะพั„ะธะปัŽ.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'ะ˜ะท ${displayName}', 'profiles.borrowConnectionBorrowed' => 'ะŸะพะดะบะปัŽั‡ะตะฝะธะต ะทะฐะธะผัั‚ะฒะพะฒะฐะฝะพ.', 'profiles.borrowFailed' => 'ะะต ัƒะดะฐะปะพััŒ ะทะฐะธะผัั‚ะฒะพะฒะฐั‚ัŒ ะฟะพะดะบะปัŽั‡ะตะฝะธะต.', @@ -3003,7 +3019,7 @@ extension on TranslationsRu { 'liveTv.favorites' => 'ะ˜ะทะฑั€ะฐะฝะฝะพะต', 'liveTv.reorderFavorites' => 'ะ˜ะทะผะตะฝะธั‚ัŒ ะฟะพั€ัะดะพะบ ะธะทะฑั€ะฐะฝะฝะพะณะพ', 'liveTv.favoritesLoadFailed' => 'ะะต ัƒะดะฐะปะพััŒ ะทะฐะณั€ัƒะทะธั‚ัŒ ะธะทะฑั€ะฐะฝะฝะพะต. ะŸั€ะพะฒะตั€ัŒั‚ะต ะฟะพะดะบะปัŽั‡ะตะฝะธะต ะธ ะฟะพะฒั‚ะพั€ะธั‚ะต ะฟะพะฟั‹ั‚ะบัƒ.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'ะŸั€ะธัะพะตะดะธะฝะธั‚ัŒัั ะบ ั‚ะตะบัƒั‰ะตะผัƒ ัะตะฐะฝััƒ', 'liveTv.watchFromStart' => ({required Object minutes}) => 'ะกะผะพั‚ั€ะตั‚ัŒ ัะฝะฐั‡ะฐะปะฐ (${minutes} ะผะธะฝ. ะฝะฐะทะฐะด)', 'liveTv.watchLive' => 'ะกะผะพั‚ั€ะตั‚ัŒ ะฒ ะฟั€ัะผะพะผ ัั„ะธั€ะต', @@ -3163,11 +3179,11 @@ extension on TranslationsRu { 'watchTogether.participantLeft' => ({required Object name}) => '${name} ะฒั‹ัˆะตะป', 'watchTogether.participantPaused' => ({required Object name}) => '${name} ะฟะพัั‚ะฐะฒะธะป ะฝะฐ ะฟะฐัƒะทัƒ', 'watchTogether.participantResumed' => ({required Object name}) => '${name} ะฒะพะทะพะฑะฝะพะฒะธะป', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} ะฟะตั€ะตะผะพั‚ะฐะป', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} ะฑัƒั„ะตั€ะธะทัƒะตั‚', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} ะธัะฟะพะปัŒะทัƒะตั‚ ัั‚ะฐั€ัƒัŽ ะฒะตั€ัะธัŽ ะฟั€ะธะปะพะถะตะฝะธั โ€” ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธั ะฝะตะดะพัั‚ัƒะฟะฝะฐ', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'ะ’ะพะทะพะฑะฝะพะฒะปะตะฝะธะต ะฑะตะท ${name}', 'watchTogether.waitingForParticipants' => 'ะžะถะธะดะฐะฝะธะต ะทะฐะณั€ัƒะทะบะธ ัƒ ะดั€ัƒะณะธั…...', 'watchTogether.waitingForName' => ({required Object name}) => 'ะžะถะธะดะฐะฝะธะต ${name}...', diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index ccab5580..e338da05 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -52,6 +52,7 @@ class TranslationsSv extends Translations with BaseTranslations 'Vรคntar pรฅ godkรคnnandeโ€ฆ'; @override String get quickConnectCancel => 'Avbryt'; @override String get quickConnectExpired => 'Quick Connect har gรฅtt ut. Fรถrsรถk igen.'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsSv extends TranslationsSettingsEn { @override String get libraryDensity => 'Biblioteksdensitet'; @override String get compact => 'Kompakt'; @override String get comfortable => 'Bekvรคm'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => 'Visningslรคge'; @override String get gridView => 'Rutnรคt'; @override String get listView => 'Lista'; @@ -311,7 +310,7 @@ class _TranslationsSettingsSv extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'Titta Tillsammans-relay'; @override String get watchTogetherRelayDescription => 'Ange en anpassad relay. Alla mรฅste anvรคnda samma server.'; @override String get watchTogetherRelayHint => 'https://min-relay.exempel.se'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'Kraschrapportering'; @override String get crashReportingDescription => 'Skicka kraschrapporter fรถr att fรถrbรคttra appen'; @override String get debugLogging => 'Felsรถkningsloggning'; @@ -328,12 +327,10 @@ class _TranslationsSettingsSv extends TranslationsSettingsEn { @override String get exportSettings => 'Exportera instรคllningar'; @override String get exportSettingsDescription => 'Spara dina instรคllningar till en fil'; @override String get exportSettingsSuccess => 'Instรคllningar exporterade'; - @override String get exportSettingsFailed => 'Kunde inte exportera instรคllningar'; @override String get importSettings => 'Importera instรคllningar'; @override String get importSettingsDescription => 'ร…terstรคll instรคllningar frรฅn en fil'; @override String get importSettingsConfirm => 'Detta ersรคtter dina nuvarande instรคllningar. Fortsรคtta?'; @override String get importSettingsSuccess => 'Instรคllningar importerade'; - @override String get importSettingsFailed => 'Kunde inte importera instรคllningar'; @override String get importSettingsInvalidFile => 'Denna fil รคr inte en giltig Plezy-export'; @override String get importSettingsNoUser => 'Logga in innan du importerar instรคllningar'; @override String get shortcutsReset => 'Genvรคgar รฅterstรคllda till standard'; @@ -348,6 +345,7 @@ class _TranslationsSettingsSv extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'Tiden mรฅste vara mellan ${min} och ${max} ${unit}'; @override String shortcutAlreadyAssigned({required Object action}) => 'Genvรคg redan tilldelad ${action}'; @override String shortcutUpdated({required Object action}) => 'Genvรคg uppdaterad fรถr ${action}'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => 'Auto Hoppa ร–ver'; @override String get autoSkipIntro => 'Hoppa ร–ver Intro Automatiskt'; @override String get autoSkipIntroDescription => 'Hoppa automatiskt รถver intro-markรถrer efter nรฅgra sekunder'; @@ -373,7 +371,7 @@ class _TranslationsSettingsSv extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'Nedladdningsplats รคndrad'; @override String get downloadLocationReset => 'Nedladdningsplats รฅterstรคlld till standard'; @override String get downloadLocationInvalid => 'Vald mapp รคr inte skrivbar'; - @override String get downloadLocationSelectError => 'Kunde inte vรคlja mapp'; + @override String get downloadLocationPickerUnavailable => 'Mappval รคr inte tillgรคngligt pรฅ den hรคr enheten'; @override String get downloadOnWifiOnly => 'Ladda ner endast pรฅ WiFi'; @override String get downloadOnWifiOnlyDescription => 'Fรถrhindra nedladdningar vid anvรคndning av mobildata'; @override String get autoRemoveWatchedDownloads => 'Ta bort sedda nedladdningar automatiskt'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilitySv extends TranslationsAccessibilityEn { @override String get hexColor => 'Hexfรคrg'; @override String get expandText => 'Expandera text'; @override String get collapseText => 'Fรคll ihop text'; + @override String get alphabetNavigation => 'Alfabetisk navigering'; + @override String get alphabetScrollHint => 'Svep upp eller ned fรถr att flytta en bokstav'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rad ${row} av ${rowCount}, kolumn ${column} av ${columnCount}'; + @override String rowPosition({required Object row, required Object rowCount}) => 'Rad ${row} av ${rowCount}'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsSv extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'Markera som osedd'; } +// Path: audioTracks +class _TranslationsAudioTracksSv extends TranslationsAudioTracksEn { + _TranslationsAudioTracksSv._(TranslationsSv root) : this._root = root, super.internal(root); + + final TranslationsSv _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => 'Ljudspรฅr ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsSv extends TranslationsVideoControlsEn { _TranslationsVideoControlsSv._(TranslationsSv root) : this._root = root, super.internal(root); @@ -712,11 +724,11 @@ class _TranslationsMessagesSv extends TranslationsMessagesEn { @override String get streamInterrupted => 'Uppspelningen avbrรถts. Tryck pรฅ play eller spola fรถr att fรถrsรถka igen.'; @override String get liveStreamInterrupted => 'Livestreamen avbrรถts. Tryck pรฅ play fรถr att fรถrsรถka igen.'; @override String get fileInfoNotAvailable => 'Filinformation inte tillgรคnglig'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'Fel vid laddning av filinformation: ${error}'; @override String get errorLoadingSeries => 'Fel vid laddning av serie'; @override String get musicNotSupported => 'Musikuppspelning stรถds inte รคnnu'; @@ -867,6 +879,7 @@ class _TranslationsProfilesSv extends TranslationsProfilesEn { @override String get borrowExplain => 'Lรฅna en annan profils anslutning. PIN-skyddade profiler krรคver en PIN.'; @override String get borrowEmpty => 'Inget att lรฅna รคnnu.'; @override String get borrowEmptySubtitle => 'Anslut Plex eller Jellyfin till en annan profil fรถrst.'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'Frรฅn ${displayName}'; @override String get borrowConnectionBorrowed => 'Anslutning lรฅnad.'; @override String get borrowFailed => 'Kunde inte lรฅna anslutningen.'; @@ -1150,7 +1163,7 @@ class _TranslationsLiveTvSv extends TranslationsLiveTvEn { @override String get favorites => 'Favoriter'; @override String get reorderFavorites => 'Ordna om favoriter'; @override String get favoritesLoadFailed => 'Det gick inte att lรคsa in favoriter. Kontrollera anslutningen och fรถrsรถk igen.'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'Gรฅ med i pรฅgรฅende session'; @override String watchFromStart({required Object minutes}) => 'Titta frรฅn bรถrjan (${minutes} min sedan)'; @override String get watchLive => 'Titta live'; @@ -2149,7 +2162,7 @@ extension on TranslationsSv { 'auth.quickConnectWaiting' => 'Vรคntar pรฅ godkรคnnandeโ€ฆ', 'auth.quickConnectCancel' => 'Avbryt', 'auth.quickConnectExpired' => 'Quick Connect har gรฅtt ut. Fรถrsรถk igen.', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'Avbryt', 'common.save' => 'Spara', 'common.close' => 'Stรคng', @@ -2233,8 +2246,6 @@ extension on TranslationsSv { 'settings.libraryDensity' => 'Biblioteksdensitet', 'settings.compact' => 'Kompakt', 'settings.comfortable' => 'Bekvรคm', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => 'Visningslรคge', 'settings.gridView' => 'Rutnรคt', 'settings.listView' => 'Lista', @@ -2304,7 +2315,7 @@ extension on TranslationsSv { 'settings.watchTogetherRelay' => 'Titta Tillsammans-relay', 'settings.watchTogetherRelayDescription' => 'Ange en anpassad relay. Alla mรฅste anvรคnda samma server.', 'settings.watchTogetherRelayHint' => 'https://min-relay.exempel.se', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'Kraschrapportering', 'settings.crashReportingDescription' => 'Skicka kraschrapporter fรถr att fรถrbรคttra appen', 'settings.debugLogging' => 'Felsรถkningsloggning', @@ -2321,12 +2332,10 @@ extension on TranslationsSv { 'settings.exportSettings' => 'Exportera instรคllningar', 'settings.exportSettingsDescription' => 'Spara dina instรคllningar till en fil', 'settings.exportSettingsSuccess' => 'Instรคllningar exporterade', - 'settings.exportSettingsFailed' => 'Kunde inte exportera instรคllningar', 'settings.importSettings' => 'Importera instรคllningar', 'settings.importSettingsDescription' => 'ร…terstรคll instรคllningar frรฅn en fil', 'settings.importSettingsConfirm' => 'Detta ersรคtter dina nuvarande instรคllningar. Fortsรคtta?', 'settings.importSettingsSuccess' => 'Instรคllningar importerade', - 'settings.importSettingsFailed' => 'Kunde inte importera instรคllningar', 'settings.importSettingsInvalidFile' => 'Denna fil รคr inte en giltig Plezy-export', 'settings.importSettingsNoUser' => 'Logga in innan du importerar instรคllningar', 'settings.shortcutsReset' => 'Genvรคgar รฅterstรคllda till standard', @@ -2341,6 +2350,7 @@ extension on TranslationsSv { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'Tiden mรฅste vara mellan ${min} och ${max} ${unit}', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'Genvรคg redan tilldelad ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'Genvรคg uppdaterad fรถr ${action}', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => 'Auto Hoppa ร–ver', 'settings.autoSkipIntro' => 'Hoppa ร–ver Intro Automatiskt', 'settings.autoSkipIntroDescription' => 'Hoppa automatiskt รถver intro-markรถrer efter nรฅgra sekunder', @@ -2366,7 +2376,7 @@ extension on TranslationsSv { 'settings.downloadLocationChanged' => 'Nedladdningsplats รคndrad', 'settings.downloadLocationReset' => 'Nedladdningsplats รฅterstรคlld till standard', 'settings.downloadLocationInvalid' => 'Vald mapp รคr inte skrivbar', - 'settings.downloadLocationSelectError' => 'Kunde inte vรคlja mapp', + 'settings.downloadLocationPickerUnavailable' => 'Mappval รคr inte tillgรคngligt pรฅ den hรคr enheten', 'settings.downloadOnWifiOnly' => 'Ladda ner endast pรฅ WiFi', 'settings.downloadOnWifiOnlyDescription' => 'Fรถrhindra nedladdningar vid anvรคndning av mobildata', 'settings.autoRemoveWatchedDownloads' => 'Ta bort sedda nedladdningar automatiskt', @@ -2554,10 +2564,15 @@ extension on TranslationsSv { 'accessibility.hexColor' => 'Hexfรคrg', 'accessibility.expandText' => 'Expandera text', 'accessibility.collapseText' => 'Fรคll ihop text', + 'accessibility.alphabetNavigation' => 'Alfabetisk navigering', + 'accessibility.alphabetScrollHint' => 'Svep upp eller ned fรถr att flytta en bokstav', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => 'Rad ${row} av ${rowCount}, kolumn ${column} av ${columnCount}', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => 'Rad ${row} av ${rowCount}', 'tooltips.shufflePlay' => 'Blanda uppspelning', 'tooltips.playTrailer' => 'Spela trailer', 'tooltips.markAsWatched' => 'Markera som sedd', 'tooltips.markAsUnwatched' => 'Markera som osedd', + 'audioTracks.track' => ({required Object n}) => 'Ljudspรฅr ${n}', 'videoControls.audioLabel' => 'Ljud', 'videoControls.subtitlesLabel' => 'Undertexter', 'videoControls.resetToZero' => 'ร…terstรคll till 0ms', @@ -2644,20 +2659,20 @@ extension on TranslationsSv { 'messages.markedAsUnwatched' => 'Markerad som osedd', 'messages.markedAsWatchedOffline' => 'Markerad som sedd (synkroniseras nรคr online)', 'messages.markedAsUnwatchedOffline' => 'Markerad som osedd (synkroniseras nรคr online)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatiskt borttagen: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))(n, one: 'Tog automatiskt bort ${n} sedd nedladdning', other: 'Tog automatiskt bort ${n} sedda nedladdningar', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'Automatiskt borttagen: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))(n, one: 'Tog automatiskt bort ${n} sedd nedladdning', other: 'Tog automatiskt bort ${n} sedda nedladdningar', ), 'messages.removedFromContinueWatching' => 'Borttagen frรฅn Fortsรคtt titta', 'messages.errorLoading' => ({required Object error}) => 'Fel: ${error}', 'messages.streamInterrupted' => 'Uppspelningen avbrรถts. Tryck pรฅ play eller spola fรถr att fรถrsรถka igen.', 'messages.liveStreamInterrupted' => 'Livestreamen avbrรถts. Tryck pรฅ play fรถr att fรถrsรถka igen.', 'messages.fileInfoNotAvailable' => 'Filinformation inte tillgรคnglig', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'Fel vid laddning av filinformation: ${error}', 'messages.errorLoadingSeries' => 'Fel vid laddning av serie', 'messages.musicNotSupported' => 'Musikuppspelning stรถds inte รคnnu', @@ -2772,6 +2787,7 @@ extension on TranslationsSv { 'profiles.borrowExplain' => 'Lรฅna en annan profils anslutning. PIN-skyddade profiler krรคver en PIN.', 'profiles.borrowEmpty' => 'Inget att lรฅna รคnnu.', 'profiles.borrowEmptySubtitle' => 'Anslut Plex eller Jellyfin till en annan profil fรถrst.', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'Frรฅn ${displayName}', 'profiles.borrowConnectionBorrowed' => 'Anslutning lรฅnad.', 'profiles.borrowFailed' => 'Kunde inte lรฅna anslutningen.', @@ -2997,7 +3013,7 @@ extension on TranslationsSv { 'liveTv.favorites' => 'Favoriter', 'liveTv.reorderFavorites' => 'Ordna om favoriter', 'liveTv.favoritesLoadFailed' => 'Det gick inte att lรคsa in favoriter. Kontrollera anslutningen och fรถrsรถk igen.', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'Gรฅ med i pรฅgรฅende session', 'liveTv.watchFromStart' => ({required Object minutes}) => 'Titta frรฅn bรถrjan (${minutes} min sedan)', 'liveTv.watchLive' => 'Titta live', @@ -3157,11 +3173,11 @@ extension on TranslationsSv { 'watchTogether.participantLeft' => ({required Object name}) => '${name} lรคmnade', 'watchTogether.participantPaused' => ({required Object name}) => '${name} pausade', 'watchTogether.participantResumed' => ({required Object name}) => '${name} รฅterupptog', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} spolade', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} buffrar', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} anvรคnder en รคldre appversion โ€” synkronisering รคr inte tillgรคnglig', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'ร…terupptar utan ${name}', 'watchTogether.waitingForParticipants' => 'Vรคntar pรฅ att andra laddar...', 'watchTogether.waitingForName' => ({required Object name}) => 'Vรคntar pรฅ ${name}...', diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index b7a3b098..95354c9b 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -52,6 +52,7 @@ class TranslationsZh extends Translations with BaseTranslations '็ญ‰ๅพ…ๆ‰นๅ‡†โ€ฆ'; @override String get quickConnectCancel => 'ๅ–ๆถˆ'; @override String get quickConnectExpired => 'Quick Connect ๅทฒ่ฟ‡ๆœŸใ€‚่ฏท้‡่ฏ•ใ€‚'; - @override String get localDataRecoveryRequired => ''; + @override String get localDataRecoveryRequired => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.'; } // Path: common @@ -240,8 +241,6 @@ class _TranslationsSettingsZh extends TranslationsSettingsEn { @override String get libraryDensity => 'ๅช’ไฝ“ๅบ“ๅฏ†ๅบฆ'; @override String get compact => '็ดงๅ‡‘'; @override String get comfortable => '่ˆ’้€‚'; - @override String get tvCornerSpotlightBackdrop => ''; - @override String get tvCornerSpotlightBackdropDescription => ''; @override String get viewMode => '่ง†ๅ›พๆจกๅผ'; @override String get gridView => '็ฝ‘ๆ ผ่ง†ๅ›พ'; @override String get listView => 'ๅˆ—่กจ่ง†ๅ›พ'; @@ -311,7 +310,7 @@ class _TranslationsSettingsZh extends TranslationsSettingsEn { @override String get watchTogetherRelay => 'ไธ€่ตท็œ‹ไธญ็ปงๆœๅŠกๅ™จ'; @override String get watchTogetherRelayDescription => '่ฎพ็ฝฎ่‡ชๅฎšไน‰ไธญ็ปงใ€‚ๆ‰€ๆœ‰ไบบๅฟ…้กปไฝฟ็”จๅŒไธ€ๆœๅŠกๅ™จใ€‚'; @override String get watchTogetherRelayHint => 'https://my-relay.example.com'; - @override String get watchTogetherRelayInvalid => ''; + @override String get watchTogetherRelayInvalid => 'Enter a valid HTTP or HTTPS relay base URL.'; @override String get crashReporting => 'ๅดฉๆบƒๆŠฅๅ‘Š'; @override String get crashReportingDescription => 'ๅ‘้€ๅดฉๆบƒๆŠฅๅ‘ŠไปฅๅธฎๅŠฉๆ”น่ฟ›ๅบ”็”จ'; @override String get debugLogging => '่ฐƒ่ฏ•ๆ—ฅๅฟ—'; @@ -328,12 +327,10 @@ class _TranslationsSettingsZh extends TranslationsSettingsEn { @override String get exportSettings => 'ๅฏผๅ‡บ่ฎพ็ฝฎ'; @override String get exportSettingsDescription => 'ๅฐ†ๆ‚จ็š„ๅๅฅฝไฟๅญ˜ๅˆฐๆ–‡ไปถ'; @override String get exportSettingsSuccess => '่ฎพ็ฝฎๅทฒๅฏผๅ‡บ'; - @override String get exportSettingsFailed => 'ๆ— ๆณ•ๅฏผๅ‡บ่ฎพ็ฝฎ'; @override String get importSettings => 'ๅฏผๅ…ฅ่ฎพ็ฝฎ'; @override String get importSettingsDescription => 'ไปŽๆ–‡ไปถๆขๅคๅๅฅฝ'; @override String get importSettingsConfirm => '่ฟ™ๅฐ†ๆ›ฟๆขๆ‚จๅฝ“ๅ‰็š„่ฎพ็ฝฎใ€‚็ปง็ปญๅ—๏ผŸ'; @override String get importSettingsSuccess => '่ฎพ็ฝฎๅทฒๅฏผๅ…ฅ'; - @override String get importSettingsFailed => 'ๆ— ๆณ•ๅฏผๅ…ฅ่ฎพ็ฝฎ'; @override String get importSettingsInvalidFile => 'ๆญคๆ–‡ไปถไธๆ˜ฏๆœ‰ๆ•ˆ็š„ Plezy ่ฎพ็ฝฎๅฏผๅ‡บ'; @override String get importSettingsNoUser => 'ๅฏผๅ…ฅ่ฎพ็ฝฎๅ‰่ฏทๅ…ˆ็™ปๅฝ•'; @override String get shortcutsReset => 'ๅฟซๆท้”ฎๅทฒ้‡็ฝฎไธบ้ป˜่ฎคๅ€ผ'; @@ -348,6 +345,7 @@ class _TranslationsSettingsZh extends TranslationsSettingsEn { @override String validationErrorDuration({required Object min, required Object max, required Object unit}) => 'ๆ—ถ้•ฟๅฟ…้กปไป‹ไบŽ ${min} ๅ’Œ ${max} ${unit} ไน‹้—ด'; @override String shortcutAlreadyAssigned({required Object action}) => 'ๅฟซๆท้”ฎๅทฒ่ขซๅˆ†้…็ป™ ${action}'; @override String shortcutUpdated({required Object action}) => 'ๅฟซๆท้”ฎๅทฒไธบ ${action} ๆ›ดๆ–ฐ'; + @override String get saveFailed => 'Could not save changes. Try again.'; @override String get autoSkip => '่‡ชๅŠจ่ทณ่ฟ‡'; @override String get autoSkipIntro => '่‡ชๅŠจ่ทณ่ฟ‡็‰‡ๅคด'; @override String get autoSkipIntroDescription => 'ๅ‡ ็ง’้’ŸๅŽ่‡ชๅŠจ่ทณ่ฟ‡็‰‡ๅคดๆ ‡่ฎฐ'; @@ -373,7 +371,7 @@ class _TranslationsSettingsZh extends TranslationsSettingsEn { @override String get downloadLocationChanged => 'ไธ‹่ฝฝไฝ็ฝฎๅทฒๆ›ดๆ”น'; @override String get downloadLocationReset => 'ไธ‹่ฝฝไฝ็ฝฎๅทฒ้‡็ฝฎไธบ้ป˜่ฎค'; @override String get downloadLocationInvalid => 'ๆ‰€้€‰ๆ–‡ไปถๅคนไธๅฏๅ†™ๅ…ฅ'; - @override String get downloadLocationSelectError => '้€‰ๆ‹ฉๆ–‡ไปถๅคนๅคฑ่ดฅ'; + @override String get downloadLocationPickerUnavailable => 'ๆญค่ฎพๅค‡ไธๆ”ฏๆŒ้€‰ๆ‹ฉๆ–‡ไปถๅคน'; @override String get downloadOnWifiOnly => 'ไป…ๅœจ WiFi ๆ—ถไธ‹่ฝฝ'; @override String get downloadOnWifiOnlyDescription => 'ไฝฟ็”จ่œ‚็ชๆ•ฐๆฎๆ—ถ็ฆๆญขไธ‹่ฝฝ'; @override String get autoRemoveWatchedDownloads => '่‡ชๅŠจ็งป้™คๅทฒ่ง‚็œ‹็š„ไธ‹่ฝฝ'; @@ -591,6 +589,10 @@ class _TranslationsAccessibilityZh extends TranslationsAccessibilityEn { @override String get hexColor => 'ๅๅ…ญ่ฟ›ๅˆถ้ขœ่‰ฒ'; @override String get expandText => 'ๅฑ•ๅผ€ๆ–‡ๆœฌ'; @override String get collapseText => 'ๆŠ˜ๅ ๆ–‡ๆœฌ'; + @override String get alphabetNavigation => 'ๅญ—ๆฏๅฏผ่ˆช'; + @override String get alphabetScrollHint => 'ไธŠไธ‹ๆป‘ๅŠจไปฅๆŒ‰ๅญ—ๆฏ็งปๅŠจ'; + @override String rowColumnPosition({required Object row, required Object rowCount, required Object column, required Object columnCount}) => '็ฌฌ ${row} ่กŒ๏ผŒๅ…ฑ ${rowCount} ่กŒ๏ผ›็ฌฌ ${column} ๅˆ—๏ผŒๅ…ฑ ${columnCount} ๅˆ—'; + @override String rowPosition({required Object row, required Object rowCount}) => '็ฌฌ ${row} ่กŒ๏ผŒๅ…ฑ ${rowCount} ่กŒ'; } // Path: tooltips @@ -606,6 +608,16 @@ class _TranslationsTooltipsZh extends TranslationsTooltipsEn { @override String get markAsUnwatched => 'ๆ ‡่ฎฐไธบๆœช่ง‚็œ‹'; } +// Path: audioTracks +class _TranslationsAudioTracksZh extends TranslationsAudioTracksEn { + _TranslationsAudioTracksZh._(TranslationsZh root) : this._root = root, super.internal(root); + + final TranslationsZh _root; // ignore: unused_field + + // Translations + @override String track({required Object n}) => '้Ÿณ่ฝจ ${n}'; +} + // Path: videoControls class _TranslationsVideoControlsZh extends TranslationsVideoControlsEn { _TranslationsVideoControlsZh._(TranslationsZh root) : this._root = root, super.internal(root); @@ -711,11 +723,11 @@ class _TranslationsMessagesZh extends TranslationsMessagesEn { @override String get streamInterrupted => '่ง†้ข‘ๆตๅทฒไธญๆ–ญใ€‚ๆŒ‰ๆ’ญๆ”พ้”ฎๆˆ–ๆ‹–ๅŠจ่ฟ›ๅบฆๆก้‡่ฏ•ใ€‚'; @override String get liveStreamInterrupted => '็›ดๆ’ญๆตๅทฒไธญๆ–ญใ€‚ๆŒ‰ๆ’ญๆ”พ้”ฎ้‡่ฏ•ใ€‚'; @override String get fileInfoNotAvailable => 'ๆ–‡ไปถไฟกๆฏไธๅฏ็”จ'; - @override String get playbackAuthenticationRequired => ''; - @override String get playbackServerUnavailable => ''; - @override String get playbackDataInvalid => ''; - @override String get playbackCancelled => ''; - @override String get playbackFailed => ''; + @override String get playbackAuthenticationRequired => 'Sign in to the media server again to play this item.'; + @override String get playbackServerUnavailable => 'The media server is unavailable. Try again later.'; + @override String get playbackDataInvalid => 'The server returned invalid playback information.'; + @override String get playbackCancelled => 'Playback was cancelled.'; + @override String get playbackFailed => 'Playback could not be started.'; @override String errorLoadingFileInfo({required Object error}) => 'ๅŠ ่ฝฝๆ–‡ไปถไฟกๆฏๆ—ถๅ‡บ้”™: ${error}'; @override String get errorLoadingSeries => 'ๅŠ ่ฝฝ็ณปๅˆ—ๆ—ถๅ‡บ้”™'; @override String get musicNotSupported => 'ๅฐšไธๆ”ฏๆŒๆ’ญๆ”พ้Ÿณไน'; @@ -866,6 +878,7 @@ class _TranslationsProfilesZh extends TranslationsProfilesEn { @override String get borrowExplain => 'ๅ€Ÿ็”จๅฆไธ€ไธชไธชไบบ่ต„ๆ–™็š„่ฟžๆŽฅใ€‚ๅ— PIN ไฟๆŠค็š„ไธชไบบ่ต„ๆ–™้œ€่ฆ PINใ€‚'; @override String get borrowEmpty => 'ๆš‚ๆ— ๅฏๅ€Ÿ็”จ็š„ๅ†…ๅฎนใ€‚'; @override String get borrowEmptySubtitle => '่ฏทๅ…ˆๅฐ† Plex ๆˆ– Jellyfin ่ฟžๆŽฅๅˆฐๅฆไธ€ไธชไธชไบบ่ต„ๆ–™ใ€‚'; + @override String get borrowLoadFailed => 'Available connections could not be loaded. Try again.'; @override String borrowFromProfile({required Object displayName}) => 'ๆฅ่‡ช ${displayName}'; @override String get borrowConnectionBorrowed => 'ๅทฒๅ€Ÿ็”จ่ฟžๆŽฅใ€‚'; @override String get borrowFailed => 'ๆ— ๆณ•ๅ€Ÿ็”จ่ฟžๆŽฅใ€‚'; @@ -1148,7 +1161,7 @@ class _TranslationsLiveTvZh extends TranslationsLiveTvEn { @override String get favorites => 'ๆ”ถ่—'; @override String get reorderFavorites => '้‡ๆ–ฐๆŽ’ๅบๆ”ถ่—'; @override String get favoritesLoadFailed => 'ๆ— ๆณ•ๅŠ ่ฝฝๆ”ถ่—ใ€‚่ฏทๆฃ€ๆŸฅ็ฝ‘็ปœ่ฟžๆŽฅๅŽ้‡่ฏ•ใ€‚'; - @override String get favoritesUpdateFailed => ''; + @override String get favoritesUpdateFailed => 'Could not update favorites. Check your connection and try again.'; @override String get joinSession => 'ๅŠ ๅ…ฅๆญฃๅœจ่ฟ›่กŒ็š„ไผš่ฏ'; @override String watchFromStart({required Object minutes}) => 'ไปŽๅคด่ง‚็œ‹๏ผˆ${minutes}ๅˆ†้’Ÿๅ‰ๅผ€ๅง‹๏ผ‰'; @override String get watchLive => '่ง‚็œ‹็›ดๆ’ญ'; @@ -2146,7 +2159,7 @@ extension on TranslationsZh { 'auth.quickConnectWaiting' => '็ญ‰ๅพ…ๆ‰นๅ‡†โ€ฆ', 'auth.quickConnectCancel' => 'ๅ–ๆถˆ', 'auth.quickConnectExpired' => 'Quick Connect ๅทฒ่ฟ‡ๆœŸใ€‚่ฏท้‡่ฏ•ใ€‚', - 'auth.localDataRecoveryRequired' => '', + 'auth.localDataRecoveryRequired' => 'Plezy could not safely recover local sign-in and pending playback data. Please sign in again.', 'common.cancel' => 'ๅ–ๆถˆ', 'common.save' => 'ไฟๅญ˜', 'common.close' => 'ๅ…ณ้—ญ', @@ -2230,8 +2243,6 @@ extension on TranslationsZh { 'settings.libraryDensity' => 'ๅช’ไฝ“ๅบ“ๅฏ†ๅบฆ', 'settings.compact' => '็ดงๅ‡‘', 'settings.comfortable' => '่ˆ’้€‚', - 'settings.tvCornerSpotlightBackdrop' => '', - 'settings.tvCornerSpotlightBackdropDescription' => '', 'settings.viewMode' => '่ง†ๅ›พๆจกๅผ', 'settings.gridView' => '็ฝ‘ๆ ผ่ง†ๅ›พ', 'settings.listView' => 'ๅˆ—่กจ่ง†ๅ›พ', @@ -2301,7 +2312,7 @@ extension on TranslationsZh { 'settings.watchTogetherRelay' => 'ไธ€่ตท็œ‹ไธญ็ปงๆœๅŠกๅ™จ', 'settings.watchTogetherRelayDescription' => '่ฎพ็ฝฎ่‡ชๅฎšไน‰ไธญ็ปงใ€‚ๆ‰€ๆœ‰ไบบๅฟ…้กปไฝฟ็”จๅŒไธ€ๆœๅŠกๅ™จใ€‚', 'settings.watchTogetherRelayHint' => 'https://my-relay.example.com', - 'settings.watchTogetherRelayInvalid' => '', + 'settings.watchTogetherRelayInvalid' => 'Enter a valid HTTP or HTTPS relay base URL.', 'settings.crashReporting' => 'ๅดฉๆบƒๆŠฅๅ‘Š', 'settings.crashReportingDescription' => 'ๅ‘้€ๅดฉๆบƒๆŠฅๅ‘ŠไปฅๅธฎๅŠฉๆ”น่ฟ›ๅบ”็”จ', 'settings.debugLogging' => '่ฐƒ่ฏ•ๆ—ฅๅฟ—', @@ -2318,12 +2329,10 @@ extension on TranslationsZh { 'settings.exportSettings' => 'ๅฏผๅ‡บ่ฎพ็ฝฎ', 'settings.exportSettingsDescription' => 'ๅฐ†ๆ‚จ็š„ๅๅฅฝไฟๅญ˜ๅˆฐๆ–‡ไปถ', 'settings.exportSettingsSuccess' => '่ฎพ็ฝฎๅทฒๅฏผๅ‡บ', - 'settings.exportSettingsFailed' => 'ๆ— ๆณ•ๅฏผๅ‡บ่ฎพ็ฝฎ', 'settings.importSettings' => 'ๅฏผๅ…ฅ่ฎพ็ฝฎ', 'settings.importSettingsDescription' => 'ไปŽๆ–‡ไปถๆขๅคๅๅฅฝ', 'settings.importSettingsConfirm' => '่ฟ™ๅฐ†ๆ›ฟๆขๆ‚จๅฝ“ๅ‰็š„่ฎพ็ฝฎใ€‚็ปง็ปญๅ—๏ผŸ', 'settings.importSettingsSuccess' => '่ฎพ็ฝฎๅทฒๅฏผๅ…ฅ', - 'settings.importSettingsFailed' => 'ๆ— ๆณ•ๅฏผๅ…ฅ่ฎพ็ฝฎ', 'settings.importSettingsInvalidFile' => 'ๆญคๆ–‡ไปถไธๆ˜ฏๆœ‰ๆ•ˆ็š„ Plezy ่ฎพ็ฝฎๅฏผๅ‡บ', 'settings.importSettingsNoUser' => 'ๅฏผๅ…ฅ่ฎพ็ฝฎๅ‰่ฏทๅ…ˆ็™ปๅฝ•', 'settings.shortcutsReset' => 'ๅฟซๆท้”ฎๅทฒ้‡็ฝฎไธบ้ป˜่ฎคๅ€ผ', @@ -2338,6 +2347,7 @@ extension on TranslationsZh { 'settings.validationErrorDuration' => ({required Object min, required Object max, required Object unit}) => 'ๆ—ถ้•ฟๅฟ…้กปไป‹ไบŽ ${min} ๅ’Œ ${max} ${unit} ไน‹้—ด', 'settings.shortcutAlreadyAssigned' => ({required Object action}) => 'ๅฟซๆท้”ฎๅทฒ่ขซๅˆ†้…็ป™ ${action}', 'settings.shortcutUpdated' => ({required Object action}) => 'ๅฟซๆท้”ฎๅทฒไธบ ${action} ๆ›ดๆ–ฐ', + 'settings.saveFailed' => 'Could not save changes. Try again.', 'settings.autoSkip' => '่‡ชๅŠจ่ทณ่ฟ‡', 'settings.autoSkipIntro' => '่‡ชๅŠจ่ทณ่ฟ‡็‰‡ๅคด', 'settings.autoSkipIntroDescription' => 'ๅ‡ ็ง’้’ŸๅŽ่‡ชๅŠจ่ทณ่ฟ‡็‰‡ๅคดๆ ‡่ฎฐ', @@ -2363,7 +2373,7 @@ extension on TranslationsZh { 'settings.downloadLocationChanged' => 'ไธ‹่ฝฝไฝ็ฝฎๅทฒๆ›ดๆ”น', 'settings.downloadLocationReset' => 'ไธ‹่ฝฝไฝ็ฝฎๅทฒ้‡็ฝฎไธบ้ป˜่ฎค', 'settings.downloadLocationInvalid' => 'ๆ‰€้€‰ๆ–‡ไปถๅคนไธๅฏๅ†™ๅ…ฅ', - 'settings.downloadLocationSelectError' => '้€‰ๆ‹ฉๆ–‡ไปถๅคนๅคฑ่ดฅ', + 'settings.downloadLocationPickerUnavailable' => 'ๆญค่ฎพๅค‡ไธๆ”ฏๆŒ้€‰ๆ‹ฉๆ–‡ไปถๅคน', 'settings.downloadOnWifiOnly' => 'ไป…ๅœจ WiFi ๆ—ถไธ‹่ฝฝ', 'settings.downloadOnWifiOnlyDescription' => 'ไฝฟ็”จ่œ‚็ชๆ•ฐๆฎๆ—ถ็ฆๆญขไธ‹่ฝฝ', 'settings.autoRemoveWatchedDownloads' => '่‡ชๅŠจ็งป้™คๅทฒ่ง‚็œ‹็š„ไธ‹่ฝฝ', @@ -2551,10 +2561,15 @@ extension on TranslationsZh { 'accessibility.hexColor' => 'ๅๅ…ญ่ฟ›ๅˆถ้ขœ่‰ฒ', 'accessibility.expandText' => 'ๅฑ•ๅผ€ๆ–‡ๆœฌ', 'accessibility.collapseText' => 'ๆŠ˜ๅ ๆ–‡ๆœฌ', + 'accessibility.alphabetNavigation' => 'ๅญ—ๆฏๅฏผ่ˆช', + 'accessibility.alphabetScrollHint' => 'ไธŠไธ‹ๆป‘ๅŠจไปฅๆŒ‰ๅญ—ๆฏ็งปๅŠจ', + 'accessibility.rowColumnPosition' => ({required Object row, required Object rowCount, required Object column, required Object columnCount}) => '็ฌฌ ${row} ่กŒ๏ผŒๅ…ฑ ${rowCount} ่กŒ๏ผ›็ฌฌ ${column} ๅˆ—๏ผŒๅ…ฑ ${columnCount} ๅˆ—', + 'accessibility.rowPosition' => ({required Object row, required Object rowCount}) => '็ฌฌ ${row} ่กŒ๏ผŒๅ…ฑ ${rowCount} ่กŒ', 'tooltips.shufflePlay' => '้šๆœบๆ’ญๆ”พ', 'tooltips.playTrailer' => 'ๆ’ญๆ”พ้ข„ๅ‘Š็‰‡', 'tooltips.markAsWatched' => 'ๆ ‡่ฎฐไธบๅทฒ่ง‚็œ‹', 'tooltips.markAsUnwatched' => 'ๆ ‡่ฎฐไธบๆœช่ง‚็œ‹', + 'audioTracks.track' => ({required Object n}) => '้Ÿณ่ฝจ ${n}', 'videoControls.audioLabel' => '้Ÿณ้ข‘', 'videoControls.subtitlesLabel' => 'ๅญ—ๅน•', 'videoControls.resetToZero' => '้‡็ฝฎไธบ 0ms', @@ -2641,20 +2656,20 @@ extension on TranslationsZh { 'messages.markedAsUnwatched' => 'ๅทฒๆ ‡่ฎฐไธบๆœช่ง‚็œ‹', 'messages.markedAsWatchedOffline' => 'ๅทฒๆ ‡่ฎฐไธบๅทฒ่ง‚็œ‹ (ๅฐ†ๅœจ่”็ฝ‘ๆ—ถๅŒๆญฅ)', 'messages.markedAsUnwatchedOffline' => 'ๅทฒๆ ‡่ฎฐไธบๆœช่ง‚็œ‹ (ๅฐ†ๅœจ่”็ฝ‘ๆ—ถๅŒๆญฅ)', - 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'ๅทฒ่‡ชๅŠจ็งป้™ค: ${title}', - 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))(n, other: 'ๅทฒ่‡ชๅŠจ็งป้™ค ${n} ไธช็œ‹่ฟ‡็š„ไธ‹่ฝฝ', ), _ => null, } ?? switch (path) { + 'messages.autoRemovedWatchedDownload' => ({required Object title}) => 'ๅทฒ่‡ชๅŠจ็งป้™ค: ${title}', + 'messages.autoRemovedWatchedDownloads' => ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))(n, other: 'ๅทฒ่‡ชๅŠจ็งป้™ค ${n} ไธช็œ‹่ฟ‡็š„ไธ‹่ฝฝ', ), 'messages.removedFromContinueWatching' => 'ๅทฒไปŽ็ปง็ปญ่ง‚็œ‹ไธญ็งป้™ค', 'messages.errorLoading' => ({required Object error}) => '้”™่ฏฏ: ${error}', 'messages.streamInterrupted' => '่ง†้ข‘ๆตๅทฒไธญๆ–ญใ€‚ๆŒ‰ๆ’ญๆ”พ้”ฎๆˆ–ๆ‹–ๅŠจ่ฟ›ๅบฆๆก้‡่ฏ•ใ€‚', 'messages.liveStreamInterrupted' => '็›ดๆ’ญๆตๅทฒไธญๆ–ญใ€‚ๆŒ‰ๆ’ญๆ”พ้”ฎ้‡่ฏ•ใ€‚', 'messages.fileInfoNotAvailable' => 'ๆ–‡ไปถไฟกๆฏไธๅฏ็”จ', - 'messages.playbackAuthenticationRequired' => '', - 'messages.playbackServerUnavailable' => '', - 'messages.playbackDataInvalid' => '', - 'messages.playbackCancelled' => '', - 'messages.playbackFailed' => '', + 'messages.playbackAuthenticationRequired' => 'Sign in to the media server again to play this item.', + 'messages.playbackServerUnavailable' => 'The media server is unavailable. Try again later.', + 'messages.playbackDataInvalid' => 'The server returned invalid playback information.', + 'messages.playbackCancelled' => 'Playback was cancelled.', + 'messages.playbackFailed' => 'Playback could not be started.', 'messages.errorLoadingFileInfo' => ({required Object error}) => 'ๅŠ ่ฝฝๆ–‡ไปถไฟกๆฏๆ—ถๅ‡บ้”™: ${error}', 'messages.errorLoadingSeries' => 'ๅŠ ่ฝฝ็ณปๅˆ—ๆ—ถๅ‡บ้”™', 'messages.musicNotSupported' => 'ๅฐšไธๆ”ฏๆŒๆ’ญๆ”พ้Ÿณไน', @@ -2769,6 +2784,7 @@ extension on TranslationsZh { 'profiles.borrowExplain' => 'ๅ€Ÿ็”จๅฆไธ€ไธชไธชไบบ่ต„ๆ–™็š„่ฟžๆŽฅใ€‚ๅ— PIN ไฟๆŠค็š„ไธชไบบ่ต„ๆ–™้œ€่ฆ PINใ€‚', 'profiles.borrowEmpty' => 'ๆš‚ๆ— ๅฏๅ€Ÿ็”จ็š„ๅ†…ๅฎนใ€‚', 'profiles.borrowEmptySubtitle' => '่ฏทๅ…ˆๅฐ† Plex ๆˆ– Jellyfin ่ฟžๆŽฅๅˆฐๅฆไธ€ไธชไธชไบบ่ต„ๆ–™ใ€‚', + 'profiles.borrowLoadFailed' => 'Available connections could not be loaded. Try again.', 'profiles.borrowFromProfile' => ({required Object displayName}) => 'ๆฅ่‡ช ${displayName}', 'profiles.borrowConnectionBorrowed' => 'ๅทฒๅ€Ÿ็”จ่ฟžๆŽฅใ€‚', 'profiles.borrowFailed' => 'ๆ— ๆณ•ๅ€Ÿ็”จ่ฟžๆŽฅใ€‚', @@ -2994,7 +3010,7 @@ extension on TranslationsZh { 'liveTv.favorites' => 'ๆ”ถ่—', 'liveTv.reorderFavorites' => '้‡ๆ–ฐๆŽ’ๅบๆ”ถ่—', 'liveTv.favoritesLoadFailed' => 'ๆ— ๆณ•ๅŠ ่ฝฝๆ”ถ่—ใ€‚่ฏทๆฃ€ๆŸฅ็ฝ‘็ปœ่ฟžๆŽฅๅŽ้‡่ฏ•ใ€‚', - 'liveTv.favoritesUpdateFailed' => '', + 'liveTv.favoritesUpdateFailed' => 'Could not update favorites. Check your connection and try again.', 'liveTv.joinSession' => 'ๅŠ ๅ…ฅๆญฃๅœจ่ฟ›่กŒ็š„ไผš่ฏ', 'liveTv.watchFromStart' => ({required Object minutes}) => 'ไปŽๅคด่ง‚็œ‹๏ผˆ${minutes}ๅˆ†้’Ÿๅ‰ๅผ€ๅง‹๏ผ‰', 'liveTv.watchLive' => '่ง‚็œ‹็›ดๆ’ญ', @@ -3154,11 +3170,11 @@ extension on TranslationsZh { 'watchTogether.participantLeft' => ({required Object name}) => '${name} ็ฆปๅผ€ไบ†', 'watchTogether.participantPaused' => ({required Object name}) => '${name} ๆš‚ๅœไบ†', 'watchTogether.participantResumed' => ({required Object name}) => '${name} ็ปง็ปญๆ’ญๆ”พไบ†', + _ => null, + } ?? switch (path) { 'watchTogether.participantSeeked' => ({required Object name}) => '${name} ่ทณ่ฝฌไบ†', 'watchTogether.participantBuffering' => ({required Object name}) => '${name} ๆญฃๅœจ็ผ“ๅ†ฒ', 'watchTogether.participantNeedsUpdate' => ({required Object name}) => '${name} ๆญฃๅœจไฝฟ็”จ่พƒๆ—ง็‰ˆๆœฌ็š„ๅบ”็”จ๏ผŒๆ— ๆณ•ๅŒๆญฅ', - _ => null, - } ?? switch (path) { 'watchTogether.resumingWithout' => ({required Object name}) => 'ไธ็ญ‰ๅพ… ${name}๏ผŒ็ปง็ปญๆ’ญๆ”พ', 'watchTogether.waitingForParticipants' => '็ญ‰ๅพ…ๅ…ถไป–ไบบๅŠ ่ฝฝ...', 'watchTogether.waitingForName' => ({required Object name}) => 'ๆญฃๅœจ็ญ‰ๅพ… ${name}...', diff --git a/lib/i18n/sv.i18n.json b/lib/i18n/sv.i18n.json index dd20a8db..6489f48c 100644 --- a/lib/i18n/sv.i18n.json +++ b/lib/i18n/sv.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "Vรคntar pรฅ godkรคnnandeโ€ฆ", "quickConnectCancel": "Avbryt", "quickConnectExpired": "Quick Connect har gรฅtt ut. Fรถrsรถk igen.", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "Avbryt", @@ -180,7 +180,7 @@ "watchTogetherRelay": "Titta Tillsammans-relay", "watchTogetherRelayDescription": "Ange en anpassad relay. Alla mรฅste anvรคnda samma server.", "watchTogetherRelayHint": "https://min-relay.exempel.se", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "Kraschrapportering", "crashReportingDescription": "Skicka kraschrapporter fรถr att fรถrbรคttra appen", "debugLogging": "Felsรถkningsloggning", @@ -197,12 +197,10 @@ "exportSettings": "Exportera instรคllningar", "exportSettingsDescription": "Spara dina instรคllningar till en fil", "exportSettingsSuccess": "Instรคllningar exporterade", - "exportSettingsFailed": "Kunde inte exportera instรคllningar", "importSettings": "Importera instรคllningar", "importSettingsDescription": "ร…terstรคll instรคllningar frรฅn en fil", "importSettingsConfirm": "Detta ersรคtter dina nuvarande instรคllningar. Fortsรคtta?", "importSettingsSuccess": "Instรคllningar importerade", - "importSettingsFailed": "Kunde inte importera instรคllningar", "importSettingsInvalidFile": "Denna fil รคr inte en giltig Plezy-export", "importSettingsNoUser": "Logga in innan du importerar instรคllningar", "shortcutsReset": "Genvรคgar รฅterstรคllda till standard", @@ -217,6 +215,7 @@ "validationErrorDuration": "Tiden mรฅste vara mellan ${min} och ${max} ${unit}", "shortcutAlreadyAssigned": "Genvรคg redan tilldelad ${action}", "shortcutUpdated": "Genvรคg uppdaterad fรถr ${action}", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "Auto Hoppa ร–ver", "autoSkipIntro": "Hoppa ร–ver Intro Automatiskt", "autoSkipIntroDescription": "Hoppa automatiskt รถver intro-markรถrer efter nรฅgra sekunder", @@ -242,7 +241,7 @@ "downloadLocationChanged": "Nedladdningsplats รคndrad", "downloadLocationReset": "Nedladdningsplats รฅterstรคlld till standard", "downloadLocationInvalid": "Vald mapp รคr inte skrivbar", - "downloadLocationSelectError": "Kunde inte vรคlja mapp", + "downloadLocationPickerUnavailable": "Mappval รคr inte tillgรคngligt pรฅ den hรคr enheten", "downloadOnWifiOnly": "Ladda ner endast pรฅ WiFi", "downloadOnWifiOnlyDescription": "Fรถrhindra nedladdningar vid anvรคndning av mobildata", "autoRemoveWatchedDownloads": "Ta bort sedda nedladdningar automatiskt", @@ -443,7 +442,11 @@ "brightness": "Ljusstyrka", "hexColor": "Hexfรคrg", "expandText": "Expandera text", - "collapseText": "Fรคll ihop text" + "collapseText": "Fรคll ihop text", + "alphabetNavigation": "Alfabetisk navigering", + "alphabetScrollHint": "Svep upp eller ned fรถr att flytta en bokstav", + "rowColumnPosition": "Rad ${row} av ${rowCount}, kolumn ${column} av ${columnCount}", + "rowPosition": "Rad ${row} av ${rowCount}" }, "tooltips": { "shufflePlay": "Blanda uppspelning", @@ -451,6 +454,9 @@ "markAsWatched": "Markera som sedd", "markAsUnwatched": "Markera som osedd" }, + "audioTracks": { + "track": "Ljudspรฅr ${n}" + }, "videoControls": { "audioLabel": "Ljud", "subtitlesLabel": "Undertexter", @@ -478,6 +484,8 @@ "playNext": "Spela nรคsta", "playButton": "Spela", "pauseButton": "Pausa", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "Spola bakรฅt ${seconds} sekunder", "seekForwardButton": "Spola framรฅt ${seconds} sekunder", "previousButton": "Fรถregรฅende avsnitt", @@ -553,11 +561,11 @@ "streamInterrupted": "Uppspelningen avbrรถts. Tryck pรฅ play eller spola fรถr att fรถrsรถka igen.", "liveStreamInterrupted": "Livestreamen avbrรถts. Tryck pรฅ play fรถr att fรถrsรถka igen.", "fileInfoNotAvailable": "Filinformation inte tillgรคnglig", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "Fel vid laddning av filinformation: ${error}", "errorLoadingSeries": "Fel vid laddning av serie", "musicNotSupported": "Musikuppspelning stรถds inte รคnnu", @@ -680,6 +688,7 @@ "borrowExplain": "Lรฅna en annan profils anslutning. PIN-skyddade profiler krรคver en PIN.", "borrowEmpty": "Inget att lรฅna รคnnu.", "borrowEmptySubtitle": "Anslut Plex eller Jellyfin till en annan profil fรถrst.", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "Frรฅn ${displayName}", "borrowConnectionBorrowed": "Anslutning lรฅnad.", "borrowFailed": "Kunde inte lรฅna anslutningen.", @@ -944,7 +953,7 @@ "favorites": "Favoriter", "reorderFavorites": "Ordna om favoriter", "favoritesLoadFailed": "Det gick inte att lรคsa in favoriter. Kontrollera anslutningen och fรถrsรถk igen.", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "Gรฅ med i pรฅgรฅende session", "watchFromStart": "Titta frรฅn bรถrjan (${minutes} min sedan)", "watchLive": "Titta live", diff --git a/lib/i18n/zh.i18n.json b/lib/i18n/zh.i18n.json index 8e8da55e..69bf8431 100644 --- a/lib/i18n/zh.i18n.json +++ b/lib/i18n/zh.i18n.json @@ -17,7 +17,7 @@ "quickConnectWaiting": "็ญ‰ๅพ…ๆ‰นๅ‡†โ€ฆ", "quickConnectCancel": "ๅ–ๆถˆ", "quickConnectExpired": "Quick Connect ๅทฒ่ฟ‡ๆœŸใ€‚่ฏท้‡่ฏ•ใ€‚", - "localDataRecoveryRequired": "" + "localDataRecoveryRequired": "Plezy could not safely recover local sign-in and pending playback data. Please sign in again." }, "common": { "cancel": "ๅ–ๆถˆ", @@ -180,7 +180,7 @@ "watchTogetherRelay": "ไธ€่ตท็œ‹ไธญ็ปงๆœๅŠกๅ™จ", "watchTogetherRelayDescription": "่ฎพ็ฝฎ่‡ชๅฎšไน‰ไธญ็ปงใ€‚ๆ‰€ๆœ‰ไบบๅฟ…้กปไฝฟ็”จๅŒไธ€ๆœๅŠกๅ™จใ€‚", "watchTogetherRelayHint": "https://my-relay.example.com", - "watchTogetherRelayInvalid": "", + "watchTogetherRelayInvalid": "Enter a valid HTTP or HTTPS relay base URL.", "crashReporting": "ๅดฉๆบƒๆŠฅๅ‘Š", "crashReportingDescription": "ๅ‘้€ๅดฉๆบƒๆŠฅๅ‘ŠไปฅๅธฎๅŠฉๆ”น่ฟ›ๅบ”็”จ", "debugLogging": "่ฐƒ่ฏ•ๆ—ฅๅฟ—", @@ -197,12 +197,10 @@ "exportSettings": "ๅฏผๅ‡บ่ฎพ็ฝฎ", "exportSettingsDescription": "ๅฐ†ๆ‚จ็š„ๅๅฅฝไฟๅญ˜ๅˆฐๆ–‡ไปถ", "exportSettingsSuccess": "่ฎพ็ฝฎๅทฒๅฏผๅ‡บ", - "exportSettingsFailed": "ๆ— ๆณ•ๅฏผๅ‡บ่ฎพ็ฝฎ", "importSettings": "ๅฏผๅ…ฅ่ฎพ็ฝฎ", "importSettingsDescription": "ไปŽๆ–‡ไปถๆขๅคๅๅฅฝ", "importSettingsConfirm": "่ฟ™ๅฐ†ๆ›ฟๆขๆ‚จๅฝ“ๅ‰็š„่ฎพ็ฝฎใ€‚็ปง็ปญๅ—๏ผŸ", "importSettingsSuccess": "่ฎพ็ฝฎๅทฒๅฏผๅ…ฅ", - "importSettingsFailed": "ๆ— ๆณ•ๅฏผๅ…ฅ่ฎพ็ฝฎ", "importSettingsInvalidFile": "ๆญคๆ–‡ไปถไธๆ˜ฏๆœ‰ๆ•ˆ็š„ Plezy ่ฎพ็ฝฎๅฏผๅ‡บ", "importSettingsNoUser": "ๅฏผๅ…ฅ่ฎพ็ฝฎๅ‰่ฏทๅ…ˆ็™ปๅฝ•", "shortcutsReset": "ๅฟซๆท้”ฎๅทฒ้‡็ฝฎไธบ้ป˜่ฎคๅ€ผ", @@ -217,6 +215,7 @@ "validationErrorDuration": "ๆ—ถ้•ฟๅฟ…้กปไป‹ไบŽ ${min} ๅ’Œ ${max} ${unit} ไน‹้—ด", "shortcutAlreadyAssigned": "ๅฟซๆท้”ฎๅทฒ่ขซๅˆ†้…็ป™ ${action}", "shortcutUpdated": "ๅฟซๆท้”ฎๅทฒไธบ ${action} ๆ›ดๆ–ฐ", + "saveFailed": "Could not save changes. Try again.", "autoSkip": "่‡ชๅŠจ่ทณ่ฟ‡", "autoSkipIntro": "่‡ชๅŠจ่ทณ่ฟ‡็‰‡ๅคด", "autoSkipIntroDescription": "ๅ‡ ็ง’้’ŸๅŽ่‡ชๅŠจ่ทณ่ฟ‡็‰‡ๅคดๆ ‡่ฎฐ", @@ -242,7 +241,7 @@ "downloadLocationChanged": "ไธ‹่ฝฝไฝ็ฝฎๅทฒๆ›ดๆ”น", "downloadLocationReset": "ไธ‹่ฝฝไฝ็ฝฎๅทฒ้‡็ฝฎไธบ้ป˜่ฎค", "downloadLocationInvalid": "ๆ‰€้€‰ๆ–‡ไปถๅคนไธๅฏๅ†™ๅ…ฅ", - "downloadLocationSelectError": "้€‰ๆ‹ฉๆ–‡ไปถๅคนๅคฑ่ดฅ", + "downloadLocationPickerUnavailable": "ๆญค่ฎพๅค‡ไธๆ”ฏๆŒ้€‰ๆ‹ฉๆ–‡ไปถๅคน", "downloadOnWifiOnly": "ไป…ๅœจ WiFi ๆ—ถไธ‹่ฝฝ", "downloadOnWifiOnlyDescription": "ไฝฟ็”จ่œ‚็ชๆ•ฐๆฎๆ—ถ็ฆๆญขไธ‹่ฝฝ", "autoRemoveWatchedDownloads": "่‡ชๅŠจ็งป้™คๅทฒ่ง‚็œ‹็š„ไธ‹่ฝฝ", @@ -443,7 +442,11 @@ "brightness": "ไบฎๅบฆ", "hexColor": "ๅๅ…ญ่ฟ›ๅˆถ้ขœ่‰ฒ", "expandText": "ๅฑ•ๅผ€ๆ–‡ๆœฌ", - "collapseText": "ๆŠ˜ๅ ๆ–‡ๆœฌ" + "collapseText": "ๆŠ˜ๅ ๆ–‡ๆœฌ", + "alphabetNavigation": "ๅญ—ๆฏๅฏผ่ˆช", + "alphabetScrollHint": "ไธŠไธ‹ๆป‘ๅŠจไปฅๆŒ‰ๅญ—ๆฏ็งปๅŠจ", + "rowColumnPosition": "็ฌฌ ${row} ่กŒ๏ผŒๅ…ฑ ${rowCount} ่กŒ๏ผ›็ฌฌ ${column} ๅˆ—๏ผŒๅ…ฑ ${columnCount} ๅˆ—", + "rowPosition": "็ฌฌ ${row} ่กŒ๏ผŒๅ…ฑ ${rowCount} ่กŒ" }, "tooltips": { "shufflePlay": "้šๆœบๆ’ญๆ”พ", @@ -451,6 +454,9 @@ "markAsWatched": "ๆ ‡่ฎฐไธบๅทฒ่ง‚็œ‹", "markAsUnwatched": "ๆ ‡่ฎฐไธบๆœช่ง‚็œ‹" }, + "audioTracks": { + "track": "้Ÿณ่ฝจ ${n}" + }, "videoControls": { "audioLabel": "้Ÿณ้ข‘", "subtitlesLabel": "ๅญ—ๅน•", @@ -478,6 +484,8 @@ "playNext": "ๆ’ญๆ”พไธ‹ไธ€้›†", "playButton": "ๆ’ญๆ”พ", "pauseButton": "ๆš‚ๅœ", + "showPlaybackControls": "", + "hidePlaybackControls": "", "seekBackwardButton": "ๅŽ้€€ ${seconds} ็ง’", "seekForwardButton": "ๅ‰่ฟ› ${seconds} ็ง’", "previousButton": "ไธŠไธ€้›†", @@ -552,11 +560,11 @@ "streamInterrupted": "่ง†้ข‘ๆตๅทฒไธญๆ–ญใ€‚ๆŒ‰ๆ’ญๆ”พ้”ฎๆˆ–ๆ‹–ๅŠจ่ฟ›ๅบฆๆก้‡่ฏ•ใ€‚", "liveStreamInterrupted": "็›ดๆ’ญๆตๅทฒไธญๆ–ญใ€‚ๆŒ‰ๆ’ญๆ”พ้”ฎ้‡่ฏ•ใ€‚", "fileInfoNotAvailable": "ๆ–‡ไปถไฟกๆฏไธๅฏ็”จ", - "playbackAuthenticationRequired": "", - "playbackServerUnavailable": "", - "playbackDataInvalid": "", - "playbackCancelled": "", - "playbackFailed": "", + "playbackAuthenticationRequired": "Sign in to the media server again to play this item.", + "playbackServerUnavailable": "The media server is unavailable. Try again later.", + "playbackDataInvalid": "The server returned invalid playback information.", + "playbackCancelled": "Playback was cancelled.", + "playbackFailed": "Playback could not be started.", "errorLoadingFileInfo": "ๅŠ ่ฝฝๆ–‡ไปถไฟกๆฏๆ—ถๅ‡บ้”™: ${error}", "errorLoadingSeries": "ๅŠ ่ฝฝ็ณปๅˆ—ๆ—ถๅ‡บ้”™", "musicNotSupported": "ๅฐšไธๆ”ฏๆŒๆ’ญๆ”พ้Ÿณไน", @@ -679,6 +687,7 @@ "borrowExplain": "ๅ€Ÿ็”จๅฆไธ€ไธชไธชไบบ่ต„ๆ–™็š„่ฟžๆŽฅใ€‚ๅ— PIN ไฟๆŠค็š„ไธชไบบ่ต„ๆ–™้œ€่ฆ PINใ€‚", "borrowEmpty": "ๆš‚ๆ— ๅฏๅ€Ÿ็”จ็š„ๅ†…ๅฎนใ€‚", "borrowEmptySubtitle": "่ฏทๅ…ˆๅฐ† Plex ๆˆ– Jellyfin ่ฟžๆŽฅๅˆฐๅฆไธ€ไธชไธชไบบ่ต„ๆ–™ใ€‚", + "borrowLoadFailed": "Available connections could not be loaded. Try again.", "borrowFromProfile": "ๆฅ่‡ช ${displayName}", "borrowConnectionBorrowed": "ๅทฒๅ€Ÿ็”จ่ฟžๆŽฅใ€‚", "borrowFailed": "ๆ— ๆณ•ๅ€Ÿ็”จ่ฟžๆŽฅใ€‚", @@ -942,7 +951,7 @@ "favorites": "ๆ”ถ่—", "reorderFavorites": "้‡ๆ–ฐๆŽ’ๅบๆ”ถ่—", "favoritesLoadFailed": "ๆ— ๆณ•ๅŠ ่ฝฝๆ”ถ่—ใ€‚่ฏทๆฃ€ๆŸฅ็ฝ‘็ปœ่ฟžๆŽฅๅŽ้‡่ฏ•ใ€‚", - "favoritesUpdateFailed": "", + "favoritesUpdateFailed": "Could not update favorites. Check your connection and try again.", "joinSession": "ๅŠ ๅ…ฅๆญฃๅœจ่ฟ›่กŒ็š„ไผš่ฏ", "watchFromStart": "ไปŽๅคด่ง‚็œ‹๏ผˆ${minutes}ๅˆ†้’Ÿๅ‰ๅผ€ๅง‹๏ผ‰", "watchLive": "่ง‚็œ‹็›ดๆ’ญ", diff --git a/lib/mixins/grid_focus_node_mixin.dart b/lib/mixins/grid_focus_node_mixin.dart index ae5e334a..9bc58530 100644 --- a/lib/mixins/grid_focus_node_mixin.dart +++ b/lib/mixins/grid_focus_node_mixin.dart @@ -59,10 +59,12 @@ mixin GridFocusNodeMixin on State { } } for (final key in keysToRemove) { - final node = gridItemFocusNodes.remove(key); - if (node != null && !node.hasFocus) { - node.dispose(); - } + final node = gridItemFocusNodes[key]; + // A focused node is still borrowed by its mounted card. Keep ownership + // and indexed identity until a later eviction or final teardown. + if (node == null || node.hasFocus) continue; + gridItemFocusNodes.remove(key); + node.dispose(); } } diff --git a/lib/models/shader_preset.dart b/lib/models/shader_preset.dart index daa80132..e55f9e88 100644 --- a/lib/models/shader_preset.dart +++ b/lib/models/shader_preset.dart @@ -208,38 +208,36 @@ class ShaderPreset { return ''; } - static List get allPresets { - return [ - none, - nvscalerDefault, - artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.neutral), - artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.denoise), - artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.denoiseSharpen), - artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.neutral), - artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.denoise), - artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.denoiseSharpen), - anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeA), - anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeB), - anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeC), - anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeAA), - anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeBB), - anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeCA), - anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeA), - anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeB), - anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeC), - anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeAA), - anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeBB), - anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeCA), - ]; - } + static final List _builtInPresets = List.unmodifiable([ + none, + nvscalerDefault, + artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.neutral), + artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.denoise), + artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.denoiseSharpen), + artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.neutral), + artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.denoise), + artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.denoiseSharpen), + anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeA), + anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeB), + anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeC), + anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeAA), + anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeBB), + anime4kPreset(Anime4KQuality.fast, Anime4KMode.modeCA), + anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeA), + anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeB), + anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeC), + anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeAA), + anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeBB), + anime4kPreset(Anime4KQuality.hq, Anime4KMode.modeCA), + ]); - static ShaderPreset? fromId(String id) { - try { - return allPresets.firstWhere((p) => p.id == id); - } catch (_) { - return null; - } - } + static final Map _builtInPresetsById = Map.unmodifiable({ + for (final preset in _builtInPresets) preset.id: preset, + }); + + static List get allPresets => _builtInPresets; + + static ShaderPreset? fromId(String id) => _builtInPresetsById[id]; bool get isEnabled => type != ShaderPresetType.none; diff --git a/lib/providers/shader_provider.dart b/lib/providers/shader_provider.dart index ae9e12da..38c33dc7 100644 --- a/lib/providers/shader_provider.dart +++ b/lib/providers/shader_provider.dart @@ -15,6 +15,7 @@ class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin { ShaderPreset _savedPreset = ShaderPreset.none; ShaderPreset _currentPreset = ShaderPreset.none; List _customPresets = []; + List _allPresets = ShaderPreset.allPresets; bool _initialized = false; ShaderProvider() { @@ -26,9 +27,22 @@ class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin { } void _syncFromSettings(SettingsService service) { - final customData = service.read(SettingsService.customShaderPresets); - final customPresets = customData.map((json) => ShaderPreset.fromJson(json)).toList(); + final customPresets = []; + for (final json in service.read(SettingsService.customShaderPresets)) { + try { + final preset = ShaderPreset.fromJson(json); + final fileName = preset.fileName; + if (preset.type == ShaderPresetType.custom && + fileName != null && + ShaderAssetLoader.isValidCustomShaderFileName(fileName)) { + customPresets.add(preset); + } + } on Object { + // Imported settings can contain structurally invalid custom rows. + } + } _customPresets = customPresets; + _refreshAllPresets(); final presetId = service.read(SettingsService.globalShaderPreset); _savedPreset = findPresetById(presetId) ?? ShaderPreset.none; @@ -47,7 +61,7 @@ class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin { bool get initialized => _initialized; ShaderPreset get savedPreset => _savedPreset; ShaderPreset get currentPreset => _currentPreset; - List get allPresets => [...ShaderPreset.allPresets, ..._customPresets]; + List get allPresets => _allPresets; List get customPresets => _customPresets; bool get isShaderEnabled => _currentPreset.type != ShaderPresetType.none; @@ -83,6 +97,7 @@ class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin { final preset = ShaderPreset(id: id, name: displayName, type: ShaderPresetType.custom, fileName: storedFileName); _customPresets.add(preset); + _refreshAllPresets(); await _saveCustomPresets(); return preset; } @@ -94,6 +109,7 @@ class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin { await ShaderAssetLoader.deleteCustomShader(preset.fileName!); } _customPresets.removeWhere((p) => p.id == preset.id); + _refreshAllPresets(); await _saveCustomPresets(); // Reset to none if the deleted preset was active @@ -102,6 +118,12 @@ class ShaderProvider extends ChangeNotifier with DisposableChangeNotifierMixin { } } + void _refreshAllPresets() { + _allPresets = _customPresets.isEmpty + ? ShaderPreset.allPresets + : List.unmodifiable([...ShaderPreset.allPresets, ..._customPresets]); + } + Future _saveCustomPresets() async { final service = _settingsBinding.settings ?? await SettingsService.getInstance(); final data = _customPresets.map((p) => p.toJson()).toList(); diff --git a/lib/screens/catalog_item_detail_screen.dart b/lib/screens/catalog_item_detail_screen.dart index eb3d9b6e..143a5104 100644 --- a/lib/screens/catalog_item_detail_screen.dart +++ b/lib/screens/catalog_item_detail_screen.dart @@ -10,6 +10,7 @@ import '../focus/focusable_action_bar.dart'; import '../focus/dpad_navigator.dart'; import '../focus/input_mode_tracker.dart'; import '../focus/key_event_utils.dart'; +import '../focus/locked_hub_controller.dart'; import '../i18n/strings.g.dart'; import '../media/media_hub.dart'; import '../media/media_item.dart'; @@ -52,9 +53,11 @@ class CatalogItemDetailScreen extends StatefulWidget { class _CatalogItemDetailScreenState extends State { final _actionBarKey = GlobalKey(); + final _backButtonFocusNode = FocusNode(debugLabel: 'catalog_detail_back'); final _castSectionKey = GlobalKey(); final _castStripKey = GlobalKey(); final _relatedSectionKey = GlobalKey(); + final _hubFocusMemory = HubFocusMemory(); final ScrollController _scrollController = ScrollController(); List _libraryMatchFocusNodes = const []; CatalogSource? _watchlistSource; @@ -101,6 +104,7 @@ class _CatalogItemDetailScreenState extends State { @override void dispose() { + _backButtonFocusNode.dispose(); _watchlistSource?.watchlistChanges.removeListener(_onWatchlistChanged); for (final node in _libraryMatchFocusNodes) { node.dispose(); @@ -441,6 +445,7 @@ class _CatalogItemDetailScreenState extends State { items: [for (final item in related) item.toMediaItem()], size: related.length, ), + focusMemory: _hubFocusMemory, icon: Symbols.recommend_rounded, inset: true, onNavigateUp: _focusSectionAboveRelated, @@ -561,7 +566,7 @@ class _CatalogItemDetailScreenState extends State { ? t.explore.removeFromWatchlist : t.explore.addToWatchlist, onPressed: onWatchlist == null - ? () {} + ? null : () => unawaited(_toggleWatchlist()), ), if (_requestSource case final SeerrCatalogSource seerr) @@ -608,7 +613,7 @@ class _CatalogItemDetailScreenState extends State { top: 0, left: 0, child: DesktopAppBarHelper.buildAdjustedLeading( - const AppBarBackButton(style: BackButtonStyle.circular), + AppBarBackButton(style: BackButtonStyle.circular, focusNode: _backButtonFocusNode), context: hostContext, )!, ), diff --git a/lib/screens/discover_screen.dart b/lib/screens/discover_screen.dart index 2bd853c6..39f5aaae 100644 --- a/lib/screens/discover_screen.dart +++ b/lib/screens/discover_screen.dart @@ -10,6 +10,7 @@ import 'package:material_symbols_icons/symbols.dart'; import 'package:provider/provider.dart'; import '../focus/focusable_action_bar.dart'; import '../focus/hub_vertical_navigation.dart'; +import '../focus/locked_hub_controller.dart'; import '../focus/input_mode_tracker.dart'; import '../focus/key_event_utils.dart'; import 'package:cached_network_image_ce/cached_network_image.dart'; @@ -112,6 +113,7 @@ class _DiscoverScreenState extends State final Map> _hubKeysByIdentity = {}; List> _orderedHubKeys = const []; final _tvBrowseRailKey = GlobalKey(); + final _hubFocusMemory = HubFocusMemory(); // Hero and app bar focus late FocusNode _heroFocusNode; @@ -1045,6 +1047,7 @@ class _DiscoverScreenState extends State more: _hasMoreContinueWatching, items: _onDeck, ), + focusMemory: _hubFocusMemory, icon: Symbols.play_circle_rounded, onRefresh: _discover.updateItem, onRemoveFromContinueWatching: _discover.refreshContinueWatching, @@ -1062,6 +1065,7 @@ class _DiscoverScreenState extends State child: HubSection( key: i < _orderedHubKeys.length ? _orderedHubKeys[i] : null, hub: _hubs[i], + focusMemory: _hubFocusMemory, icon: _getHubIcon(_hubs[i].title), showServerName: showServerNameOnHubs || hubsSpanMultipleServers, onRefresh: _discover.updateItem, @@ -1146,6 +1150,7 @@ class _DiscoverScreenState extends State return _tvBrowseRailWidget = TvBrowseRail( key: _tvBrowseRailKey, hubs: browseHubs, + focusMemory: _hubFocusMemory, showServerName: showServerName, iconForHub: (hub, _) => hub.id == 'continue_watching' ? Symbols.play_circle_rounded : _getHubIcon(hub.title), onFocusedItemChanged: _setSpotlightItem, diff --git a/lib/screens/explore_screen.dart b/lib/screens/explore_screen.dart index ff859f83..0d3550f7 100644 --- a/lib/screens/explore_screen.dart +++ b/lib/screens/explore_screen.dart @@ -6,6 +6,7 @@ import 'package:provider/provider.dart'; import '../focus/focusable_action_bar.dart'; import '../focus/hub_vertical_navigation.dart'; +import '../focus/locked_hub_controller.dart'; import '../i18n/strings.g.dart'; import '../media/ids.dart'; import '../media/media_hub.dart'; @@ -54,6 +55,7 @@ class ExploreScreenState extends State final _sourceMenuKey = GlobalKey>(); final _tvBrowseRailKey = GlobalKey(); + final _hubFocusMemory = HubFocusMemory(); final TvSpotlightController _spotlight = TvSpotlightController(); @override @@ -302,6 +304,7 @@ class ExploreScreenState extends State child: HubSection( key: _orderedHubKeys[i], hub: rowHubs[i].hub, + focusMemory: _hubFocusMemory, icon: _rowIcon(rowHubs[i].row), loadMoreItems: rowHubs[i].hub.more ? () => _explore.loadAllForHub(rowHubs[i]) : null, onVerticalNavigation: (isUp) => _handleVerticalNavigation(i, isUp), @@ -431,6 +434,7 @@ class ExploreScreenState extends State child: TvBrowseRail( key: _tvBrowseRailKey, hubs: tvHubs, + focusMemory: _hubFocusMemory, iconForHub: (hub, _) => _rowIcon(_rowForHub(hub)?.row), onFocusedItemChanged: _setSpotlightItem, loadMoreItems: (hub) { diff --git a/lib/screens/focusable_detail_screen_mixin.dart b/lib/screens/focusable_detail_screen_mixin.dart index 37b7bba8..02c7bc9c 100644 --- a/lib/screens/focusable_detail_screen_mixin.dart +++ b/lib/screens/focusable_detail_screen_mixin.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import '../focus/focusable_action_bar.dart'; import '../focus/input_mode_tracker.dart'; import '../focus/key_event_utils.dart'; +import '../i18n/strings.g.dart'; import '../media/media_item.dart'; import '../media/media_playlist.dart'; import '../mixins/grid_focus_node_mixin.dart'; @@ -195,6 +196,7 @@ mixin FocusableDetailScreenMixin on State, GridFocu key: Key(_idForItem(item)), item: item, focusNode: focusNode, + semanticValue: _semanticPosition(position), disableScale: position.disableScale, onRefresh: onRefresh, collectionId: collectionId, @@ -233,7 +235,8 @@ mixin FocusableDetailScreenMixin on State, GridFocu final fullCardLayout = PlatformDetector.isTV() && svc.read(SettingsService.tvFullCardLayout); final useFullCardLayout = fullCardLayout && shape != CardShape.square; - Widget buildTile(int index, {required bool inFirstRow, required bool disableScale}) { + Widget buildTile(MediaCardSliverPosition position) { + final index = position.index; final item = itemAt(index); if (item == null) { onSkeletonVisible?.call(index); @@ -244,13 +247,14 @@ mixin FocusableDetailScreenMixin on State, GridFocu key: Key(item.id), item: item, focusNode: focusNode, - disableScale: disableScale, + semanticValue: _semanticPosition(position), + disableScale: position.disableScale, onRefresh: onRefresh, collectionId: collectionId, onListRefresh: onListRefresh, - fullBleedImage: useFullCardLayout && !disableScale, + fullBleedImage: useFullCardLayout && position.isGrid, cardShapeOverride: shape, - onNavigateUp: inFirstRow ? navigateToAppBar : null, + onNavigateUp: position.isFirstRow ? navigateToAppBar : null, onBack: handleBackFromContent, onFocusChange: (hasFocus) => trackGridItemFocus(index, hasFocus), ); @@ -263,10 +267,23 @@ mixin FocusableDetailScreenMixin on State, GridFocu padding: const EdgeInsets.all(8), fullBleedImage: useFullCardLayout, shape: shape, - itemBuilder: (context, position) => - buildTile(position.index, inFirstRow: position.isFirstRow, disableScale: position.disableScale), + itemBuilder: (context, position) => buildTile(position), ); }, ); } + + String _semanticPosition(MediaCardSliverPosition position) { + if (!position.isGrid) { + return t.accessibility.rowPosition(row: position.index + 1, rowCount: position.itemCount); + } + + final rowCount = (position.itemCount + position.columnCount - 1) ~/ position.columnCount; + return t.accessibility.rowColumnPosition( + row: position.index ~/ position.columnCount + 1, + rowCount: rowCount, + column: position.index % position.columnCount + 1, + columnCount: position.columnCount, + ); + } } diff --git a/lib/screens/libraries/alpha_jump_bar.dart b/lib/screens/libraries/alpha_jump_bar.dart index d22a40c2..aff12331 100644 --- a/lib/screens/libraries/alpha_jump_bar.dart +++ b/lib/screens/libraries/alpha_jump_bar.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import '../../focus/key_event_utils.dart'; +import '../../i18n/strings.g.dart'; import '../../media/library_first_character.dart'; import '../../widgets/clickable_cursor.dart'; import 'alpha_jump_helper.dart'; @@ -217,73 +218,89 @@ class _AlphaJumpBarState extends State { final markerSize = (letterSlotHeight - 2).clamp(10.0, 18.0).toDouble(); final fontSize = (letterSlotHeight * 0.58).clamp(7.0, 10.0).toDouble(); - return ClickableCursor( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTapDown: (details) { - final idx = _letterIndexFromDy(details.localPosition.dy, constraints.maxHeight); - setState(() => _highlightedIndex = idx); - _jumpToLetter(_displayed[idx]); - }, - onVerticalDragUpdate: (details) { - final idx = _letterIndexFromDy(details.localPosition.dy, constraints.maxHeight); - if (idx != _highlightedIndex) { + return Semantics( + container: true, + explicitChildNodes: true, + label: t.accessibility.alphabetNavigation, + child: ClickableCursor( + child: GestureDetector( + excludeFromSemantics: true, + behavior: HitTestBehavior.opaque, + onTapDown: (details) { + final idx = _letterIndexFromDy(details.localPosition.dy, constraints.maxHeight); setState(() => _highlightedIndex = idx); _jumpToLetter(_displayed[idx]); - } - }, - child: Container( - width: 20, - decoration: BoxDecoration( - color: colorScheme.surface.withValues(alpha: 0.7), - borderRadius: const BorderRadius.all(Radius.circular(10)), - ), - child: Column( - mainAxisAlignment: .spaceEvenly, - children: List.generate(_displayed.length, (i) { - final letter = _displayed[i]; - final isCurrent = letter == currentLetter && !_hasFocus; - final isHighlighted = _hasFocus && i == _highlightedIndex; + }, + onVerticalDragUpdate: (details) { + final idx = _letterIndexFromDy(details.localPosition.dy, constraints.maxHeight); + if (idx != _highlightedIndex) { + setState(() => _highlightedIndex = idx); + _jumpToLetter(_displayed[idx]); + } + }, + child: Container( + width: 20, + decoration: BoxDecoration( + color: colorScheme.surface.withValues(alpha: 0.7), + borderRadius: const BorderRadius.all(Radius.circular(10)), + ), + child: Column( + mainAxisAlignment: .spaceEvenly, + children: List.generate(_displayed.length, (i) { + final letter = _displayed[i]; + final isCurrent = letter == currentLetter && !_hasFocus; + final isHighlighted = _hasFocus && i == _highlightedIndex; - BoxDecoration? decoration; - if (isHighlighted) { - decoration = BoxDecoration(color: colorScheme.primary, shape: BoxShape.circle); - } else if (isCurrent) { - decoration = BoxDecoration( - color: colorScheme.primary.withValues(alpha: 0.3), - shape: BoxShape.circle, - ); - } + BoxDecoration? decoration; + if (isHighlighted) { + decoration = BoxDecoration(color: colorScheme.primary, shape: BoxShape.circle); + } else if (isCurrent) { + decoration = BoxDecoration( + color: colorScheme.primary.withValues(alpha: 0.3), + shape: BoxShape.circle, + ); + } - Color letterColor; - if (isHighlighted) { - letterColor = colorScheme.onPrimary; - } else if (isCurrent) { - letterColor = colorScheme.primary; - } else { - letterColor = colorScheme.onSurface; - } + Color letterColor; + if (isHighlighted) { + letterColor = colorScheme.onPrimary; + } else if (isCurrent) { + letterColor = colorScheme.primary; + } else { + letterColor = colorScheme.onSurface; + } - return SizedBox( - height: letterSlotHeight, - child: Center( - child: Container( - width: markerSize, - height: markerSize, - decoration: decoration, - alignment: .center, - child: Text( - letter, - style: TextStyle( - fontSize: fontSize, - fontWeight: (isCurrent || isHighlighted) ? FontWeight.bold : FontWeight.normal, - color: letterColor, + return Semantics( + button: true, + selected: isCurrent || isHighlighted, + label: letter, + excludeSemantics: true, + onTap: () { + setState(() => _highlightedIndex = i); + _jumpToLetter(letter); + }, + child: SizedBox( + height: letterSlotHeight, + child: Center( + child: Container( + width: markerSize, + height: markerSize, + decoration: decoration, + alignment: .center, + child: Text( + letter, + style: TextStyle( + fontSize: fontSize, + fontWeight: (isCurrent || isHighlighted) ? FontWeight.bold : FontWeight.normal, + color: letterColor, + ), + ), ), ), ), - ), - ); - }), + ); + }), + ), ), ), ), diff --git a/lib/screens/libraries/alpha_scroll_handle.dart b/lib/screens/libraries/alpha_scroll_handle.dart index cac1ba73..d47fcdce 100644 --- a/lib/screens/libraries/alpha_scroll_handle.dart +++ b/lib/screens/libraries/alpha_scroll_handle.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import '../../i18n/strings.g.dart'; import '../../media/library_first_character.dart'; import 'alpha_jump_helper.dart'; @@ -141,88 +142,117 @@ class _AlphaScrollHandleState extends State with SingleTicker _scheduleHide(); } + int get _semanticLetterIndex { + if (_helper.letters.isEmpty) return -1; + final index = _helper.letters.indexOf(_dragLetter ?? widget.currentLetter); + return index < 0 ? 0 : index; + } + + void _stepSemantics(int delta) { + final currentIndex = _semanticLetterIndex; + if (currentIndex < 0) return; + final targetIndex = (currentIndex + delta).clamp(0, _helper.letters.length - 1); + if (targetIndex == currentIndex) return; + final letter = _helper.letters[targetIndex]; + _show(); + _scheduleHide(); + widget.onJump(_helper.indexForLetter(letter) ?? 0); + } + @override Widget build(BuildContext context) { - return AnimatedBuilder( - animation: _opacityController, - builder: (context, child) { - final opacity = _opacityController.value; - // Prevent stealing taps when fully hidden - if (opacity == 0.0) return const SizedBox.shrink(); + final semanticIndex = _semanticLetterIndex; + return Semantics( + label: t.accessibility.alphabetNavigation, + value: _dragLetter ?? widget.currentLetter, + hint: t.accessibility.alphabetScrollHint, + increasedValue: semanticIndex >= 0 && semanticIndex < _helper.letters.length - 1 + ? _helper.letters[semanticIndex + 1] + : null, + decreasedValue: semanticIndex > 0 ? _helper.letters[semanticIndex - 1] : null, + onIncrease: semanticIndex >= 0 && semanticIndex < _helper.letters.length - 1 ? () => _stepSemantics(1) : null, + onDecrease: semanticIndex > 0 ? () => _stepSemantics(-1) : null, + child: AnimatedBuilder( + animation: _opacityController, + builder: (context, child) { + final opacity = _opacityController.value; + return IgnorePointer( + ignoring: opacity == 0.0, + child: Opacity(opacity: opacity, child: child), + ); + }, + child: LayoutBuilder( + builder: (context, constraints) { + final trackHeight = constraints.maxHeight; + _trackHeight = trackHeight; - return Opacity(opacity: opacity, child: child); - }, - child: LayoutBuilder( - builder: (context, constraints) { - final trackHeight = constraints.maxHeight; - _trackHeight = trackHeight; + final fraction = _isDragging && _dragFraction != null + ? _dragFraction! + : _helper.fractionForLetter(widget.currentLetter); + final usableHeight = trackHeight - _handleHeight; + final handleTop = usableHeight > 0 ? (fraction * usableHeight) : 0.0; - final fraction = _isDragging && _dragFraction != null - ? _dragFraction! - : _helper.fractionForLetter(widget.currentLetter); - final usableHeight = trackHeight - _handleHeight; - final handleTop = usableHeight > 0 ? (fraction * usableHeight) : 0.0; - - final colorScheme = Theme.of(context).colorScheme; - - return SizedBox( - width: _touchTargetWidth + _bubbleSize + _bubbleMarginRight, - height: trackHeight, - child: Stack( - clipBehavior: Clip.none, - children: [ - // Handle pill with touch target โ€” only around the pill's position, - // not the full track, so it doesn't steal scroll gestures. - // Extra vertical padding makes it easier to grab. - Positioned( - right: 0, - top: handleTop - _touchTargetVerticalPadding, - child: MouseRegion( - cursor: SystemMouseCursors.resizeUpDown, - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onVerticalDragStart: _onDragStart, - onVerticalDragUpdate: _onDragUpdate, - onVerticalDragEnd: _onDragEnd, - child: SizedBox( - width: _touchTargetWidth, - height: _handleHeight + _touchTargetVerticalPadding * 2, - child: Align( - alignment: .centerRight, - child: Container( - margin: const EdgeInsets.only(right: 2), - width: _handleWidth, - height: _handleHeight, - decoration: BoxDecoration( - color: colorScheme.onSurface.withValues(alpha: 0.5), - borderRadius: const BorderRadius.all(Radius.circular(_handleRadius)), + final colorScheme = Theme.of(context).colorScheme; + return SizedBox( + width: _touchTargetWidth + _bubbleSize + _bubbleMarginRight, + height: trackHeight, + child: Stack( + clipBehavior: Clip.none, + children: [ + // Handle pill with touch target โ€” only around the pill's position, + // not the full track, so it doesn't steal scroll gestures. + // Extra vertical padding makes it easier to grab. + Positioned( + right: 0, + top: handleTop - _touchTargetVerticalPadding, + child: MouseRegion( + cursor: SystemMouseCursors.resizeUpDown, + child: GestureDetector( + excludeFromSemantics: true, + behavior: HitTestBehavior.opaque, + onVerticalDragStart: _onDragStart, + onVerticalDragUpdate: _onDragUpdate, + onVerticalDragEnd: _onDragEnd, + child: SizedBox( + width: _touchTargetWidth, + height: _handleHeight + _touchTargetVerticalPadding * 2, + child: Align( + alignment: .centerRight, + child: Container( + margin: const EdgeInsets.only(right: 2), + width: _handleWidth, + height: _handleHeight, + decoration: BoxDecoration( + color: colorScheme.onSurface.withValues(alpha: 0.5), + borderRadius: const BorderRadius.all(Radius.circular(_handleRadius)), + ), ), ), ), ), ), ), - ), - // Letter bubble (only while dragging) - if (_isDragging && _dragLetter != null) - Positioned( - right: _touchTargetWidth + _bubbleMarginRight, - top: handleTop + (_handleHeight - _bubbleSize) / 2, - child: Container( - width: _bubbleSize, - height: _bubbleSize, - decoration: BoxDecoration(color: colorScheme.primary, shape: BoxShape.circle), - alignment: .center, - child: Text( - _dragLetter!, - style: TextStyle(color: colorScheme.onPrimary, fontSize: _bubbleFontSize, fontWeight: .bold), + // Letter bubble (only while dragging) + if (_isDragging && _dragLetter != null) + Positioned( + right: _touchTargetWidth + _bubbleMarginRight, + top: handleTop + (_handleHeight - _bubbleSize) / 2, + child: Container( + width: _bubbleSize, + height: _bubbleSize, + decoration: BoxDecoration(color: colorScheme.primary, shape: BoxShape.circle), + alignment: .center, + child: Text( + _dragLetter!, + style: TextStyle(color: colorScheme.onPrimary, fontSize: _bubbleFontSize, fontWeight: .bold), + ), ), ), - ), - ], - ), - ); - }, + ], + ), + ); + }, + ), ), ); } diff --git a/lib/screens/libraries/tabs/library_recommended_tab.dart b/lib/screens/libraries/tabs/library_recommended_tab.dart index ef508b2a..5826a780 100644 --- a/lib/screens/libraries/tabs/library_recommended_tab.dart +++ b/lib/screens/libraries/tabs/library_recommended_tab.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:material_symbols_icons/symbols.dart'; import '../../../focus/hub_vertical_navigation.dart'; +import '../../../focus/locked_hub_controller.dart'; import '../../../i18n/strings.g.dart'; import '../../../media/media_hub.dart'; import '../../../media/media_item.dart'; @@ -50,9 +51,18 @@ class _LibraryRecommendedTabState extends BaseLibraryTabState> _hubKeys = []; final _tvBrowseRailKey = GlobalKey(); final TvSpotlightController _spotlight = TvSpotlightController(); + HubFocusMemory _hubFocusMemory = HubFocusMemory(); void _setSpotlightItem(MediaItem item) => _spotlight.select(item); + @override + void didUpdateWidget(LibraryRecommendedTab oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.library.globalKey != widget.library.globalKey) { + _hubFocusMemory = HubFocusMemory(); + } + } + @override void dispose() { _spotlight.dispose(); @@ -305,6 +315,7 @@ class _LibraryRecommendedTabState extends BaseLibraryTabState _getHubIcon(hub), onFocusedItemChanged: _setSpotlightItem, onRefresh: updateItem, diff --git a/lib/screens/livetv/tabs/whats_on_tab.dart b/lib/screens/livetv/tabs/whats_on_tab.dart index 7409cdb8..70c400b9 100644 --- a/lib/screens/livetv/tabs/whats_on_tab.dart +++ b/lib/screens/livetv/tabs/whats_on_tab.dart @@ -6,6 +6,7 @@ import 'package:material_symbols_icons/symbols.dart'; import 'package:provider/provider.dart'; import '../../../focus/hub_vertical_navigation.dart'; +import '../../../focus/locked_hub_controller.dart'; import '../../../i18n/strings.g.dart'; import '../../../media/media_hub.dart'; import '../../../media/media_item.dart'; @@ -39,6 +40,7 @@ class WhatsOnTabState extends State Timer? _refreshTimer; final Map> _hubKeysById = {}; List> _hubKeys = []; + final _hubFocusMemory = HubFocusMemory(); bool _refreshRequested = true; bool _tickerEnabled = false; bool _appRefreshActive = true; @@ -210,6 +212,7 @@ class WhatsOnTabState extends State return HubSection( key: _hubKeys[index], hub: hub.mediaHub, + focusMemory: _hubFocusMemory, icon: Symbols.live_tv_rounded, cardSizing: HubCardSizing.grid, episodePosterModeOverride: EpisodePosterMode.seriesPoster, diff --git a/lib/screens/media_detail_screen.dart b/lib/screens/media_detail_screen.dart index 00b9e63f..e692356f 100644 --- a/lib/screens/media_detail_screen.dart +++ b/lib/screens/media_detail_screen.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:math' as math; import '../media/ids.dart'; -import 'dart:io'; import 'package:cached_network_image_ce/cached_network_image.dart'; import 'package:flutter/material.dart'; @@ -23,6 +22,7 @@ import '../focus/dpad_select_long_press_controller.dart'; import '../focus/focusable_action_bar.dart'; import '../focus/focusable_wrapper.dart'; import '../focus/hub_vertical_navigation.dart'; +import '../focus/locked_hub_controller.dart'; import '../focus/key_event_utils.dart'; import '../focus/input_mode_tracker.dart'; import '../widgets/cast_member_strip.dart'; @@ -288,6 +288,7 @@ class _MediaDetailScreenState extends State bool _hasLoadedExtras = false; bool _hasLoadedRelatedHubs = false; final _tvDetailRailKey = GlobalKey(); + final _hubFocusMemory = HubFocusMemory(); PageRoute? _route; RouteObserver>? _routeObserver; late final ScrollController _scrollController; @@ -361,6 +362,7 @@ class _MediaDetailScreenState extends State late final FocusNode _playButtonFocusNode; late final FocusNode _ratingChipFocusNode; + late final FocusNode _backButtonFocusNode; final _extrasSelectLongPress = DpadSelectLongPressController(); // Context menu key for the three-dots button @@ -687,6 +689,7 @@ class _MediaDetailScreenState extends State _extrasFocusNode.addListener(_handleExtrasFocusChange); _playButtonFocusNode = FocusNode(debugLabel: 'play_button'); _ratingChipFocusNode = FocusNode(debugLabel: 'rating_chip'); + _backButtonFocusNode = FocusNode(debugLabel: 'media_detail_back'); _overviewFocusNode = FocusNode(debugLabel: 'overview'); _infoRowsFocusNode = FocusNode(debugLabel: 'info_rows'); _loadFullMetadata(); @@ -881,6 +884,7 @@ class _MediaDetailScreenState extends State _focusedExtraIndexNotifier.dispose(); _playButtonFocusNode.dispose(); _ratingChipFocusNode.dispose(); + _backButtonFocusNode.dispose(); _overviewFocusNode.dispose(); _infoRowsFocusNode.dispose(); _extrasSelectLongPress.dispose(); @@ -1190,20 +1194,23 @@ class _MediaDetailScreenState extends State required ImageType imageType, Alignment alignment = Alignment.center, Widget Function(BuildContext, String, dynamic)? errorWidget, + Widget Function(BuildContext, String)? placeholder, }) { if (!widget.isOffline || _metadata.serverId == null) return null; for (final artworkPath in artworkPaths) { - final localPath = _offlineArtworkLocalPath(context, artworkPath); + final localPath = _offlineArtworkCandidatePath(context, artworkPath); if (localPath == null) continue; return OptimizedMediaImage( client: null, imagePath: null, localFilePath: localPath, + cacheMissingLocalFile: true, fit: fit, alignment: alignment, imageType: imageType, + placeholder: placeholder, errorWidget: errorWidget, ); } @@ -1211,11 +1218,9 @@ class _MediaDetailScreenState extends State return null; } - String? _offlineArtworkLocalPath(BuildContext context, String? artworkPath) { + String? _offlineArtworkCandidatePath(BuildContext context, String? artworkPath) { if (!widget.isOffline || _metadata.serverId == null) return null; - final localPath = context.read().getArtworkLocalPath(ServerId(_metadata.serverId!), artworkPath); - if (localPath == null || !File(localPath).existsSync()) return null; - return localPath; + return context.read().getArtworkLocalPath(ServerId(_metadata.serverId!), artworkPath); } String _syncRuleKeyForMetadata(BuildContext context, DownloadProvider downloadProvider, MediaItem metadata) { @@ -2235,6 +2240,7 @@ class _MediaDetailScreenState extends State artworkPaths: [posterPath], fit: BoxFit.cover, imageType: ImageType.poster, + placeholder: (context, url) => const PlaceholderContainer(), errorWidget: (context, url, error) => const PlaceholderContainer(), ); topImage = SizedBox( @@ -3044,6 +3050,7 @@ class _MediaDetailScreenState extends State final backButton = AppBarBackButton( style: BackButtonStyle.plain, onPressed: () => Navigator.pop(context, _watchStateChanged), + focusNode: _backButtonFocusNode, ); final loading = ListenableBuilder( listenable: FullscreenStateManager(), @@ -3219,6 +3226,7 @@ class _MediaDetailScreenState extends State HubSection( key: _relatedHubKeys[i], hub: _relatedHubs[i], + focusMemory: _hubFocusMemory, icon: _getRelatedHubIcon(_relatedHubs[i]), inset: true, onVerticalNavigation: (isUp) => _handleRelatedHubNavigation(i, isUp), @@ -3294,6 +3302,7 @@ class _MediaDetailScreenState extends State AppBarBackButton( style: BackButtonStyle.circular, onPressed: () => Navigator.pop(context, _watchStateChanged), + focusNode: _backButtonFocusNode, ), context: context, )!, @@ -3353,6 +3362,7 @@ class _MediaDetailScreenState extends State AppBarBackButton( style: BackButtonStyle.circular, onPressed: () => Navigator.pop(context, _watchStateChanged), + focusNode: _backButtonFocusNode, ), context: context, )!, @@ -3365,6 +3375,7 @@ class _MediaDetailScreenState extends State child: TvBrowseRail( key: _tvDetailRailKey, hubs: detailHubs, + focusMemory: _hubFocusMemory, iconForHub: _getTvDetailHubIcon, onFocusedHubItemChanged: _handleTvDetailFocusedRailItemChanged, onRefresh: (source) => unawaited(_refreshItemInPlace(source)), @@ -3399,7 +3410,9 @@ class _MediaDetailScreenState extends State item: metadata, client: _getArtworkMediaClient(context), showInfo: false, - localArtworkPathResolver: widget.isOffline ? (path) => _offlineArtworkLocalPath(context, path) : null, + localArtworkPathResolver: widget.isOffline + ? (path) => _offlineArtworkCandidatePath(context, path) + : null, allowNetwork: !widget.isOffline, ), _buildTvDetailRevealGate(revealContent, handleBack), @@ -3642,6 +3655,7 @@ class _MediaDetailScreenState extends State fit: BoxFit.contain, alignment: .centerLeft, imageType: ImageType.heroLogo, + placeholder: (context, url) => titleFallback(context), errorWidget: (context, url, error) => titleFallback(context), ); if (localArtwork != null) return localArtwork; @@ -4184,7 +4198,7 @@ class _MediaDetailScreenState extends State fallbackImagePaths: heroArtPaths, client: _getArtworkMediaClient(context), localArtworkPathResolver: widget.isOffline - ? (path) => _offlineArtworkLocalPath(context, path) + ? (path) => _offlineArtworkCandidatePath(context, path) : null, allowNetwork: !widget.isOffline, width: size.width, diff --git a/lib/screens/profile/borrow_connection_screen.dart b/lib/screens/profile/borrow_connection_screen.dart index 8559bc3d..6ccc427d 100644 --- a/lib/screens/profile/borrow_connection_screen.dart +++ b/lib/screens/profile/borrow_connection_screen.dart @@ -60,7 +60,22 @@ class _BorrowConnectionScreenState extends State { _candidatesFuture = _loadCandidates(); } + void _retryCandidates() { + setState(() { + _candidatesFuture = _loadCandidates(); + }); + } + Future> _loadCandidates() async { + try { + return await _loadCandidatesUnchecked(); + } catch (error, stackTrace) { + appLogger.w('Borrow candidate load failed', error: error, stackTrace: stackTrace); + Error.throwWithStackTrace(error, stackTrace); + } + } + + Future> _loadCandidatesUnchecked() async { final pcRegistry = context.read(); final connRegistry = context.read(); final profileRegistry = context.read(); @@ -159,7 +174,59 @@ class _BorrowConnectionScreenState extends State { return FutureBuilder>( future: _candidatesFuture, builder: (context, snapshot) { - final candidates = snapshot.data ?? const <_BorrowCandidate>[]; + late final Widget candidateSliver; + if (snapshot.connectionState != ConnectionState.done) { + candidateSliver = LoadingIndicatorBox.sliver; + } else if (snapshot.hasError) { + candidateSliver = SliverFillRemaining( + child: ErrorStateWidget( + message: t.profiles.borrowLoadFailed, + onRetry: _retryCandidates, + actionAutofocus: true, + actionUseBackgroundFocus: true, + ), + ); + } else { + final candidates = snapshot.requireData; + if (candidates.isEmpty) { + candidateSliver = SliverFillRemaining( + child: EmptyStateWidget( + message: t.profiles.borrowEmpty, + subtitle: t.profiles.borrowEmptySubtitle, + icon: Symbols.share_rounded, + iconSize: 48, + ), + ); + } else { + candidateSliver = SliverList( + delegate: SliverChildBuilderDelegate((context, index) { + final cand = candidates[index]; + // M3E connected-group geometry: large outer corners, small + // inner corners, hairline gaps between tiles. + final tokensRef = tokens(context); + final tileRadii = BorderRadius.vertical( + top: Radius.circular(index == 0 ? tokensRef.radiusLg : tokensRef.radiusXs), + bottom: Radius.circular(index == candidates.length - 1 ? tokensRef.radiusLg : tokensRef.radiusXs), + ); + return Padding( + padding: EdgeInsets.fromLTRB(16, index == 0 ? 4 : tokensRef.groupGap, 16, 0), + child: FocusableWrapper( + autofocus: index == 0, + disableScale: true, + borderRadii: tileRadii, + onSelect: _busy ? null : () => _borrow(cand), + child: Card( + shape: RoundedRectangleBorder(borderRadius: tileRadii), + clipBehavior: Clip.antiAlias, + child: _BorrowTile(candidate: cand, borderRadius: tileRadii, onTap: () => _borrow(cand)), + ), + ), + ); + }, childCount: candidates.length), + ); + } + } + return FocusedScrollScaffold( title: Text(t.profiles.borrowAddTo(displayName: widget.targetProfile.displayName)), slivers: [ @@ -169,44 +236,7 @@ class _BorrowConnectionScreenState extends State { child: Text(t.profiles.borrowExplain, style: Theme.of(context).textTheme.bodySmall), ), ), - if (snapshot.connectionState != ConnectionState.done) - LoadingIndicatorBox.sliver - else if (candidates.isEmpty) - SliverFillRemaining( - child: EmptyStateWidget( - message: t.profiles.borrowEmpty, - subtitle: t.profiles.borrowEmptySubtitle, - icon: Symbols.share_rounded, - iconSize: 48, - ), - ) - else - SliverList( - delegate: SliverChildBuilderDelegate((context, index) { - final cand = candidates[index]; - // M3E connected-group geometry: large outer corners, small - // inner corners, hairline gaps between tiles. - final tokensRef = tokens(context); - final tileRadii = BorderRadius.vertical( - top: Radius.circular(index == 0 ? tokensRef.radiusLg : tokensRef.radiusXs), - bottom: Radius.circular(index == candidates.length - 1 ? tokensRef.radiusLg : tokensRef.radiusXs), - ); - return Padding( - padding: EdgeInsets.fromLTRB(16, index == 0 ? 4 : tokensRef.groupGap, 16, 0), - child: FocusableWrapper( - autofocus: index == 0, - disableScale: true, - borderRadii: tileRadii, - onSelect: _busy ? null : () => _borrow(cand), - child: Card( - shape: RoundedRectangleBorder(borderRadius: tileRadii), - clipBehavior: Clip.antiAlias, - child: _BorrowTile(candidate: cand, borderRadius: tileRadii, onTap: () => _borrow(cand)), - ), - ), - ); - }, childCount: candidates.length), - ), + candidateSliver, ], ); }, diff --git a/lib/screens/profile/pin_entry_dialog.dart b/lib/screens/profile/pin_entry_dialog.dart index df25dd4d..fd9a693c 100644 --- a/lib/screens/profile/pin_entry_dialog.dart +++ b/lib/screens/profile/pin_entry_dialog.dart @@ -421,12 +421,15 @@ class _TvPinInputState extends State<_TvPinInput> with ControllerDisposerMixin { } } - return KeyEventResult.handled; + return KeyEventResult.ignored; } void _onMobilePinChanged(String value) { final digitsOnly = value.replaceAll(RegExp(r'\D'), ''); - final pin = digitsOnly.length > 4 ? digitsOnly.substring(0, 4) : digitsOnly; + final pin = switch (digitsOnly.length) { + <= 4 => digitsOnly, + _ => digitsOnly.substring(0, expandToGraphemeRange(digitsOnly, const TextRange(start: 0, end: 4)).end), + }; if (pin != value) { _mobileController.value = TextEditingValue( text: pin, diff --git a/lib/screens/settings/hotkey_recorder_widget.dart b/lib/screens/settings/hotkey_recorder_widget.dart index 47e2b4da..d9066af1 100644 --- a/lib/screens/settings/hotkey_recorder_widget.dart +++ b/lib/screens/settings/hotkey_recorder_widget.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:plezy/widgets/app_icon.dart'; import 'package:material_symbols_icons/symbols.dart'; @@ -11,7 +13,7 @@ import '../../widgets/dialog_action_button.dart'; class HotKeyRecorderWidget extends StatefulWidget { final String actionName; final HotKey? currentHotKey; - final Function(HotKey) onHotKeyRecorded; + final FutureOr Function(HotKey?) onHotKeyRecorded; final VoidCallback onCancel; const HotKeyRecorderWidget({ @@ -29,6 +31,8 @@ class HotKeyRecorderWidget extends StatefulWidget { class _HotKeyRecorderWidgetState extends State { HotKey? _recordedHotKey; bool _isCapturing = false; + bool _hasPendingEdit = false; + bool _isSaving = false; final _recorderFocusNode = FocusNode(debugLabel: 'HotKeyRecorder.record'); final _clearFocusNode = FocusNode(debugLabel: 'HotKeyRecorder.clear'); final _cancelFocusNode = FocusNode(debugLabel: 'HotKeyRecorder.cancel'); @@ -50,6 +54,7 @@ class _HotKeyRecorderWidgetState extends State { } void _startCapturing() { + if (_isSaving) return; setState(() => _isCapturing = true); _recorderFocusNode.requestFocus(); } @@ -57,6 +62,7 @@ class _HotKeyRecorderWidgetState extends State { void _handleHotKeyRecorded(HotKey hotKey) { setState(() { _recordedHotKey = hotKey; + _hasPendingEdit = true; _isCapturing = false; }); WidgetsBinding.instance.addPostFrameCallback((_) { @@ -65,115 +71,139 @@ class _HotKeyRecorderWidgetState extends State { } void _clearShortcut() { + if (_isSaving) return; setState(() { _recordedHotKey = null; + _hasPendingEdit = true; _isCapturing = false; }); _recorderFocusNode.requestFocus(); } + void _cancel() { + if (!_isSaving) widget.onCancel(); + } + + Future _save() async { + final canSave = (_recordedHotKey != null || _hasPendingEdit) && !_isCapturing && !_isSaving; + if (!canSave) return; + + final hotkey = _recordedHotKey; + setState(() => _isSaving = true); + try { + await widget.onHotKeyRecorded(hotkey); + } finally { + if (mounted) setState(() => _isSaving = false); + } + } + @override Widget build(BuildContext context) { final hasShortcut = _recordedHotKey != null; + final canEdit = !_isSaving; + final canSave = (hasShortcut || _hasPendingEdit) && !_isCapturing && !_isSaving; final recordLabel = _isCapturing ? t.hotkeys.recordingShortcut : t.hotkeys.pressToRecord; - return AlertDialog( - title: Text(t.hotkeys.setShortcutFor(actionName: widget.actionName)), - content: SizedBox( - width: double.maxFinite, - child: SingleChildScrollView( - child: Column( - mainAxisSize: .min, - crossAxisAlignment: .start, - children: [ - Text( - t.hotkeys.currentShortcut, - style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontWeight: .bold), - ), - const SizedBox(height: 6), - Row( - children: [ - Expanded( - child: FocusableWrapper( - focusNode: _recorderFocusNode, - autofocus: true, - onSelect: _startCapturing, - onBack: widget.onCancel, - onNavigateRight: hasShortcut ? _clearFocusNode.requestFocus : null, - onNavigateDown: (hasShortcut ? _saveFocusNode : _cancelFocusNode).requestFocus, - semanticLabel: recordLabel, - descendantsAreFocusable: false, - useBackgroundFocus: true, - child: GestureDetector( - onTap: _startCapturing, - child: Container( - width: double.infinity, - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), - decoration: BoxDecoration( - border: Border.fromBorderSide(BorderSide(color: Theme.of(context).dividerColor)), - borderRadius: const BorderRadius.all(Radius.circular(6)), - ), - child: HotKeyRecorder( - initalHotKey: _recordedHotKey, - enabled: _isCapturing, - placeholder: Text(recordLabel), - onHotKeyRecorded: _handleHotKeyRecorded, + return PopScope( + canPop: !_isSaving, + child: AlertDialog( + title: Text(t.hotkeys.setShortcutFor(actionName: widget.actionName)), + content: SizedBox( + width: double.maxFinite, + child: SingleChildScrollView( + child: Column( + mainAxisSize: .min, + crossAxisAlignment: .start, + children: [ + Text( + t.hotkeys.currentShortcut, + style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontWeight: .bold), + ), + const SizedBox(height: 6), + Row( + children: [ + Expanded( + child: FocusableWrapper( + focusNode: _recorderFocusNode, + autofocus: true, + onSelect: canEdit ? _startCapturing : null, + onBack: _cancel, + onNavigateRight: canEdit && hasShortcut ? _clearFocusNode.requestFocus : null, + onNavigateDown: (canSave ? _saveFocusNode : _cancelFocusNode).requestFocus, + semanticLabel: recordLabel, + descendantsAreFocusable: false, + useBackgroundFocus: true, + child: GestureDetector( + onTap: canEdit ? _startCapturing : null, + child: Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + border: Border.fromBorderSide(BorderSide(color: Theme.of(context).dividerColor)), + borderRadius: const BorderRadius.all(Radius.circular(6)), + ), + child: HotKeyRecorder( + initalHotKey: _recordedHotKey, + enabled: _isCapturing && canEdit, + placeholder: Text(recordLabel), + onHotKeyRecorded: _handleHotKeyRecorded, + ), ), ), ), ), - ), - if (hasShortcut) ...[ - const SizedBox(width: 8), - FocusableButton( - focusNode: _clearFocusNode, - onPressed: _clearShortcut, - onBack: widget.onCancel, - onNavigateLeft: _recorderFocusNode.requestFocus, - onNavigateDown: _saveFocusNode.requestFocus, - autoScroll: false, - child: IconButton( - icon: const AppIcon(Symbols.backspace_rounded, fill: 1, size: 18), - onPressed: _clearShortcut, - padding: .zero, - constraints: const BoxConstraints(minWidth: 24, minHeight: 24), - tooltip: t.hotkeys.clearShortcut, + if (hasShortcut) ...[ + const SizedBox(width: 8), + FocusableButton( + focusNode: _clearFocusNode, + onPressed: canEdit ? _clearShortcut : null, + onBack: _cancel, + onNavigateLeft: _recorderFocusNode.requestFocus, + onNavigateDown: _saveFocusNode.requestFocus, + autoScroll: false, + child: IconButton( + icon: const AppIcon(Symbols.backspace_rounded, fill: 1, size: 18), + onPressed: canEdit ? _clearShortcut : null, + padding: .zero, + constraints: const BoxConstraints(minWidth: 24, minHeight: 24), + tooltip: t.hotkeys.clearShortcut, + ), ), - ), + ], ], - ], - ), - const SizedBox(height: 8), - Text( - recordLabel, - style: Theme.of( - context, - ).textTheme.bodyMedium?.copyWith(color: Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.7)), - textAlign: TextAlign.center, - ), - ], + ), + const SizedBox(height: 8), + Text( + recordLabel, + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + color: Theme.of(context).colorScheme.onSurface.withValues(alpha: 0.7), + ), + textAlign: TextAlign.center, + ), + ], + ), ), ), + actions: [ + DialogActionButton( + focusNode: _cancelFocusNode, + onPressed: canEdit ? _cancel : null, + onBack: _cancel, + onNavigateUp: _recorderFocusNode.requestFocus, + onNavigateRight: canSave ? _saveFocusNode.requestFocus : null, + label: t.common.cancel, + ), + DialogActionButton( + focusNode: _saveFocusNode, + onPressed: canSave ? _save : null, + onBack: _cancel, + onNavigateUp: _recorderFocusNode.requestFocus, + onNavigateLeft: _cancelFocusNode.requestFocus, + label: t.common.save, + isPrimary: true, + ), + ], ), - actions: [ - DialogActionButton( - focusNode: _cancelFocusNode, - onPressed: widget.onCancel, - onBack: widget.onCancel, - onNavigateUp: _recorderFocusNode.requestFocus, - onNavigateRight: _saveFocusNode.requestFocus, - label: t.common.cancel, - ), - DialogActionButton( - focusNode: _saveFocusNode, - onPressed: hasShortcut ? () => widget.onHotKeyRecorded(_recordedHotKey!) : null, - onBack: widget.onCancel, - onNavigateUp: _recorderFocusNode.requestFocus, - onNavigateLeft: _cancelFocusNode.requestFocus, - label: t.common.save, - isPrimary: true, - ), - ], ); } } diff --git a/lib/screens/settings/keyboard_shortcuts_screen.dart b/lib/screens/settings/keyboard_shortcuts_screen.dart index 01f3f6c1..ab34ccc1 100644 --- a/lib/screens/settings/keyboard_shortcuts_screen.dart +++ b/lib/screens/settings/keyboard_shortcuts_screen.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import '../../i18n/strings.g.dart'; import '../../models/hotkey_model.dart'; import '../../services/keyboard_shortcuts_service.dart'; +import '../../utils/app_logger.dart'; import '../../services/shader_service.dart'; import '../../utils/dialogs.dart'; import '../../utils/snackbar_helper.dart'; @@ -58,11 +60,11 @@ class KeyboardShortcutsScreen extends StatelessWidget { borderRadius: BorderRadius.circular(tokens(context).radiusSm), ), child: Text( - keyboardService.formatHotkey(hotkeys[action]!), + keyboardService.formatHotkey(hotkeys[action]), style: const TextStyle(fontFamily: 'monospace'), ), ), - onTap: () => _editHotkey(context, action, hotkeys[action]!), + onTap: () => _editHotkey(context, action, hotkeys[action]), ), ], ), @@ -79,37 +81,42 @@ class KeyboardShortcutsScreen extends StatelessWidget { if (context.mounted) showSuccessSnackBar(context, t.settings.shortcutsReset); } - void _editHotkey(BuildContext screenContext, String action, HotKey currentHotkey) { + void _editHotkey(BuildContext screenContext, String action, HotKey? currentHotkey) { + final actionId = action; + final actionName = keyboardService.getActionDisplayName(actionId); showScopedDialog( context: screenContext, builder: (BuildContext context) { return HotKeyRecorderWidget( - actionName: keyboardService.getActionDisplayName(action), + actionName: actionName, currentHotKey: currentHotkey, onHotKeyRecorded: (newHotkey) async { final navigator = Navigator.of(context); - // Check for conflicts - final existingAction = keyboardService.getActionForHotkey(newHotkey); - if (existingAction != null && existingAction != action) { - navigator.pop(); - showErrorSnackBar( - context, - t.settings.shortcutAlreadyAssigned(action: keyboardService.getActionDisplayName(existingAction)), - ); + if (newHotkey != null) { + final existingAction = keyboardService.getActionForHotkey(newHotkey); + if (existingAction != null && existingAction != actionId) { + navigator.pop(); + showErrorSnackBar( + screenContext, + t.settings.shortcutAlreadyAssigned(action: keyboardService.getActionDisplayName(existingAction)), + ); + return; + } + } + + try { + await keyboardService.setHotkey(actionId, newHotkey); + } on PlatformException catch (error, stackTrace) { + appLogger.e('Failed to update keyboard shortcut', error: error, stackTrace: stackTrace); + if (screenContext.mounted) showErrorSnackBar(screenContext, t.common.error); return; } - // Save the new hotkey - await keyboardService.setHotkey(action, newHotkey); - + if (!context.mounted) return; navigator.pop(); - if (screenContext.mounted) { - showSuccessSnackBar( - screenContext, - t.settings.shortcutUpdated(action: keyboardService.getActionDisplayName(action)), - ); + showSuccessSnackBar(screenContext, t.settings.shortcutUpdated(action: actionName)); } }, onCancel: () => Navigator.pop(context), diff --git a/lib/screens/settings/mpv_config_screen.dart b/lib/screens/settings/mpv_config_screen.dart index 515e92e6..5c4e6d05 100644 --- a/lib/screens/settings/mpv_config_screen.dart +++ b/lib/screens/settings/mpv_config_screen.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:plezy/widgets/app_icon.dart'; @@ -9,6 +11,8 @@ import '../../i18n/strings.g.dart'; import '../../mixins/controller_disposer_mixin.dart'; import '../../models/mpv_config_models.dart'; import '../../utils/dialogs.dart'; +import '../../utils/app_logger.dart'; +import '../../utils/debouncer.dart'; import '../../utils/platform_detector.dart'; import '../../utils/snackbar_helper.dart'; import '../../mixins/settings_effect_mixin.dart'; @@ -35,27 +39,145 @@ class _MpvConfigScreenState extends State with SettingsEffectMi ); final _savePresetFocusNode = FocusNode(); final _textFieldFocusNode = FocusNode(); + final _saveDebouncer = Debouncer(const Duration(milliseconds: 400)); + String _persistedText = ''; + int _revision = 0; + int _persistedRevision = 0; + _QueuedMpvConfig? _pendingSave; + _QueuedMpvConfig? _activeSave; + Future? _drainFuture; + bool _isLeaving = false; + bool _allowPop = false; + bool _disposing = false; @override void initState() { super.initState(); - // Sync the editor when the pref is mutated externally (e.g. loadMpvPreset). - // Skip when the listener fires for the same value the controller already - // holds โ€” avoids fighting user-typed text mid-edit. - bindEffect(SettingsService.mpvConfigText, (v) { - if (_textController.text != v) _textController.text = v; - }, fireImmediately: false); + _persistedText = _textController.text; + _textFieldFocusNode.addListener(_handleTextFieldFocusChanged); + // Keep a clean editor synchronized with imports, reset, and other + // settings producers without allowing a completed local write to replace + // a newer queued edit. + bindEffect(SettingsService.mpvConfigText, _handlePersistedText, fireImmediately: false); } @override void dispose() { + _disposing = true; + _saveDebouncer.dispose(); + _textFieldFocusNode.removeListener(_handleTextFieldFocusChanged); + if (_pendingSave != null || _drainFuture != null) { + unawaited(_flushPending()); + } _savePresetFocusNode.dispose(); _textFieldFocusNode.dispose(); super.dispose(); } - Future _saveText() async { - await _settingsService.write(SettingsService.mpvConfigText, _textController.text); + bool get _hasUnsavedWork => _pendingSave != null || _activeSave != null || _drainFuture != null; + + void _handleTextFieldFocusChanged() { + if (!_textFieldFocusNode.hasFocus) { + unawaited(_flushPending()); + } + } + + void _handlePersistedText(String value) { + final active = _activeSave; + if (active != null && active.text == value) return; + if (active == null && _pendingSave == null && _textController.text == value) { + _persistedText = value; + return; + } + + // An import/reset/other producer wins when observed. An in-flight local + // write cannot be cancelled, so queue the external value behind it to + // ensure that obsolete write cannot become the final persisted value. + _saveDebouncer.cancel(); + final revision = ++_revision; + _persistedText = value; + _persistedRevision = revision; + _pendingSave = active == null ? null : _QueuedMpvConfig(text: value, revision: revision); + _textController.value = TextEditingValue( + text: value, + selection: TextSelection.collapsed(offset: value.length), + ); + _notifySaveStateChanged(); + } + + void _queueTextSave(String text) { + if (_disposing) return; + if (_activeSave == null && _pendingSave == null && text == _persistedText) { + _notifySaveStateChanged(); + return; + } + + _pendingSave = _QueuedMpvConfig(text: text, revision: ++_revision); + _saveDebouncer.run(() => unawaited(_flushPending())); + _notifySaveStateChanged(); + } + + Future _flushPending() { + _saveDebouncer.cancel(); + final existing = _drainFuture; + if (existing != null) return existing; + + late final Future drain; + drain = _drainPending().whenComplete(() { + if (identical(_drainFuture, drain)) { + _drainFuture = null; + _notifySaveStateChanged(); + } + }); + _drainFuture = drain; + _notifySaveStateChanged(); + return drain; + } + + Future _drainPending() async { + while (true) { + final next = _pendingSave; + if (next == null) return true; + + _pendingSave = null; + _activeSave = next; + try { + await _settingsService.write(SettingsService.mpvConfigText, next.text); + } catch (error, stackTrace) { + _pendingSave ??= next; + _activeSave = null; + appLogger.e('MPV configuration save failed', error: error, stackTrace: stackTrace); + if (mounted && !_disposing) showErrorSnackBar(context, t.settings.saveFailed); + return false; + } + + _activeSave = null; + if (next.revision >= _persistedRevision) { + _persistedRevision = next.revision; + _persistedText = next.text; + } + } + } + + void _notifySaveStateChanged() { + if (mounted && !_disposing) setState(() {}); + } + + Future _flushAndPop() async { + if (_isLeaving) return; + _isLeaving = true; + _notifySaveStateChanged(); + + final saved = await _flushPending(); + if (!mounted || _disposing) return; + if (!saved || _hasUnsavedWork) { + _isLeaving = false; + _notifySaveStateChanged(); + return; + } + + setState(() => _allowPop = true); + Navigator.pop(context); } Future _showSavePresetDialog() async { @@ -68,16 +190,21 @@ class _MpvConfigScreenState extends State with SettingsEffectMi hintText: t.mpvConfig.presetNameHint, ); - if (name != null && name.trim().isNotEmpty) { - await _settingsService.saveMpvPreset(name.trim(), _textController.text); - if (mounted) showSuccessSnackBar(context, t.mpvConfig.presetSaved); - } + if (name == null || name.trim().isEmpty) return; + if (!await _flushPending() || !mounted) return; + + await _settingsService.saveMpvPreset(name.trim(), _textController.text); + if (mounted) showSuccessSnackBar(context, t.mpvConfig.presetSaved); } Future _loadPreset(MpvPreset preset) async { - await _settingsService.loadMpvPreset(preset.name); - // Controller text is updated reactively via the bindEffect above. - if (mounted) showAppSnackBar(context, t.mpvConfig.presetLoaded); + _textController.value = TextEditingValue( + text: preset.text, + selection: TextSelection.collapsed(offset: preset.text.length), + ); + _queueTextSave(preset.text); + final saved = await _flushPending(); + if (mounted && saved) showAppSnackBar(context, t.mpvConfig.presetLoaded); } Future _deletePreset(MpvPreset preset) async { @@ -97,15 +224,20 @@ class _MpvConfigScreenState extends State with SettingsEffectMi listenable: _textFieldFocusNode, builder: (context, _) { return PopScope( - canPop: PlatformDetector.isHandheldIOS(context) && !_textFieldFocusNode.hasFocus, + canPop: + _allowPop || + (PlatformDetector.isHandheldIOS(context) && + !_textFieldFocusNode.hasFocus && + !_hasUnsavedWork && + !_isLeaving), onPopInvokedWithResult: (didPop, _) { - if (didPop) return; + if (didPop || _isLeaving) return; if (BackKeyCoordinator.consumeIfHandled()) return; BackKeyUpSuppressor.suppressBackUntilKeyUp(); if (_textFieldFocusNode.hasFocus && _savePresetFocusNode.canRequestFocus) { _savePresetFocusNode.requestFocus(); } else { - Navigator.pop(context); + unawaited(_flushAndPop()); } }, child: FocusedScrollScaffold( @@ -154,11 +286,12 @@ class _MpvConfigScreenState extends State with SettingsEffectMi final sel = _textController.selection; if (sel.isValid) { final text = _textController.text; - _textController.value = TextEditingValue( + final value = TextEditingValue( text: text.replaceRange(sel.start, sel.end, '\n'), selection: TextSelection.collapsed(offset: sel.start + 1), ); - _saveText(); + _textController.value = value; + _queueTextSave(value.text); } } return KeyEventResult.handled; @@ -187,7 +320,7 @@ class _MpvConfigScreenState extends State with SettingsEffectMi contentPadding: const EdgeInsets.all(12), ), style: const TextStyle(fontFamily: 'monospace', fontSize: 13), - onChanged: (_) => _saveText(), + onChanged: _queueTextSave, ), ); } @@ -244,3 +377,10 @@ class _MpvConfigScreenState extends State with SettingsEffectMi ); } } + +class _QueuedMpvConfig { + const _QueuedMpvConfig({required this.text, required this.revision}); + + final String text; + final int revision; +} diff --git a/lib/screens/settings/services_settings_screen.dart b/lib/screens/settings/services_settings_screen.dart index 81ea61a1..0db542aa 100644 --- a/lib/screens/settings/services_settings_screen.dart +++ b/lib/screens/settings/services_settings_screen.dart @@ -151,8 +151,8 @@ class _ServiceHubRow extends StatelessWidget { subtitle: Text(username != null ? t.services.connectedAs(username: username!) : t.services.notConnected), trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), onTap: onTap, - dense: settingsRowDense(), - visualDensity: settingsRowVisualDensity(), + dense: settingsRowDense(context), + visualDensity: settingsRowVisualDensity(context), ); } } diff --git a/lib/screens/settings/settings_screen.dart b/lib/screens/settings/settings_screen.dart index 2f5c634f..a3cee2af 100644 --- a/lib/screens/settings/settings_screen.dart +++ b/lib/screens/settings/settings_screen.dart @@ -31,6 +31,7 @@ import '../../providers/trakt_account_provider.dart'; import '../../services/keyboard_shortcuts_service.dart'; import '../../services/settings_service.dart' as settings; import '../../services/update_service.dart'; +import '../../utils/app_logger.dart'; import '../../utils/dialogs.dart'; import '../../utils/snackbar_helper.dart'; import '../../utils/platform_detector.dart'; @@ -57,11 +58,22 @@ import 'settings_utils.dart'; import '../../widgets/loading_indicator_box.dart'; class SettingsScreen extends StatefulWidget { - const SettingsScreen({super.key, this.downloadDirectoryWritableChecker}); + const SettingsScreen({ + super.key, + this.downloadDirectoryWritableChecker, + this.settingsExporter, + this.settingsImporter, + }); @visibleForTesting final Future Function(Directory directory)? downloadDirectoryWritableChecker; + @visibleForTesting + final Future Function()? settingsExporter; + + @visibleForTesting + final Future Function()? settingsImporter; + @override State createState() => _SettingsScreenState(); } @@ -345,8 +357,8 @@ class _SettingsScreenState extends State with FocusableTab, Moun subtitle: Text(currentPath, maxLines: 2, overflow: .ellipsis), trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), onTap: () => _showDownloadLocationDialog(), - dense: settingsRowDense(), - visualDensity: settingsRowVisualDensity(), + dense: false, + visualDensity: VisualDensity.standard, ); }, ), @@ -542,8 +554,8 @@ class _SettingsScreenState extends State with FocusableTab, Moun _checkForUpdates(); } }, - dense: settingsRowDense(), - visualDensity: settingsRowVisualDensity(), + dense: false, + visualDensity: VisualDensity.standard, ), _buildAutoCheckUpdatesOnStartupTile(), ], @@ -590,8 +602,8 @@ class _SettingsScreenState extends State with FocusableTab, Moun DialogActionButton(onPressed: () => Navigator.pop(dialogContext), label: t.common.cancel), DialogActionButton( onPressed: () async { - await _selectDownloadLocation(); - if (dialogContext.mounted) Navigator.pop(dialogContext); + final changed = await _selectDownloadLocation(); + if (changed && dialogContext.mounted) Navigator.pop(dialogContext); }, label: t.settings.selectFolder, isPrimary: true, @@ -601,55 +613,65 @@ class _SettingsScreenState extends State with FocusableTab, Moun ); } - Future _selectDownloadLocation() async { + Future _selectDownloadLocation() async { try { String? selectedPath; String pathType = 'file'; if (Platform.isAndroid) { - final safService = SafStorageService.instance; - selectedPath = await safService.pickDirectory(); - if (selectedPath != null) { - pathType = 'saf'; - } else if (PlatformDetector.isTV()) { - if (mounted) { - showErrorSnackBar(context, t.settings.downloadLocationSelectError); - } - return; + final safStorage = SafStorageService.instance; + if (!safStorage.supportsDirectoryPicker) { + showErrorSnackBar(context, t.settings.downloadLocationPickerUnavailable); + return false; } + selectedPath = await safStorage.pickDirectory(); + if (!mounted) return false; + if (selectedPath != null) pathType = 'saf'; } else { - final result = await FilePickerService.instance.getDirectoryPath(dialogTitle: t.settings.selectFolder); - selectedPath = result; + selectedPath = await FilePickerService.instance.getDirectoryPath(dialogTitle: t.settings.selectFolder); + if (!mounted) return false; } + if (selectedPath == null) return false; - if (selectedPath != null) { - if (pathType == 'file') { - final dir = Directory(selectedPath); - final isWritable = - await (widget.downloadDirectoryWritableChecker ?? DownloadStorageService.instance.isDirectoryWritable)( - dir, - ); - if (!isWritable) { - if (mounted) { - showErrorSnackBar(context, t.settings.downloadLocationInvalid); - } - return; - } - } - - if (!mounted) return; - await context.read().setDownloadLocation(path: selectedPath, pathType: pathType); - - if (mounted) { - // ignore: no-empty-block - setState triggers rebuild to reflect new download path - setState(() {}); - showSuccessSnackBar(context, t.settings.downloadLocationChanged); + if (pathType == 'file') { + final dir = Directory(selectedPath); + final isWritable = + await (widget.downloadDirectoryWritableChecker ?? DownloadStorageService.instance.isDirectoryWritable)(dir); + if (!mounted) return false; + if (!isWritable) { + showErrorSnackBar(context, t.settings.downloadLocationInvalid); + return false; } } - } catch (e) { - if (mounted) { - showErrorSnackBar(context, t.settings.downloadLocationSelectError); + + await context.read().setDownloadLocation(path: selectedPath, pathType: pathType); + if (!mounted) return false; + + // ignore: no-empty-block - setState triggers rebuild to reflect new download path + setState(() {}); + showSuccessSnackBar(context, t.settings.downloadLocationChanged); + return true; + } on DownloadStorageException catch (error, stackTrace) { + if (!mounted) { + appLogger.e('Download directory selection failed', error: error, stackTrace: stackTrace); + return false; } + showSettingsFailure(context, operation: 'Download directory selection', error: error, stackTrace: stackTrace); + return false; + } on PlatformException catch (error, stackTrace) { + if (!mounted) { + appLogger.e('Download directory selection failed', error: error, stackTrace: stackTrace); + return false; + } + showSettingsFailure(context, operation: 'Download directory selection', error: error, stackTrace: stackTrace); + return false; + } on FileSystemException catch (error, stackTrace) { + if (!mounted) { + appLogger.e('Download directory selection failed', error: error, stackTrace: stackTrace); + return false; + } + showSettingsFailure(context, operation: 'Download directory selection', error: error, stackTrace: stackTrace); + return false; } } @@ -699,14 +721,27 @@ class _SettingsScreenState extends State with FocusableTab, Moun Future _handleExportSettings() async { try { - final path = await SettingsExportService.exportToFile(); - if (!mounted) return; - if (path == null) return; // user cancelled + final path = await (widget.settingsExporter ?? SettingsExportService.exportToFile)(); + if (!mounted || path == null) return; showSuccessSnackBar(context, t.settings.exportSettingsSuccess); - } on SettingsExportException { - if (mounted) showErrorSnackBar(context, t.settings.exportSettingsFailed); - } catch (_) { - if (mounted) showErrorSnackBar(context, t.settings.exportSettingsFailed); + } on SettingsExportException catch (error, stackTrace) { + if (!mounted) { + appLogger.e('Settings export failed', error: error, stackTrace: stackTrace); + return; + } + showSettingsFailure(context, operation: 'Settings export', error: error, stackTrace: stackTrace); + } on PlatformException catch (error, stackTrace) { + if (!mounted) { + appLogger.e('Settings export failed', error: error, stackTrace: stackTrace); + return; + } + showSettingsFailure(context, operation: 'Settings export', error: error, stackTrace: stackTrace); + } on FileSystemException catch (error, stackTrace) { + if (!mounted) { + appLogger.e('Settings export failed', error: error, stackTrace: stackTrace); + return; + } + showSettingsFailure(context, operation: 'Settings export', error: error, stackTrace: stackTrace); } } @@ -717,22 +752,20 @@ class _SettingsScreenState extends State with FocusableTab, Moun message: t.settings.importSettingsConfirm, confirmText: t.settings.importSettings, ); - if (!confirmed) return; + if (!mounted || !confirmed) return; await _handleImportSettings(); } Future _handleImportSettings() async { - // Capture providers before any awaits so we don't reach through `context` - // after the widget may have been unmounted. - final themeProvider = context.read(); - final hiddenLibrariesProvider = context.read(); - final librariesProvider = context.read(); - try { - final result = await SettingsExportService.importFromFile(); + final result = await (widget.settingsImporter ?? SettingsExportService.importFromFile)(); if (!mounted) return; if (result == null) return; // user cancelled file picker + final themeProvider = context.read(); + final hiddenLibrariesProvider = context.read(); + final librariesProvider = context.read(); + // Import wrote directly to SharedPreferences, bypassing `write`. Push // fresh values into active listenables before providers re-read settings. _settingsService.refreshListenables(); @@ -750,10 +783,24 @@ class _SettingsScreenState extends State with FocusableTab, Moun if (mounted) showErrorSnackBar(context, t.settings.importSettingsNoUser); } on InvalidExportFileException { if (mounted) showErrorSnackBar(context, t.settings.importSettingsInvalidFile); - } on SettingsExportException { - if (mounted) showErrorSnackBar(context, t.settings.importSettingsFailed); - } catch (_) { - if (mounted) showErrorSnackBar(context, t.settings.importSettingsFailed); + } on SettingsExportException catch (error, stackTrace) { + if (!mounted) { + appLogger.e('Settings import failed', error: error, stackTrace: stackTrace); + return; + } + showSettingsFailure(context, operation: 'Settings import', error: error, stackTrace: stackTrace); + } on PlatformException catch (error, stackTrace) { + if (!mounted) { + appLogger.e('Settings import failed', error: error, stackTrace: stackTrace); + return; + } + showSettingsFailure(context, operation: 'Settings import', error: error, stackTrace: stackTrace); + } on FileSystemException catch (error, stackTrace) { + if (!mounted) { + appLogger.e('Settings import failed', error: error, stackTrace: stackTrace); + return; + } + showSettingsFailure(context, operation: 'Settings import', error: error, stackTrace: stackTrace); } } diff --git a/lib/screens/settings/settings_utils.dart b/lib/screens/settings/settings_utils.dart index 1ea1147b..8443923d 100644 --- a/lib/screens/settings/settings_utils.dart +++ b/lib/screens/settings/settings_utils.dart @@ -1,5 +1,8 @@ +import 'dart:io'; + import 'package:flex_color_picker/flex_color_picker.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:material_symbols_icons/symbols.dart'; import '../../focus/focusable_text_field.dart'; @@ -7,6 +10,8 @@ import '../../focus/input_mode_tracker.dart'; import '../../i18n/strings.g.dart'; import '../../services/settings_service.dart' as settings; import '../../utils/dialogs.dart'; +import '../../utils/app_logger.dart'; +import '../../utils/snackbar_helper.dart'; import '../../widgets/app_icon.dart'; import '../../widgets/dialog_action_button.dart'; import '../../widgets/focusable_list_tile.dart'; @@ -39,6 +44,18 @@ typedef _SettingsDialogContentBuilder = typedef _SettingsDialogActionsBuilder = List Function(BuildContext dialogContext, StateSetter setDialogState); +/// Reports a recoverable settings persistence failure without swallowing +/// programming errors or other unexpected exception types. +void showSettingsFailure( + BuildContext context, { + required String operation, + required Object error, + required StackTrace stackTrace, +}) { + appLogger.e('$operation failed', error: error, stackTrace: stackTrace); + if (context.mounted) showErrorSnackBar(context, t.settings.saveFailed); +} + void _showSettingsInputDialog({ required BuildContext context, required String title, @@ -89,8 +106,16 @@ class _SettingsInputDialogState extends State<_SettingsInputDialog> { } Future _save() async { - final shouldClose = await widget.onSave(context); - if (shouldClose && mounted) Navigator.pop(context); + try { + final shouldClose = await widget.onSave(context); + if (shouldClose && mounted) Navigator.pop(context); + } on PlatformException catch (error, stackTrace) { + if (!mounted) return; + showSettingsFailure(context, operation: 'Settings input save', error: error, stackTrace: stackTrace); + } on FileSystemException catch (error, stackTrace) { + if (!mounted) return; + showSettingsFailure(context, operation: 'Settings input save', error: error, stackTrace: stackTrace); + } } @override @@ -347,7 +372,16 @@ Future _showColorInputDialogStandard({ }, actionButtons: const ColorPickerActionButtons(okButton: true, closeButton: true, dialogActionButtons: false), ); - if (selected != initial) await onSave(colorToHex(selected)); + if (selected == initial || !context.mounted) return; + try { + await onSave(colorToHex(selected)); + } on PlatformException catch (error, stackTrace) { + if (!context.mounted) return; + showSettingsFailure(context, operation: 'Color setting save', error: error, stackTrace: stackTrace); + } on FileSystemException catch (error, stackTrace) { + if (!context.mounted) return; + showSettingsFailure(context, operation: 'Color setting save', error: error, stackTrace: stackTrace); + } } void _showColorInputDialogTV({ diff --git a/lib/services/keyboard_shortcuts_service.dart b/lib/services/keyboard_shortcuts_service.dart index c949ad1b..84585e77 100644 --- a/lib/services/keyboard_shortcuts_service.dart +++ b/lib/services/keyboard_shortcuts_service.dart @@ -16,7 +16,8 @@ class KeyboardShortcutsService extends ChangeNotifier { static KeyboardShortcutsService? _instance; late final SettingsBindingOwner _settingsBinding; - Map _hotkeys = {}; + Map _hotkeys = {}; + Future _shortcutMutationTail = Future.value(); int _seekTimeSmall = 10; // Default, loaded from settings int _seekTimeLarge = 30; // Default, loaded from settings bool _settingsInitialized = false; @@ -55,7 +56,7 @@ class KeyboardShortcutsService extends ChangeNotifier { final changed = !_hotkeyMapsEqual(_hotkeys, hotkeys) || _seekTimeSmall != seekTimeSmall || _seekTimeLarge != seekTimeLarge; - _hotkeys = Map.from(hotkeys); + _hotkeys = Map.from(hotkeys); _seekTimeSmall = seekTimeSmall; _seekTimeLarge = seekTimeLarge; @@ -64,32 +65,49 @@ class KeyboardShortcutsService extends ChangeNotifier { if (notify && changed) notifyListeners(); } - bool _hotkeyMapsEqual(Map a, Map b) { + bool _hotkeyMapsEqual(Map a, Map b) { if (a.length != b.length) return false; for (final entry in a.entries) { + if (!b.containsKey(entry.key)) return false; + final value = entry.value; final other = b[entry.key]; - if (other == null || !_hotkeyEquals(entry.value, other)) return false; + if (value == null || other == null) { + if (value != other) return false; + } else if (!_hotkeyEquals(value, other)) { + return false; + } } return true; } - Map get hotkeys => Map.from(_hotkeys); + Map get hotkeys => Map.from(_hotkeys); HotKey? getHotkey(String action) { return _hotkeys[action]; } - Future setHotkey(String action, HotKey hotkey) async { - await _settingsService.write(SettingsService.keyboardHotkeys, {..._hotkeys, action: hotkey}); + Future setHotkey(String action, HotKey? hotkey) { + return _serializeShortcutMutation(() async { + await _settingsService.write(SettingsService.keyboardHotkeys, {..._hotkeys, action: hotkey}); + }); } Future refreshFromStorage() async { _settingsBinding.refresh(); } - Future resetToDefaults() async { - final hotkeys = SettingsService.defaultKeyboardHotkeys(); - await _settingsService.write(SettingsService.keyboardHotkeys, hotkeys); + Future resetToDefaults() { + return _serializeShortcutMutation(() async { + await _settingsService.write(SettingsService.keyboardHotkeys, { + ...SettingsService.defaultKeyboardHotkeys(), + }); + }); + } + + Future _serializeShortcutMutation(Future Function() operation) { + final result = _shortcutMutationTail.then((_) => operation()); + _shortcutMutationTail = result.then((_) {}, onError: (Object _, StackTrace _) {}); + return result; } @override @@ -175,6 +193,7 @@ class KeyboardShortcutsService extends ChangeNotifier { for (final entry in _hotkeys.entries) { final action = entry.key; final hotkey = entry.value; + if (hotkey == null) continue; if (physicalKey != hotkey.key) continue; @@ -470,7 +489,8 @@ class KeyboardShortcutsService extends ChangeNotifier { // Check if a hotkey is already assigned to another action String? getActionForHotkey(HotKey hotkey) { for (final entry in _hotkeys.entries) { - if (_hotkeyEquals(entry.value, hotkey)) { + final assignedHotkey = entry.value; + if (assignedHotkey != null && _hotkeyEquals(assignedHotkey, hotkey)) { return entry.key; } } diff --git a/lib/services/plex_client.dart b/lib/services/plex_client.dart index 911b384d..1f370978 100644 --- a/lib/services/plex_client.dart +++ b/lib/services/plex_client.dart @@ -296,6 +296,15 @@ class PlexClient @override ApiCache get cache => _cache; + /// Snapshot the profile identity used by a cache-first request before its + /// cache lookup can yield. [PlexConfig] is immutable, and [headers] returns a + /// fresh map, so both the token/client headers and cache namespace stay bound + /// to the same profile even if [applyProfileUpdate] runs on a cache miss. + ({ServerId cacheScope, Map headers}) _captureCacheFirstRequestContext() { + final requestConfig = config; + return (cacheScope: profileScopeId.cacheServerId, headers: Map.unmodifiable(requestConfig.headers)); + } + /// Whether to operate in offline mode (use cache only) bool _offlineMode = false; @@ -886,9 +895,9 @@ class PlexClient Future isHealthy() async => (await checkHealth()) == HealthStatus.online; /// Get running background tasks (thumbnail generation, credit detection, etc.) - Future> getActivities() async { + Future> getActivities({AbortController? abort}) async { try { - final response = await _getWithFailover('/activities'); + final response = await _getWithFailover('/activities', abort: abort); final container = _getMediaContainer(response); if (container == null) return []; final activityList = container['Activity'] as List?; @@ -904,6 +913,10 @@ class PlexClient } } return activities; + } on MediaServerHttpException catch (e) { + if (e.isCancellation) rethrow; + appLogger.e('Failed to get activities', error: e); + return []; } catch (e) { appLogger.e('Failed to get activities', error: e); return []; @@ -1557,14 +1570,29 @@ class PlexClient bool forceRefresh = false, }) async { try { - final fetch = forceRefresh ? fetchWithCacheFallback : fetchWithCacheFirst; - final data = await fetch>( - cacheKey: '/library/metadata/$ratingKey', - networkCall: () => - _http.get('/library/metadata/$ratingKey', queryParameters: {'includeChapters': 1, 'includeMarkers': 1}), - parseCache: (cached) => cached as Map?, - parseResponse: (response) => response.data as Map?, + final requestContext = _captureCacheFirstRequestContext(); + final cacheKey = '/library/metadata/$ratingKey'; + Future networkCall() => _http.get( + cacheKey, + queryParameters: {'includeChapters': 1, 'includeMarkers': 1}, + headers: requestContext.headers, ); + Map? parseCache(dynamic cached) => cached as Map?; + Map? parseResponse(MediaServerResponse response) => response.data as Map?; + final data = forceRefresh + ? await fetchWithCacheFallback>( + cacheKey: cacheKey, + networkCall: networkCall, + parseCache: parseCache, + parseResponse: parseResponse, + ) + : await fetchWithCacheFirst>( + cacheScope: requestContext.cacheScope, + cacheKey: cacheKey, + networkCall: networkCall, + parseCache: parseCache, + parseResponse: parseResponse, + ); final metadataJson = _getFirstMetadataJsonFromData(data); return _parsePlaybackExtrasFromMetadataJson( metadataJson, @@ -1696,11 +1724,14 @@ class PlexClient /// for the cache-only readers ([fetchPlaybackExtrasFromCacheOnly], /// [fetchCachedMediaSourceInfo]). Future?> _fetchRawMetadataJsonCacheFirst(String ratingKey) async { + final requestContext = _captureCacheFirstRequestContext(); final data = await fetchWithCacheFirst>( + cacheScope: requestContext.cacheScope, cacheKey: '/library/metadata/$ratingKey', networkCall: () => _http.get( '/library/metadata/$ratingKey', queryParameters: {'includeChapters': 1, 'includeMarkers': 1, 'checkFiles': 1, 'includeStreams': 1}, + headers: requestContext.headers, ), parseCache: (cached) => cached as Map?, parseResponse: (response) => response.data as Map?, @@ -3833,10 +3864,18 @@ class PlexClient } @override - Future resolveDownload(MediaItem item, {int mediaIndex = 0}) async { - final playbackData = await getVideoPlaybackData(item.id, mediaIndex: mediaIndex); + Future resolveDownload(MediaItem item, {int mediaIndex = 0, String? mediaSourceId}) async { + final playbackData = await getVideoPlaybackData( + item.id, + mediaIndex: mediaIndex, + selectedMediaSourceId: mediaSourceId, + ); final subtitles = []; final mediaInfo = playbackData.mediaInfo; + final requestedSourceId = mediaSourceId?.trim(); + if (requestedSourceId != null && requestedSourceId.isNotEmpty && mediaInfo?.mediaSourceId != requestedSourceId) { + throw StateError('Requested Plex download source is no longer available'); + } if (mediaInfo != null) { for (final subtitle in mediaInfo.subtitleTracks) { if (!subtitle.isExternal || subtitle.key == null) continue; diff --git a/lib/services/settings_export_service.dart b/lib/services/settings_export_service.dart index 3fff2bb5..13f3987b 100644 --- a/lib/services/settings_export_service.dart +++ b/lib/services/settings_export_service.dart @@ -4,17 +4,20 @@ import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import '../models/shader_preset.dart'; import '../utils/app_logger.dart'; import '../utils/formatters.dart'; import '../utils/platform_detector.dart'; import 'file_picker_service.dart'; import 'settings_service.dart'; import 'storage_service.dart'; +import 'trackers/tracker_constants.dart'; class ImportResult { final int keysImported; @@ -64,8 +67,7 @@ class _StoredPreferenceValue { /// Serializes / restores user-facing SharedPreferences to a JSON file. /// -/// Strategy is allow-by-default: every key is exported unless it matches an -/// exact denylist or a prefix denylist of auth/cache/internal keys. User-scoped +/// Only preferences in the closed portable registry are exported. User-scoped /// keys (prefixed with `user_{uuid}_`) have that prefix stripped on export and /// re-applied with the current user's prefix on import, so preferences follow /// whichever account is signed in on the target device. @@ -193,12 +195,20 @@ class SettingsExportService { SettingsService.keyboardHotkeys, ]) pref.key: _PreferencePolicy(_storageTypeFor(pref)), + for (final service in TrackerService.values) + for (final pref in >[ + SettingsService.trackerFilterModePref(service), + SettingsService.trackerFilterIdsPref(service), + ]) + pref.key: _PreferencePolicy(_storageTypeFor(pref)), }; + static const Set _jsonStringListPreferenceKeys = {'hidden_libraries', 'library_order'}; + static const Map _userScopedPreferences = { - 'hidden_libraries': _PreferencePolicy(_typeStringList, userScoped: true), + 'hidden_libraries': _PreferencePolicy(_typeString, userScoped: true), 'library_filters': _PreferencePolicy(_typeString, userScoped: true), - 'library_order': _PreferencePolicy(_typeStringList, userScoped: true), + 'library_order': _PreferencePolicy(_typeString, userScoped: true), }; static final List<(RegExp, _PreferencePolicy)> _dynamicUserScopedPreferences = [ @@ -269,7 +279,7 @@ class SettingsExportService { final policy = _policyFor(baseKey); if (policy == null || policy.userScoped != sourceIsUserScoped) continue; - final entry = _encodeValue(prefs.get(fullKey), policy.type); + final entry = _encodeValue(_portableExportValue(baseKey, prefs.get(fullKey)), policy.type); if (entry != null) prefsOut[baseKey] = entry; } @@ -282,6 +292,11 @@ class SettingsExportService { }; } + static Object? _portableExportValue(String baseKey, Object? value) { + if (baseKey != SettingsService.globalShaderPreset.key) return value; + return value is String && ShaderPreset.fromId(value) != null ? value : ShaderPreset.none.id; + } + static Map? _encodeValue(Object? value, String expectedType) { return switch (expectedType) { _typeBool when value is bool => {'type': _typeBool, 'value': value}, @@ -331,12 +346,26 @@ class SettingsExportService { continue; } - final type = rawEntry['type']; - final value = rawEntry['value']; + var type = rawEntry['type']; + var value = rawEntry['value']; + // Early format-v1 exports described these JSON-backed values as native + // string lists. Normalize that narrowly admitted legacy shape to the + // String representation consumed by StorageService. + if (version == 1 && + _jsonStringListPreferenceKeys.contains(baseKey) && + type == _typeStringList && + _isValidValue(_typeStringList, value)) { + type = _typeString; + value = jsonEncode((value as List).cast()); + } if (type is! String || type != policy.type || !_isValidValue(type, value)) { skipped++; continue; } + if (baseKey == SettingsService.globalShaderPreset.key && value is String && ShaderPreset.fromId(value) == null) { + skipped++; + continue; + } pending.add( _PendingImport(targetKey: policy.userScoped ? '$userPrefix$baseKey' : baseKey, type: type, value: value), @@ -362,8 +391,7 @@ class SettingsExportService { } catch (rollbackError, rollbackStackTrace) { appLogger.e('Settings import rollback failed', error: rollbackError, stackTrace: rollbackStackTrace); } - appLogger.e('Settings import failed', error: error, stackTrace: stackTrace); - throw const SettingsExportException('Could not apply settings import'); + Error.throwWithStackTrace(error, stackTrace); } return ImportResult(keysImported: pending.length, keysSkipped: skipped); @@ -436,7 +464,7 @@ class SettingsExportService { /// the user's choosing. Returns the saved path, or `null` if the user /// cancelled the picker. /// - /// Throws [SettingsExportException] on failure. + /// Platform and filesystem failures retain their original exception types. static Future exportToFile() async { final prefs = (await SettingsService.getInstance()).prefs; final storage = await StorageService.getInstance(); @@ -444,8 +472,8 @@ class SettingsExportService { try { final info = await PackageInfo.fromPlatform(); appVersion = info.version; - } catch (_) { - // best-effort; tolerate platforms without PackageInfo + } on PlatformException { + // Best-effort metadata; platforms without PackageInfo still export. } final exportMap = buildExportMap(prefs, currentUserUuid: storage.activeUserScope(), appVersion: appVersion); @@ -459,18 +487,13 @@ class SettingsExportService { return _writeToAppDocuments(fileName, bytes); } - try { - return await FilePickerService.instance.saveFile( - dialogTitle: 'Export Plezy settings', - fileName: fileName, - bytes: bytes, - type: FileType.custom, - allowedExtensions: const [fileExtension], - ); - } catch (e, st) { - appLogger.e('Settings export failed', error: e, stackTrace: st); - throw const SettingsExportException('Could not write export file'); - } + return FilePickerService.instance.saveFile( + dialogTitle: 'Export Plezy settings', + fileName: fileName, + bytes: bytes, + type: FileType.custom, + allowedExtensions: const [fileExtension], + ); } static Future _writeToAppDocuments(String fileName, Uint8List bytes) async { @@ -483,8 +506,9 @@ class SettingsExportService { /// Prompts the user to pick a settings JSON and writes its contents into /// SharedPreferences. Requires a signed-in user. /// - /// Returns `null` if the user cancelled. Throws [SettingsExportException] on - /// malformed files or unsupported versions. + /// Returns `null` if the user cancelled. Malformed files throw + /// [InvalidExportFileException]; platform and filesystem failures retain + /// their original exception types. static Future importFromFile() async { final storage = await StorageService.getInstance(); final uuid = storage.activeUserScope(); @@ -501,30 +525,29 @@ class SettingsExportService { final file = picked.files.first; String contents; - try { - final bytes = file.bytes; - if (bytes != null) { + final bytes = file.bytes; + if (bytes != null) { + try { contents = utf8.decode(bytes); - } else if (file.path != null) { - contents = await File(file.path!).readAsString(); - } else { + } on FormatException { throw const InvalidExportFileException('Could not read the selected file'); } - } catch (e, st) { - appLogger.e('Settings import read failed', error: e, stackTrace: st); + } else if (file.path != null) { + contents = await File(file.path!).readAsString(); + } else { throw const InvalidExportFileException('Could not read the selected file'); } - Map data; + final Object? decoded; try { - final decoded = json.decode(contents); - if (decoded is! Map) { - throw const InvalidExportFileException('Invalid export file'); - } - data = decoded; - } catch (_) { + decoded = json.decode(contents); + } on FormatException { throw const InvalidExportFileException('Invalid export file'); } + if (decoded is! Map) { + throw const InvalidExportFileException('Invalid export file'); + } + final data = decoded; final prefs = (await SettingsService.getInstance()).prefs; return applyImportMap(data, prefs, currentUserUuid: uuid); diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart index 24d40a56..0ec70026 100644 --- a/lib/services/settings_service.dart +++ b/lib/services/settings_service.dart @@ -304,13 +304,19 @@ Map _defaultKeyboardHotkeys() => { 'screenshot': const HotKey(key: PhysicalKeyboardKey.keyS, modifiers: [HotKeyModifier.control]), }; -Map _decodeKeyboardHotkeys(dynamic raw) { - final result = {}; +Map _decodeKeyboardHotkeys(dynamic raw) { + final result = {}; for (final entry in (raw as Map).entries) { - final hk = SettingsService.deserializeHotKey(entry.value as Map); - if (hk != null) result[entry.key] = hk; + final value = entry.value; + if (value is! Map) continue; + if (value['disabled'] == true) { + result[entry.key] = null; + continue; + } + final hotkey = SettingsService.deserializeHotKey(value); + if (hotkey != null) result[entry.key] = hotkey; } - return {..._defaultKeyboardHotkeys(), ...result}; + return {..._defaultKeyboardHotkeys(), ...result}; } class SettingsService extends BaseSharedPreferencesService { @@ -500,10 +506,12 @@ class SettingsService extends BaseSharedPreferencesService { ); static const mpvConfigText = _MpvConfigTextPref(); - static final keyboardHotkeys = JsonPref>( + static final keyboardHotkeys = JsonPref>( 'keyboard_hotkeys', - defaultValue: _defaultKeyboardHotkeys(), - encode: (v) => json.encode(v.map((k, hk) => MapEntry(k, SettingsService.serializeHotKey(hk)))), + defaultValue: {..._defaultKeyboardHotkeys()}, + encode: (values) => json.encode( + values.map((key, hotkey) => MapEntry(key, hotkey == null ? const {'disabled': true} : serializeHotKey(hotkey))), + ), decode: _decodeKeyboardHotkeys, ); static final mediaVersionPreferences = JsonPref>( @@ -672,13 +680,6 @@ class SettingsService extends BaseSharedPreferencesService { await write(mpvPresets, presets); } - /// Load a preset (replaces current config text). - Future loadMpvPreset(String name) async { - final presets = read(mpvPresets); - final preset = presets.firstWhere((p) => p.name == name, orElse: () => throw Exception('Preset not found: $name')); - await write(mpvConfigText, preset.text); - } - static const _modifierMap = { 'alt': HotKeyModifier.alt, 'control': HotKeyModifier.control, diff --git a/lib/services/shader_asset_loader.dart b/lib/services/shader_asset_loader.dart index b4747dbb..56a27252 100644 --- a/lib/services/shader_asset_loader.dart +++ b/lib/services/shader_asset_loader.dart @@ -1,3 +1,5 @@ +import 'dart:async' show unawaited; + import 'dart:io'; import 'package:flutter/services.dart'; @@ -15,6 +17,10 @@ import '../utils/app_logger.dart'; class ShaderAssetLoader { static const String _shaderAssetBase = 'assets/shaders'; static String? _cachedShaderDir; + static final RegExp _customShaderFileNamePattern = RegExp(r'^[A-Za-z0-9-]+\.glsl$', caseSensitive: false); + static final Map _verifiedBuiltInShaderPaths = {}; + static final Map> _inFlightBuiltInShaders = {}; + static int _cacheGeneration = 0; /// NVScaler shader file static const String _nvscalerShader = 'nvscaler/NVScaler.glsl'; @@ -42,13 +48,12 @@ class ShaderAssetLoader { 'downscale_post': 'anime4k/Anime4K_AutoDownscalePre_x4.glsl', }; - /// Get the shader cache directory path, creating it if necessary. + /// Get the application-owned shader cache directory, creating it if needed. static Future _getShaderDirectory() async { if (_cachedShaderDir != null) return _cachedShaderDir!; - final cacheDir = await getTemporaryDirectory(); + final cacheDir = await getApplicationCacheDirectory(); final shaderDir = Directory(path.join(cacheDir.path, 'shaders')); - if (!await shaderDir.exists()) { await shaderDir.create(recursive: true); } @@ -59,30 +64,102 @@ class ShaderAssetLoader { /// Extract a single shader file from assets to the cache directory. /// Returns the absolute file path of the extracted shader. - static Future _extractShader(String assetPath) async { - try { - final shaderDir = await _getShaderDirectory(); - final fileName = path.basename(assetPath); - final subDir = path.dirname(assetPath); + static Future _extractShader(String assetPath) { + final generation = _cacheGeneration; + final operationKey = '$generation:$assetPath'; + final active = _inFlightBuiltInShaders[operationKey]; + if (active != null) return active; - final targetDir = Directory(path.join(shaderDir, subDir)); + final operation = _materializeBuiltInShader(assetPath, generation); + _inFlightBuiltInShaders[operationKey] = operation; + unawaited( + operation.whenComplete(() { + if (identical(_inFlightBuiltInShaders[operationKey], operation)) { + _inFlightBuiltInShaders.remove(operationKey); + } + }), + ); + return operation; + } + + static Future _materializeBuiltInShader(String assetPath, int generation) async { + File? pendingFile; + try { + final verifiedPath = _verifiedBuiltInShaderPaths[assetPath]; + if (verifiedPath != null) { + if (await File(verifiedPath).exists()) return verifiedPath; + _verifiedBuiltInShaderPaths.remove(assetPath); + } + + final shaderDir = await _getShaderDirectory(); + final targetDir = Directory(path.join(shaderDir, path.dirname(assetPath))); if (!await targetDir.exists()) { await targetDir.create(recursive: true); } + final targetFile = File(path.join(targetDir.path, path.basename(assetPath))); + final data = await rootBundle.load('$_shaderAssetBase/$assetPath'); + final bundledBytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); - final targetFile = File(path.join(targetDir.path, fileName)); - - // Only extract if not already cached - if (!await targetFile.exists()) { - final fullAssetPath = '$_shaderAssetBase/$assetPath'; - final data = await rootBundle.load(fullAssetPath); - await targetFile.writeAsBytes(data.buffer.asUint8List()); + if (await _fileMatches(targetFile, bundledBytes)) { + if (generation == _cacheGeneration) { + _verifiedBuiltInShaderPaths[assetPath] = targetFile.path; + } + return targetFile.path; } + pendingFile = File('${targetFile.path}.pending.${const Uuid().v4()}'); + await pendingFile.writeAsBytes(bundledBytes, flush: true); + if (!await _promotePendingShader(pendingFile, targetFile, bundledBytes)) { + return null; + } + if (!await _fileMatches(targetFile, bundledBytes)) return null; + + if (generation == _cacheGeneration) { + _verifiedBuiltInShaderPaths[assetPath] = targetFile.path; + } return targetFile.path; } catch (e, st) { appLogger.w('Failed to extract shader $assetPath', error: e, stackTrace: st); return null; + } finally { + if (pendingFile != null) { + try { + if (await pendingFile.exists()) await pendingFile.delete(); + } on FileSystemException { + // The pending path is never returned and can be reclaimed with cache. + } + } + } + } + + static Future _promotePendingShader(File pendingFile, File targetFile, List bundledBytes) async { + try { + await pendingFile.rename(targetFile.path); + return true; + } on FileSystemException { + if (await _fileMatches(targetFile, bundledBytes)) return true; + } + + try { + if (await targetFile.exists()) await targetFile.delete(); + await pendingFile.rename(targetFile.path); + return true; + } on FileSystemException { + return _fileMatches(targetFile, bundledBytes); + } + } + + static Future _fileMatches(File file, List expected) async { + try { + if (!await file.exists()) return false; + final actual = await file.readAsBytes(); + if (actual.length != expected.length) return false; + for (var index = 0; index < expected.length; index++) { + if (actual[index] != expected[index]) return false; + } + return true; + } on FileSystemException { + return false; } } @@ -194,6 +271,14 @@ class ShaderAssetLoader { return shaders; } + /// Whether [fileName] is a direct managed GLSL shader basename. + /// + /// UUID names generated by current builds and alphanumeric names generated + /// by older builds are both accepted. + static bool isValidCustomShaderFileName(String fileName) { + return _customShaderFileNamePattern.hasMatch(fileName); + } + /// Get the custom shader directory path, creating it if necessary. /// Uses app support directory (persistent) rather than temp/cache. static Future _getCustomShaderDirectory() async { @@ -210,29 +295,31 @@ class ShaderAssetLoader { /// Import a custom shader file into the custom shaders directory. /// Returns the stored file name (UUID-based to avoid collisions). static Future importCustomShader(String sourcePath) async { - final customDir = await _getCustomShaderDirectory(); - final ext = path.extension(sourcePath); - final uuid = const Uuid().v4(); - final storedName = '$uuid$ext'; - final targetFile = File(path.join(customDir, storedName)); + if (path.extension(sourcePath).toLowerCase() != '.glsl') { + throw ArgumentError.value(sourcePath, 'sourcePath', 'Custom shaders must use the .glsl extension'); + } - await File(sourcePath).copy(targetFile.path); + final customDir = await _getCustomShaderDirectory(); + final storedName = '${const Uuid().v4()}.glsl'; + await File(sourcePath).copy(path.join(customDir, storedName)); return storedName; } /// Delete a custom shader file from the custom shaders directory. static Future deleteCustomShader(String fileName) async { - final customDir = await _getCustomShaderDirectory(); - final file = File(path.join(customDir, fileName)); - if (await file.exists()) { + final file = await _resolveManagedCustomShaderFile(fileName); + if (file != null && await file.exists()) { await file.delete(); } } - /// Get the absolute path for a custom shader file. - static Future getCustomShaderPath(String fileName) async { - final customDir = await _getCustomShaderDirectory(); - return path.join(customDir, fileName); + static Future _resolveManagedCustomShaderFile(String fileName) async { + if (!isValidCustomShaderFileName(fileName)) return null; + + final customDir = path.canonicalize(await _getCustomShaderDirectory()); + final candidate = path.canonicalize(path.join(customDir, fileName)); + if (!path.equals(path.dirname(candidate), customDir)) return null; + return File(candidate); } /// Get shader paths for a given preset. @@ -250,16 +337,19 @@ class ShaderAssetLoader { if (preset.anime4kConfig == null) return []; return getAnime4KShaders(preset.anime4kConfig!); case ShaderPresetType.custom: - if (preset.fileName == null) return []; - final shaderPath = await getCustomShaderPath(preset.fileName!); - if (!await File(shaderPath).exists()) return []; - return [shaderPath]; + final fileName = preset.fileName; + if (fileName == null) return []; + final shaderFile = await _resolveManagedCustomShaderFile(fileName); + if (shaderFile == null || !await shaderFile.exists()) return []; + return [shaderFile.path]; } } /// Clear cached shader directory reference. /// Call when clearing app cache. static void clearCache() { + _cacheGeneration++; _cachedShaderDir = null; + _verifiedBuiltInShaderPaths.clear(); } } diff --git a/lib/utils/initials_palette.dart b/lib/utils/initials_palette.dart index 6f526eb4..6e82b463 100644 --- a/lib/utils/initials_palette.dart +++ b/lib/utils/initials_palette.dart @@ -4,8 +4,7 @@ import 'package:flutter/material.dart'; String initialOf(String name) { final trimmed = name.trim(); if (trimmed.isEmpty) return '?'; - final first = trimmed.runes.first; - return String.fromCharCode(first).toUpperCase(); + return trimmed.characters.first.toUpperCase(); } /// Deterministic colour for [name] from a curated palette. The palette is diff --git a/lib/utils/search_relevance.dart b/lib/utils/search_relevance.dart index f67f3011..78d443bb 100644 --- a/lib/utils/search_relevance.dart +++ b/lib/utils/search_relevance.dart @@ -1,85 +1,98 @@ import 'dart:math' as math; +import 'package:collection/collection.dart'; import 'package:string_similarity/string_similarity.dart'; +import 'package:unorm_dart/unorm_dart.dart'; import '../media/media_item.dart'; const int defaultMediaSearchLimit = 100; +final RegExp _searchSeparatorPattern = RegExp(r'[^\p{L}\p{N}\p{M}]+', unicode: true); + List rankMediaSearchResults(List items, String query, {int? limit}) { - final normalizedQuery = normalizeSearchText(query); - if (normalizedQuery.isEmpty) { + if (limit != null) { + RangeError.checkNotNegative(limit, 'limit'); + if (limit == 0) return const []; + } + if (items.isEmpty) return const []; + + final searchQuery = _NormalizedSearchQuery(query); + if (searchQuery.text.isEmpty) { return limit == null ? List.of(items) : items.take(limit).toList(); } - final ranked = <_RankedMediaItem>[ - for (var i = 0; i < items.length; i++) - _RankedMediaItem(item: items[i], score: mediaSearchRelevanceScore(items[i], normalizedQuery), originalIndex: i), - ]; + if (limit == null || limit >= items.length) { + final ranked = <_RankedMediaItem>[ + for (var i = 0; i < items.length; i++) + _RankedMediaItem( + item: items[i], + score: _mediaSearchRelevanceScoreNormalized(items[i], searchQuery), + originalIndex: i, + ), + ]..sort(_compareRankedBestFirst); + return [for (final entry in ranked) entry.item]; + } - ranked.sort((a, b) { - final scoreComparison = b.score.compareTo(a.score); - if (scoreComparison != 0) return scoreComparison; - return a.originalIndex.compareTo(b.originalIndex); - }); + final retained = HeapPriorityQueue<_RankedMediaItem>(_compareRankedWorstFirst); + for (var i = 0; i < items.length; i++) { + final item = items[i]; + final score = _mediaSearchRelevanceScoreNormalized(item, searchQuery); + if (retained.length < limit) { + retained.add(_RankedMediaItem(item: item, score: score, originalIndex: i)); + continue; + } - final result = ranked.map((entry) => entry.item); - return limit == null ? result.toList() : result.take(limit).toList(); + final worst = retained.first; + if (score > worst.score || (score == worst.score && i < worst.originalIndex)) { + retained + ..removeFirst() + ..add(_RankedMediaItem(item: item, score: score, originalIndex: i)); + } + } + + final ranked = retained.toList()..sort(_compareRankedBestFirst); + return [for (final entry in ranked) entry.item]; } -double mediaSearchRelevanceScore(MediaItem item, String query) { - final normalizedQuery = normalizeSearchText(query); - if (normalizedQuery.isEmpty) return 0; - final fields = <({String? value, double weight})>[ - (value: item.title, weight: 1.0), - (value: item.titleSort, weight: 0.98), - (value: item.originalTitle, weight: 0.96), - (value: item.grandparentTitle, weight: 0.9), - (value: item.parentTitle, weight: 0.8), - ]; - - var best = 0.0; - for (final field in fields) { - final candidate = normalizeSearchText(field.value); - if (candidate.isEmpty) continue; - best = math.max(best, _scoreNormalizedField(normalizedQuery, candidate) * field.weight); - } +double _mediaSearchRelevanceScoreNormalized(MediaItem item, _NormalizedSearchQuery query) { + var best = _scoreWeightedField(item.title, query, 1.0); + best = math.max(best, _scoreWeightedField(item.titleSort, query, 0.98)); + best = math.max(best, _scoreWeightedField(item.originalTitle, query, 0.96)); + best = math.max(best, _scoreWeightedField(item.grandparentTitle, query, 0.9)); + best = math.max(best, _scoreWeightedField(item.parentTitle, query, 0.8)); return best; } -String normalizeSearchText(String? value) { - if (value == null) return ''; - return value - .toLowerCase() - .replaceAll(RegExp(r'[\u0000-\u002f\u003a-\u0040\u005b-\u0060\u007b-\u007f]+'), ' ') - .replaceAll(RegExp(r'\s+'), ' ') - .trim(); +double _scoreWeightedField(String? value, _NormalizedSearchQuery query, double weight) { + final candidate = normalizeSearchText(value); + if (candidate.isEmpty) return 0; + return _scoreNormalizedField(query, candidate) * weight; } -double _scoreNormalizedField(String query, String candidate) { - if (candidate == query) return 1000; +/// Produces an accent-sensitive search key where canonical/compatibility +/// equivalents and Unicode typography compare alike. +String normalizeSearchText(String? value) { + if (value == null) return ''; + return nfkc(value).toLowerCase().replaceAll(_searchSeparatorPattern, ' ').trim(); +} - final queryWithoutArticle = _withoutLeadingArticle(query); - final candidateWithoutArticle = _withoutLeadingArticle(candidate); - if (queryWithoutArticle.isNotEmpty && candidateWithoutArticle == queryWithoutArticle) return 980; +double _scoreNormalizedField(_NormalizedSearchQuery query, String candidate) { + if (candidate == query.text) return 1000; - if (candidate.startsWith(query)) return 900 + _lengthCloseness(query, candidate, 50); - if (queryWithoutArticle.isNotEmpty && candidateWithoutArticle.startsWith(queryWithoutArticle)) { - return 880 + _lengthCloseness(queryWithoutArticle, candidateWithoutArticle, 50); - } + if (candidate.startsWith(query.text)) return 900 + _lengthCloseness(query.text, candidate, 50); - if (candidate.contains(query)) return 800 + _lengthCloseness(query, candidate, 50); + if (candidate.contains(query.text)) return 800 + _lengthCloseness(query.text, candidate, 50); - final queryTokens = _tokens(query); + final queryTokens = query.tokens; final candidateTokens = _tokens(candidate); if (queryTokens.isEmpty || candidateTokens.isEmpty) return 0; final candidateTokenSet = candidateTokens.toSet(); final matchingTokens = queryTokens.where(candidateTokenSet.contains).length; - final sortedQuery = _sortedTokens(queryTokens); final sortedCandidate = _sortedTokens(candidateTokens); - final tokenSimilarity = StringSimilarity.compareTwoStrings(sortedQuery, sortedCandidate); - final rawSimilarity = StringSimilarity.compareTwoStrings(query, candidate); + final tokenSimilarity = StringSimilarity.compareTwoStrings(query.sortedTokens, sortedCandidate); + final rawSimilarity = StringSimilarity.compareTwoStrings(query.text, candidate); final fuzzyScore = math.max(rawSimilarity, tokenSimilarity) * 650; if (matchingTokens == queryTokens.length) return math.max(700 + tokenSimilarity * 100, fuzzyScore); @@ -95,13 +108,6 @@ String _sortedTokens(List tokens) { return sorted.join(' '); } -String _withoutLeadingArticle(String value) { - for (final article in const ['the ', 'a ', 'an ']) { - if (value.startsWith(article)) return value.substring(article.length); - } - return value; -} - double _lengthCloseness(String query, String candidate, double maxBonus) { final longest = math.max(query.length, candidate.length); if (longest == 0) return 0; @@ -110,6 +116,26 @@ double _lengthCloseness(String query, String candidate, double maxBonus) { return maxBonus * closeness; } +int _compareRankedBestFirst(_RankedMediaItem a, _RankedMediaItem b) { + final scoreComparison = b.score.compareTo(a.score); + if (scoreComparison != 0) return scoreComparison; + return a.originalIndex.compareTo(b.originalIndex); +} + +int _compareRankedWorstFirst(_RankedMediaItem a, _RankedMediaItem b) { + final scoreComparison = a.score.compareTo(b.score); + if (scoreComparison != 0) return scoreComparison; + return b.originalIndex.compareTo(a.originalIndex); +} + +class _NormalizedSearchQuery { + _NormalizedSearchQuery(String value) : text = normalizeSearchText(value); + + final String text; + late final List tokens = _tokens(text); + late final String sortedTokens = _sortedTokens(tokens); +} + class _RankedMediaItem { const _RankedMediaItem({required this.item, required this.score, required this.originalIndex}); diff --git a/lib/widgets/app_bar_back_button.dart b/lib/widgets/app_bar_back_button.dart index 9c95a732..28c9a4d1 100644 --- a/lib/widgets/app_bar_back_button.dart +++ b/lib/widgets/app_bar_back_button.dart @@ -1,7 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:plezy/widgets/app_icon.dart'; +import 'package:flutter/services.dart'; import 'package:material_symbols_icons/symbols.dart'; +import '../focus/focusable_wrapper.dart'; +import '../i18n/strings.g.dart'; +import 'app_icon.dart'; + /// Defines the visual style of the back button enum BackButtonStyle { /// Back button with circular semi-transparent background (used in detail screens) @@ -31,13 +35,15 @@ class AppBarBackButton extends StatefulWidget { /// [style] determines the visual appearance of the back button. /// [onPressed] is called when the button is tapped. If null, defaults to Navigator.pop. /// [color] overrides the default icon color. If null, uses white for circular/video, theme default for plain. - /// [semanticLabel] provides accessibility label for screen readers. + /// [focusNode] allows callers to connect this control to an explicit focus graph. + /// [semanticLabel] overrides the localized back-button label. const AppBarBackButton({ super.key, this.style = BackButtonStyle.circular, this.onPressed, this.color, this.semanticLabel, + this.focusNode, }); final BackButtonStyle style; @@ -49,6 +55,7 @@ class AppBarBackButton extends StatefulWidget { final Color? color; final String? semanticLabel; + final FocusNode? focusNode; @override State createState() => _AppBarBackButtonState(); @@ -90,6 +97,12 @@ class _AppBarBackButtonState extends State with TickerProvider } } + KeyEventResult _handleKeyEvent(FocusNode _, KeyEvent event) { + if (event.logicalKey != LogicalKeyboardKey.space) return KeyEventResult.ignored; + if (event is KeyDownEvent) _handlePressed(); + return KeyEventResult.handled; + } + @override Widget build(BuildContext context) { final theme = Theme.of(context); @@ -123,33 +136,44 @@ class _AppBarBackButtonState extends State with TickerProvider break; } - final buttonWidget = MouseRegion( - cursor: SystemMouseCursors.click, - onEnter: (_) => _onHoverChange(true), - onExit: (_) => _onHoverChange(false), - child: GestureDetector( - onTap: _handlePressed, - child: AnimatedBuilder( - animation: _backgroundAnimation, - builder: (context, child) { - final currentColor = Color.lerp(baseColor, hoverColor, _backgroundAnimation.value); + final semanticLabel = widget.semanticLabel ?? t.common.back; + final button = FocusableWrapper( + focusNode: widget.focusNode, + semanticLabel: semanticLabel, + onSelect: _handlePressed, + onKeyEvent: _handleKeyEvent, + autoScroll: false, + disableScale: true, + descendantsAreFocusable: false, + borderRadius: 20, + child: Tooltip( + message: semanticLabel, + excludeFromSemantics: true, + child: MouseRegion( + onEnter: (_) => _onHoverChange(true), + onExit: (_) => _onHoverChange(false), + child: GestureDetector( + excludeFromSemantics: true, + onTap: _handlePressed, + child: AnimatedBuilder( + animation: _backgroundAnimation, + builder: (context, child) { + final currentColor = Color.lerp(baseColor, hoverColor, _backgroundAnimation.value); - return Container( - margin: const EdgeInsets.all(8), - width: 40, - height: 40, - decoration: BoxDecoration(color: currentColor, shape: BoxShape.circle), - child: AppIcon(Symbols.arrow_back_rounded, fill: 1, color: effectiveColor, size: 20), - ); - }, + return Container( + margin: const EdgeInsets.all(8), + width: 40, + height: 40, + decoration: BoxDecoration(color: currentColor, shape: BoxShape.circle), + child: AppIcon(Symbols.arrow_back_rounded, fill: 1, color: effectiveColor, size: 20), + ); + }, + ), + ), ), ), ); - final button = widget.semanticLabel != null - ? Semantics(label: widget.semanticLabel, button: true, excludeSemantics: true, child: buttonWidget) - : buttonWidget; - return widget.style == BackButtonStyle.circular ? SafeArea(child: button) : button; } } diff --git a/lib/widgets/cycling_media_backdrop.dart b/lib/widgets/cycling_media_backdrop.dart index b5ff232a..f77125ce 100644 --- a/lib/widgets/cycling_media_backdrop.dart +++ b/lib/widgets/cycling_media_backdrop.dart @@ -7,6 +7,9 @@ import 'package:flutter/material.dart'; import '../media/media_server_client.dart'; import '../services/device_performance.dart'; import '../utils/media_image_helper.dart'; +import 'optimized_media_image.dart'; + +Future _defaultLocalFileExists(File file) => file.exists(); /// Displays server artwork and rotates through multiple backdrops in order. /// @@ -25,6 +28,7 @@ class CyclingMediaBackdrop extends StatefulWidget { this.localArtworkPathResolver, this.imageProviderResolver, this.allowNetwork = true, + this.localFileExists = _defaultLocalFileExists, this.active = true, this.fit = BoxFit.cover, this.alignment = Alignment.center, @@ -41,6 +45,10 @@ class CyclingMediaBackdrop extends StatefulWidget { /// Overrides provider construction for deterministic widget tests. @visibleForTesting final ImageProvider? Function(String artworkPath)? imageProviderResolver; + + /// Overrides local file checks for deterministic widget tests. + @visibleForTesting + final Future Function(File file) localFileExists; final bool allowNetwork; final bool active; final double width; @@ -220,7 +228,7 @@ class _CyclingMediaBackdropState extends State with Widget _restartRotationTimer(); } - ImageProvider? _providerFor(BuildContext context, String path) { + ImageProvider? _providerFor(BuildContext context, String path, File? localFile) { final providerOverride = widget.imageProviderResolver; if (providerOverride != null) return providerOverride(path); @@ -234,12 +242,8 @@ class _CyclingMediaBackdropState extends State with Widget imageType: ImageType.art, ); - final localPath = widget.localArtworkPathResolver?.call(path); - if (localPath != null) { - final file = File(localPath); - if (file.existsSync()) { - return MediaImageHelper.boundedDecode(FileImage(file), memWidth: memWidth, memHeight: memHeight); - } + if (localFile != null) { + return MediaImageHelper.boundedDecode(FileImage(localFile), memWidth: memWidth, memHeight: memHeight); } if (!widget.allowNetwork) return null; @@ -262,17 +266,22 @@ class _CyclingMediaBackdropState extends State with Widget }); } - @override - Widget build(BuildContext context) { - final path = _currentPath; - final provider = path == null ? null : _providerFor(context, path); - if (path != null && provider == null) _reportMissingProvider(path); + Widget _buildCrossfade( + BuildContext context, + String? path, { + required LocalFileResolution localResolution, + File? localFile, + }) { + final pending = localResolution == LocalFileResolution.pending; + final provider = path == null || pending ? null : _providerFor(context, path, localFile); + if (path != null && provider == null && !pending) _reportMissingProvider(path); final fadeDuration = _disableAnimations ? Duration.zero : DevicePerformance.reducedDuration(widget.fadeDuration); return _BackdropArtworkCrossfade( artworkKey: (widget.mediaKey, path), imageErrorKey: path, image: provider, + pending: pending, duration: fadeDuration, fit: widget.fit, alignment: widget.alignment, @@ -280,6 +289,27 @@ class _CyclingMediaBackdropState extends State with Widget onImageError: _handleImageError, ); } + + @override + Widget build(BuildContext context) { + final path = _currentPath; + if (path == null) { + return _buildCrossfade(context, null, localResolution: LocalFileResolution.missing); + } + + final localPath = widget.localArtworkPathResolver?.call(path); + if (localPath == null) { + return _buildCrossfade(context, path, localResolution: LocalFileResolution.missing); + } + + return ResolvedLocalFile( + path: localPath, + cacheMissing: true, + fileExists: widget.localFileExists, + builder: (context, resolution, file) => + _buildCrossfade(context, path, localResolution: resolution, localFile: file), + ); + } } class _BackdropArtworkCrossfade extends StatefulWidget { @@ -287,6 +317,7 @@ class _BackdropArtworkCrossfade extends StatefulWidget { required this.artworkKey, required this.imageErrorKey, required this.image, + required this.pending, required this.duration, required this.fit, required this.alignment, @@ -297,6 +328,7 @@ class _BackdropArtworkCrossfade extends StatefulWidget { final Object? artworkKey; final Object? imageErrorKey; final ImageProvider? image; + final bool pending; final Duration duration; final BoxFit fit; final Alignment alignment; @@ -310,7 +342,7 @@ class _BackdropArtworkCrossfade extends StatefulWidget { class _BackdropArtworkCrossfadeState extends State<_BackdropArtworkCrossfade> with SingleTickerProviderStateMixin { late final AnimationController _fade; late Object? _currentKey = widget.artworkKey; - late ImageProvider? _base = widget.image; + late ImageProvider? _base = widget.pending ? null : widget.image; late Object? _baseErrorKey = widget.imageErrorKey; ImageProvider? _incoming; Object? _incomingErrorKey; @@ -328,6 +360,11 @@ class _BackdropArtworkCrossfadeState extends State<_BackdropArtworkCrossfade> wi super.didUpdateWidget(oldWidget); _fade.duration = widget.duration; if (widget.artworkKey == _currentKey) { + if (widget.pending) return; + if (oldWidget.pending) { + _transitionToIncoming(); + return; + } if (widget.image != null && widget.image != _base && _incoming == null) { _base = widget.image; _baseErrorKey = widget.imageErrorKey; @@ -336,12 +373,27 @@ class _BackdropArtworkCrossfadeState extends State<_BackdropArtworkCrossfade> wi } _currentKey = widget.artworkKey; + if (widget.pending) { + if (_base == null && _incoming != null && _fade.value == 1) { + _base = _incoming; + _baseErrorKey = _incomingErrorKey; + } + setState(() { + _fade.stop(); + _dropIncoming(); + }); + return; + } if (widget.image != null && widget.image == _base) { _baseErrorKey = widget.imageErrorKey; _dropIncoming(); return; } + _transitionToIncoming(); + } + + void _transitionToIncoming() { setState(() { _fade.stop(); _fade.value = 0; diff --git a/lib/widgets/desktop_app_bar.dart b/lib/widgets/desktop_app_bar.dart index 95bb7ab9..6ec9b6eb 100644 --- a/lib/widgets/desktop_app_bar.dart +++ b/lib/widgets/desktop_app_bar.dart @@ -52,11 +52,7 @@ class DesktopAppBarSections { final canPop = parentRoute?.canPop ?? false; if (canPop) { - effectiveLeading = AppBarBackButton( - style: BackButtonStyle.plain, - onPressed: () => Navigator.of(context).pop(), - semanticLabel: MaterialLocalizations.of(context).backButtonTooltip, - ); + effectiveLeading = AppBarBackButton(style: BackButtonStyle.plain, onPressed: () => Navigator.of(context).pop()); } } diff --git a/lib/widgets/focus_builders.dart b/lib/widgets/focus_builders.dart index 3035a1c3..b38a99a4 100644 --- a/lib/widgets/focus_builders.dart +++ b/lib/widgets/focus_builders.dart @@ -29,6 +29,8 @@ class FocusBuilders { required FocusNode focusNode, required KeyEventResult Function(FocusNode, KeyEvent) onKeyEvent, required VoidCallback onTap, + required String semanticLabel, + bool? selected, required EdgeInsetsGeometry padding, required Color backgroundColor, double borderRadius = 20, @@ -39,15 +41,22 @@ class FocusBuilders { return Focus( focusNode: focusNode, onKeyEvent: onKeyEvent, - child: ClickableCursor( - child: GestureDetector( - onTap: onTap, - child: AnimatedContainer( - duration: duration, - curve: Curves.easeOutCubic, - padding: padding, - decoration: BoxDecoration(color: backgroundColor, borderRadius: BorderRadius.circular(borderRadius)), - child: child, + child: Semantics( + label: semanticLabel, + button: true, + selected: selected, + onTap: onTap, + excludeSemantics: true, + child: ClickableCursor( + child: GestureDetector( + onTap: onTap, + child: AnimatedContainer( + duration: duration, + curve: Curves.easeOutCubic, + padding: padding, + decoration: BoxDecoration(color: backgroundColor, borderRadius: BorderRadius.circular(borderRadius)), + child: child, + ), ), ), ), diff --git a/lib/widgets/focusable_filter_chip.dart b/lib/widgets/focusable_filter_chip.dart index e976d80b..8c2afb92 100644 --- a/lib/widgets/focusable_filter_chip.dart +++ b/lib/widgets/focusable_filter_chip.dart @@ -104,6 +104,7 @@ class _FocusableFilterChipState extends State with Focusabl focusNode: focusNode, onKeyEvent: _handleKeyEvent, onTap: widget.onPressed, + semanticLabel: widget.label, padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), backgroundColor: backgroundColor, child: Row( diff --git a/lib/widgets/focusable_media_card.dart b/lib/widgets/focusable_media_card.dart index a58fff67..1bb72c3b 100644 --- a/lib/widgets/focusable_media_card.dart +++ b/lib/widgets/focusable_media_card.dart @@ -16,6 +16,9 @@ class FocusableMediaCard extends StatefulWidget { /// Either a [MediaItem] or a [MediaPlaylist]. Typed as [Object] because /// Dart has no nominal union type. Forwarded as-is to the inner [MediaCard]. final Object item; + + /// Optional row/column position announced with this card. + final String? semanticValue; final double? width; final double? height; final void Function(MediaItem source)? onRefresh; @@ -78,6 +81,7 @@ class FocusableMediaCard extends StatefulWidget { const FocusableMediaCard({ super.key, required this.item, + this.semanticValue, this.width, this.height, this.onRefresh, @@ -134,6 +138,7 @@ class _FocusableMediaCardState extends State { child: MediaCard( key: _mediaCardKey, item: widget.item, + semanticValue: widget.semanticValue, width: widget.width, height: widget.height, onRefresh: widget.onRefresh, diff --git a/lib/widgets/focusable_tab_chip.dart b/lib/widgets/focusable_tab_chip.dart index 38aa8870..bbf26ed5 100644 --- a/lib/widgets/focusable_tab_chip.dart +++ b/lib/widgets/focusable_tab_chip.dart @@ -174,6 +174,8 @@ class _FocusableTabChipState extends State with FocusableChipS focusNode: focusNode, onKeyEvent: _handleKeyEvent, onTap: widget.onSelect, + semanticLabel: widget.label, + selected: widget.isSelected, padding: hasImage ? const EdgeInsets.all(8) : const EdgeInsets.symmetric(horizontal: 16, vertical: 8), backgroundColor: backgroundColor, borderRadius: hasImage ? 12 : 20, diff --git a/lib/widgets/hotkey_recorder.dart b/lib/widgets/hotkey_recorder.dart index ffc0d3f4..bcb78e83 100644 --- a/lib/widgets/hotkey_recorder.dart +++ b/lib/widgets/hotkey_recorder.dart @@ -49,6 +49,7 @@ class _HotKeyRecorderState extends State { bool _handleKeyEvent(KeyEvent keyEvent) { if (!widget.enabled) return false; + if (keyEvent.logicalKey.isBackKey) return false; if (keyEvent is KeyUpEvent) return false; final physicalKeysPressed = HardwareKeyboard.instance.physicalKeysPressed; diff --git a/lib/widgets/hub_section.dart b/lib/widgets/hub_section.dart index 234a49d7..1475720c 100644 --- a/lib/widgets/hub_section.dart +++ b/lib/widgets/hub_section.dart @@ -46,6 +46,7 @@ enum HubCardSizing { /// - Focus never "escapes" to random elements class HubSection extends StatefulWidget { final MediaHub hub; + final HubFocusMemory focusMemory; final IconData icon; final void Function(MediaItem source)? onRefresh; final VoidCallback? onRemoveFromContinueWatching; @@ -94,6 +95,7 @@ class HubSection extends StatefulWidget { const HubSection({ super.key, required this.hub, + required this.focusMemory, required this.icon, this.onRefresh, this.onRemoveFromContinueWatching, @@ -199,7 +201,7 @@ class HubSectionState extends State with MountedSetStateMixin, Skele final clamped = index.clamp(0, _totalItemCount - 1).toInt(); _focusedIndex = clamped; // Remember this position for this specific hub - HubFocusMemory.setForHub(_focusMemoryKey, clamped); + widget.focusMemory.setForHub(_focusMemoryKey, clamped); _notifyFocusedItemChanged(); _scrollToIndex(clamped); _hubFocusNode.requestFocus(); @@ -211,7 +213,7 @@ class HubSectionState extends State with MountedSetStateMixin, Skele /// Request focus using the stored memory for this hub void requestFocusFromMemory() { - final index = HubFocusMemory.getForHub(_focusMemoryKey, _totalItemCount); + final index = widget.focusMemory.getForHub(_focusMemoryKey, _totalItemCount); requestFocusAt(index); } @@ -286,7 +288,7 @@ class HubSectionState extends State with MountedSetStateMixin, Skele setState(() { _focusedIndex--; }); - HubFocusMemory.setForHub(_focusMemoryKey, _focusedIndex); + widget.focusMemory.setForHub(_focusMemoryKey, _focusedIndex); _notifyFocusedItemChanged(); _scrollToIndex(_focusedIndex); } else if (widget.onNavigateToSidebar != null) { @@ -303,7 +305,7 @@ class HubSectionState extends State with MountedSetStateMixin, Skele setState(() { _focusedIndex++; }); - HubFocusMemory.setForHub(_focusMemoryKey, _focusedIndex); + widget.focusMemory.setForHub(_focusMemoryKey, _focusedIndex); _notifyFocusedItemChanged(); _scrollToIndex(_focusedIndex); } @@ -708,7 +710,7 @@ class HubSectionState extends State with MountedSetStateMixin, Skele setState(() { _focusedIndex = clamped; }); - HubFocusMemory.setForHub(_focusMemoryKey, clamped); + widget.focusMemory.setForHub(_focusMemoryKey, clamped); _notifyFocusedItemChanged(); _scrollToIndex(clamped); _hubFocusNode.requestFocus(); diff --git a/lib/widgets/media_card.dart b/lib/widgets/media_card.dart index 26866fe0..8274395a 100644 --- a/lib/widgets/media_card.dart +++ b/lib/widgets/media_card.dart @@ -119,6 +119,9 @@ class MediaCard extends StatefulWidget { /// Either a [MediaItem] or a [MediaPlaylist]. Typed as [Object] because Dart /// has no nominal union type โ€” runtime `is` checks select the variant. final Object item; + + /// Optional collection position announced with the card. + final String? semanticValue; final double? width; final double? height; final void Function(MediaItem source)? onRefresh; @@ -148,6 +151,7 @@ class MediaCard extends StatefulWidget { const MediaCard({ super.key, required this.item, + this.semanticValue, this.width, this.height, this.onRefresh, @@ -298,13 +302,14 @@ class MediaCardState extends State with ContextMenuTapMixin _handleTap(context, item), onTapDown: storeTapPosition, onLongPress: showContextMenuFromTap, @@ -316,9 +321,21 @@ class MediaCardState extends State with ContextMenuTapMixin with ContextMenuTapMixin with ContextMenuTapMixin with ContextMenuTapMixin with ContextMenuTapMixin _navigateToFocusedDetail(context, item, isOffline: widget.isOffline), ) else - Text( - item is MediaPlaylist ? item.title : (item as MediaItem).displayTitle, - maxLines: 1, - overflow: .ellipsis, - style: const TextStyle(fontWeight: .w600, fontSize: 13, height: 1.1), + ExcludeSemantics( + child: Text( + item is MediaPlaylist ? item.title : (item as MediaItem).displayTitle, + maxLines: 1, + overflow: .ellipsis, + style: const TextStyle(fontWeight: .w600, fontSize: 13, height: 1.1), + ), ), // Subtitle if (item is MediaPlaylist) @@ -498,7 +524,6 @@ class MediaCardState extends State with ContextMenuTapMixin _navigateToFocusedDetail(context, mi, isOffline: isOffline), ) else - Text('S${mi.parentIndex}', style: style), - Text('$episodeNum ยท ', style: style), + ExcludeSemantics(child: Text('S${mi.parentIndex}', style: style)), + ExcludeSemantics(child: Text('$episodeNum ยท ', style: style)), Expanded( - child: Text(episodeTitle, maxLines: 1, overflow: .ellipsis, style: style), + child: ExcludeSemantics( + child: Text(episodeTitle, maxLines: 1, overflow: .ellipsis, style: style), + ), ), ], ); @@ -699,26 +725,28 @@ class _MediaCardList extends StatelessWidget { child: Row( crossAxisAlignment: .start, children: [ - SizedBox( - width: _posterWidth(), - height: _posterHeight(), - child: Stack( - children: [ - _clipPosterImage( - context, - item, - _buildPosterImage( + ExcludeSemantics( + child: SizedBox( + width: _posterWidth(), + height: _posterHeight(), + child: Stack( + children: [ + _clipPosterImage( context, item, - isOffline: isOffline, - localPosterPath: localPosterPath, - episodePosterModeOverride: episodePosterModeOverride, - cardShapeOverride: cardShapeOverride, + _buildPosterImage( + context, + item, + isOffline: isOffline, + localPosterPath: localPosterPath, + episodePosterModeOverride: episodePosterModeOverride, + cardShapeOverride: cardShapeOverride, + ), ), - ), - if (item is MediaItem && _showsWatchedIndicator(item as MediaItem)) - WatchedIndicator(item: item as MediaItem), - ], + if (item is MediaItem && _showsWatchedIndicator(item as MediaItem)) + WatchedIndicator(item: item as MediaItem), + ], + ), ), ), const SizedBox(width: 12), @@ -734,22 +762,26 @@ class _MediaCardList extends StatelessWidget { onTap: () => _navigateToFocusedDetail(context, item as MediaItem, isOffline: isOffline), ) else - Text( - _displayTitle(), - maxLines: 2, - overflow: .ellipsis, - style: TextStyle(fontWeight: .w600, fontSize: _titleFontSize, height: 1.2), + ExcludeSemantics( + child: Text( + _displayTitle(), + maxLines: 2, + overflow: .ellipsis, + style: TextStyle(fontWeight: .w600, fontSize: _titleFontSize, height: 1.2), + ), ), const SizedBox(height: 4), if (metadataLine.isNotEmpty) ...[ - Text( - metadataLine, - maxLines: 1, - overflow: .ellipsis, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: tokens(context).textMuted.withValues(alpha: 0.9), - fontSize: _metadataFontSize, - fontWeight: .w500, + ExcludeSemantics( + child: Text( + metadataLine, + maxLines: 1, + overflow: .ellipsis, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: tokens(context).textMuted.withValues(alpha: 0.9), + fontSize: _metadataFontSize, + fontWeight: .w500, + ), ), ), const SizedBox(height: 2), @@ -761,13 +793,15 @@ class _MediaCardList extends StatelessWidget { _buildEpisodeSubtitle(context, item as MediaItem), const SizedBox(height: 4), ] else if (subtitle != null) ...[ - Text( - subtitle, - maxLines: 1, - overflow: .ellipsis, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: tokens(context).textMuted.withValues(alpha: 0.85), - fontSize: _subtitleFontSize, + ExcludeSemantics( + child: Text( + subtitle, + maxLines: 1, + overflow: .ellipsis, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: tokens(context).textMuted.withValues(alpha: 0.85), + fontSize: _subtitleFontSize, + ), ), ), const SizedBox(height: 4), @@ -776,39 +810,43 @@ class _MediaCardList extends StatelessWidget { SettingsService.instance.read(SettingsService.hideSpoilers) && (item as MediaItem).shouldHideSpoiler) && _summary() != null) ...[ - Text( - _summary()!, - maxLines: _summaryMaxLines, - overflow: .ellipsis, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: tokens(context).textMuted.withValues(alpha: 0.7), - fontSize: _summaryFontSize, - height: 1.3, + ExcludeSemantics( + child: Text( + _summary()!, + maxLines: _summaryMaxLines, + overflow: .ellipsis, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: tokens(context).textMuted.withValues(alpha: 0.7), + fontSize: _summaryFontSize, + height: 1.3, + ), ), ), ], if (showServerName && item is MediaItem && (item as MediaItem).serverName != null) ...[ const SizedBox(height: 4), - Row( - children: [ - BackendBadge( - backend: (item as MediaItem).backend, - size: _metadataFontSize + 2, - color: tokens(context).textMuted.withValues(alpha: 0.6), - ), - const SizedBox(width: 4), - Flexible( - child: Text( - (item as MediaItem).serverName!, - maxLines: 1, - overflow: .ellipsis, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: tokens(context).textMuted.withValues(alpha: 0.6), - fontSize: _metadataFontSize, + ExcludeSemantics( + child: Row( + children: [ + BackendBadge( + backend: (item as MediaItem).backend, + size: _metadataFontSize + 2, + color: tokens(context).textMuted.withValues(alpha: 0.6), + ), + const SizedBox(width: 4), + Flexible( + child: Text( + (item as MediaItem).serverName!, + maxLines: 1, + overflow: .ellipsis, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: tokens(context).textMuted.withValues(alpha: 0.6), + fontSize: _metadataFontSize, + ), ), ), - ), - ], + ], + ), ), ], ], @@ -1001,13 +1039,15 @@ Widget _buildPosterImage( class _MediaCardHelpers { static Widget buildPlaylistMeta(BuildContext context, MediaPlaylist playlist) { if (playlist.leafCount != null && playlist.leafCount! > 0) { - return Text( - t.playlists.itemCount(count: playlist.leafCount!), - maxLines: 1, - overflow: .ellipsis, - style: Theme.of( - context, - ).textTheme.bodySmall?.copyWith(color: tokens(context).textMuted, fontSize: 11, height: 1.1), + return ExcludeSemantics( + child: Text( + t.playlists.itemCount(count: playlist.leafCount!), + maxLines: 1, + overflow: .ellipsis, + style: Theme.of( + context, + ).textTheme.bodySmall?.copyWith(color: tokens(context).textMuted, fontSize: 11, height: 1.1), + ), ); } return const SizedBox.shrink(); @@ -1028,25 +1068,31 @@ class _MediaCardHelpers { if (mi.kind == MediaKind.collection) { final count = mi.childCount ?? mi.leafCount; if (count != null && count > 0) { - return Text( - t.playlists.itemCount(count: count), - maxLines: 1, - overflow: .ellipsis, - style: subtitleStyle, + return ExcludeSemantics( + child: Text( + t.playlists.itemCount(count: count), + maxLines: 1, + overflow: .ellipsis, + style: subtitleStyle, + ), ); } } // For albums, show the album artist if (mi.kind == MediaKind.album && mi.albumArtistTitle != null) { - return Text(mi.albumArtistTitle!, maxLines: 1, overflow: .ellipsis, style: subtitleStyle); + return ExcludeSemantics( + child: Text(mi.albumArtistTitle!, maxLines: 1, overflow: .ellipsis, style: subtitleStyle), + ); } // For tracks, show "Artist โ€ข duration" if (mi.kind == MediaKind.track) { final parts = [?mi.trackArtistTitle, if (mi.durationMs case final durationMs?) formatDurationTextual(durationMs)]; if (parts.isNotEmpty) { - return Text(parts.join(' โ€ข '), maxLines: 1, overflow: .ellipsis, style: subtitleStyle); + return ExcludeSemantics( + child: Text(parts.join(' โ€ข '), maxLines: 1, overflow: .ellipsis, style: subtitleStyle), + ); } } @@ -1063,33 +1109,43 @@ class _MediaCardHelpers { style: subtitleStyle, onTap: () => _navigateToFocusedDetail(context, mi, isOffline: isOffline), ), - Text('$episodeSuffix ยท ', style: subtitleStyle), + ExcludeSemantics(child: Text('$episodeSuffix ยท ', style: subtitleStyle)), Expanded( - child: Text(episodeTitle, maxLines: 1, overflow: .ellipsis, style: subtitleStyle), + child: ExcludeSemantics( + child: Text(episodeTitle, maxLines: 1, overflow: .ellipsis, style: subtitleStyle), + ), ), ], ); } - return Text( - 'S${mi.parentIndex}$episodeSuffix ยท $episodeTitle', - maxLines: 1, - overflow: .ellipsis, - style: subtitleStyle, + return ExcludeSemantics( + child: Text( + 'S${mi.parentIndex}$episodeSuffix ยท $episodeTitle', + maxLines: 1, + overflow: .ellipsis, + style: subtitleStyle, + ), ); } // For other media types, show subtitle/parent/year if (mi.displaySubtitle != null) { - return Text(mi.displaySubtitle!, maxLines: 1, overflow: .ellipsis, style: subtitleStyle); + return ExcludeSemantics( + child: Text(mi.displaySubtitle!, maxLines: 1, overflow: .ellipsis, style: subtitleStyle), + ); } else if (mi.parentTitle != null) { - return Text(mi.parentTitle!, maxLines: 1, overflow: .ellipsis, style: subtitleStyle); + return ExcludeSemantics( + child: Text(mi.parentTitle!, maxLines: 1, overflow: .ellipsis, style: subtitleStyle), + ); } else if (mi.year != null) { final edition = mi.editionTitle; - return Text( - edition != null ? '${mi.year} ยท $edition' : '${mi.year}', - maxLines: 1, - overflow: .ellipsis, - style: subtitleStyle, + return ExcludeSemantics( + child: Text( + edition != null ? '${mi.year} ยท $edition' : '${mi.year}', + maxLines: 1, + overflow: .ellipsis, + style: subtitleStyle, + ), ); } @@ -1097,6 +1153,12 @@ class _MediaCardHelpers { } } +/// Whether the card renders any pointer detail link for this item. +bool _hasPointerDetailLinks(MediaItem mi) { + if (_hasClickableTitle(mi)) return true; + return mi.isEpisode && mi.parentIndex != null && mi.parentId != null; +} + /// Whether this media item has a clickable title that navigates somewhere. /// Episodes/seasons navigate to their parent show; movies navigate to their detail page. bool _hasClickableTitle(MediaItem mi) { @@ -1111,7 +1173,8 @@ void _navigateToFocusedDetail(BuildContext context, MediaItem item, {bool isOffl } /// Text widget that shows hover underline + pointer cursor only in pointer mode. -/// In keyboard/dpad mode, renders as plain text with no interaction. +/// Keyboard/dpad mode keeps plain visual text while screen readers retain the +/// separately invokable detail action. class _ClickableText extends StatefulWidget { final String text; final TextStyle? style; @@ -1130,27 +1193,32 @@ class _ClickableTextState extends State<_ClickableText> { Widget build(BuildContext context) { final isKeyboard = InputModeTracker.isKeyboardMode(context); final baseStyle = widget.style ?? const TextStyle(); + final text = Semantics( + label: widget.text, + hint: t.mediaMenu.viewDetails, + button: true, + onTap: widget.onTap, + excludeSemantics: true, + child: Text( + widget.text, + maxLines: 1, + overflow: .ellipsis, + style: isKeyboard + ? baseStyle + : baseStyle.copyWith( + decoration: _isHovered ? TextDecoration.underline : null, + decorationColor: baseStyle.color, + ), + ), + ); - if (isKeyboard) { - return Text(widget.text, maxLines: 1, overflow: .ellipsis, style: baseStyle); - } + if (isKeyboard) return text; return MouseRegion( cursor: SystemMouseCursors.click, onEnter: (_) => setState(() => _isHovered = true), onExit: (_) => setState(() => _isHovered = false), - child: GestureDetector( - onTap: widget.onTap, - child: Text( - widget.text, - maxLines: 1, - overflow: .ellipsis, - style: baseStyle.copyWith( - decoration: _isHovered ? TextDecoration.underline : null, - decorationColor: baseStyle.color, - ), - ), - ), + child: GestureDetector(excludeFromSemantics: true, onTap: widget.onTap, child: text), ); } } @@ -1204,6 +1272,7 @@ class _CardTapRegion extends StatelessWidget { Widget build(BuildContext context) { if (!PlatformDetector.isDesktopOS()) { return GestureDetector( + excludeFromSemantics: true, behavior: HitTestBehavior.opaque, onTap: onTap, onTapDown: onTapDown, @@ -1214,6 +1283,7 @@ class _CardTapRegion extends StatelessWidget { ); } return InkWell( + excludeFromSemantics: true, mouseCursor: SystemMouseCursors.click, canRequestFocus: false, onTap: onTap, diff --git a/lib/widgets/optimized_media_image.dart b/lib/widgets/optimized_media_image.dart index 7e2d3ae6..3e4e1e0d 100644 --- a/lib/widgets/optimized_media_image.dart +++ b/lib/widgets/optimized_media_image.dart @@ -43,6 +43,7 @@ class OptimizedMediaImage extends StatelessWidget { final IconData? fallbackIcon; final ImageType imageType; final String? localFilePath; + final bool cacheMissingLocalFile; const OptimizedMediaImage._({ super.key, @@ -61,6 +62,7 @@ class OptimizedMediaImage extends StatelessWidget { this.fallbackIcon, this.imageType = ImageType.poster, this.localFilePath, + this.cacheMissingLocalFile = false, }); /// Generic constructor for optimized images. @@ -81,6 +83,7 @@ class OptimizedMediaImage extends StatelessWidget { IconData? fallbackIcon, ImageType imageType, String? localFilePath, + bool cacheMissingLocalFile, }) = OptimizedMediaImage._; /// Named constructor for poster images with default fallback icon. @@ -199,16 +202,27 @@ class OptimizedMediaImage extends StatelessWidget { Widget build(BuildContext context) { final path = localFilePath; if (path == null) { - return _buildResolved(context, _LocalFileResolution.missing, null); + return _buildResolved(context, LocalFileResolution.missing, null); } - return _ResolvedLocalFile(path: path, builder: _buildResolved); + return ResolvedLocalFile(path: path, cacheMissing: cacheMissingLocalFile, builder: _buildResolved); } - Widget _buildResolved(BuildContext context, _LocalFileResolution resolution, File? localFile) { - if (resolution == _LocalFileResolution.pending) return _surfacePlaceholder(context); - final hasLocal = resolution == _LocalFileResolution.present; + Widget _buildResolved(BuildContext context, LocalFileResolution resolution, File? localFile) { + if (resolution == LocalFileResolution.pending) { + return placeholder == null + ? _surfacePlaceholder(context) + : _buildPlaceholder(context, imagePath ?? localFilePath ?? ''); + } + final hasLocal = resolution == LocalFileResolution.present; if (!hasLocal && (imagePath == null || imagePath!.isEmpty)) { + if (errorWidget != null) { + return errorWidget!( + context, + localFilePath ?? '', + FileSystemException('Local image file is unavailable', localFilePath), + ); + } return _buildFallback(context); } @@ -484,22 +498,43 @@ class _FadeInNetworkImageState extends State<_FadeInNetworkImage> with SingleTic } } -enum _LocalFileResolution { pending, missing, present } +enum LocalFileResolution { pending, missing, present } -class _ResolvedLocalFile extends StatefulWidget { - const _ResolvedLocalFile({required this.path, required this.builder}); +typedef LocalFileResolutionBuilder = Widget Function(BuildContext context, LocalFileResolution resolution, File? file); + +Future _defaultLocalFileExists(File file) => file.exists(); + +/// Resolves local file availability without blocking the build isolate. +/// +/// Results are scoped to this widget state and keyed by [path]. Present files +/// are always cached. Missing files are cached only when [cacheMissing] is set, +/// allowing consumers that expect late file creation to retry on rebuild. +class ResolvedLocalFile extends StatefulWidget { + const ResolvedLocalFile({ + super.key, + required this.path, + required this.builder, + this.cacheMissing = false, + this.fileExists = _defaultLocalFileExists, + }); final String path; - final Widget Function(BuildContext context, _LocalFileResolution resolution, File? file) builder; + final LocalFileResolutionBuilder builder; + final bool cacheMissing; + + @visibleForTesting + final Future Function(File file) fileExists; @override - State<_ResolvedLocalFile> createState() => _ResolvedLocalFileState(); + State createState() => _ResolvedLocalFileState(); } -class _ResolvedLocalFileState extends State<_ResolvedLocalFile> { +class _ResolvedLocalFileState extends State { + final Map _presentFiles = {}; + final Set _missingFiles = {}; + final Set _pendingPaths = {}; File? _file; - _LocalFileResolution _resolution = _LocalFileResolution.pending; - int _generation = 0; + LocalFileResolution _resolution = LocalFileResolution.pending; @override void initState() { @@ -508,28 +543,74 @@ class _ResolvedLocalFileState extends State<_ResolvedLocalFile> { } @override - void didUpdateWidget(_ResolvedLocalFile oldWidget) { + void didUpdateWidget(ResolvedLocalFile oldWidget) { super.didUpdateWidget(oldWidget); - if (oldWidget.path != widget.path || _resolution == _LocalFileResolution.missing) _resolve(); + if (oldWidget.fileExists != widget.fileExists) { + _presentFiles.clear(); + _missingFiles.clear(); + _pendingPaths.clear(); + } else if (oldWidget.cacheMissing && !widget.cacheMissing) { + _missingFiles.clear(); + } + if (oldWidget.path != widget.path || + oldWidget.fileExists != widget.fileExists || + _resolution == LocalFileResolution.missing) { + _resolve(); + } } void _resolve() { - final generation = ++_generation; + final path = widget.path; + final present = _presentFiles[path]; + if (present != null) { + _file = present; + _resolution = LocalFileResolution.present; + return; + } + if (widget.cacheMissing && _missingFiles.contains(path)) { + _file = null; + _resolution = LocalFileResolution.missing; + return; + } + _file = null; - _resolution = _LocalFileResolution.pending; - final candidate = File(widget.path); - candidate.exists().then((exists) { - if (!mounted || generation != _generation) return; - setState(() { - _file = exists ? candidate : null; - _resolution = exists ? _LocalFileResolution.present : _LocalFileResolution.missing; - }); + _resolution = LocalFileResolution.pending; + if (!_pendingPaths.add(path)) return; + + final candidate = File(path); + try { + widget + .fileExists(candidate) + .then( + (exists) => _complete(path, candidate, exists), + onError: (Object _, StackTrace _) => _complete(path, candidate, false), + ); + } catch (_) { + _complete(path, candidate, false); + } + } + + void _complete(String path, File candidate, bool exists) { + if (!mounted) return; + _pendingPaths.remove(path); + if (exists) { + _presentFiles[path] = candidate; + _missingFiles.remove(path); + } else if (widget.cacheMissing) { + _missingFiles.add(path); + } + if (widget.path != path) return; + setState(() { + _file = exists ? candidate : null; + _resolution = exists ? LocalFileResolution.present : LocalFileResolution.missing; }); } @override void dispose() { - ++_generation; + _presentFiles.clear(); + _missingFiles.clear(); + _pendingPaths.clear(); super.dispose(); } diff --git a/lib/widgets/server_activities_button.dart b/lib/widgets/server_activities_button.dart index 4a825c75..94b63333 100644 --- a/lib/widgets/server_activities_button.dart +++ b/lib/widgets/server_activities_button.dart @@ -5,12 +5,14 @@ import 'package:flutter/material.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:provider/provider.dart'; +import '../exceptions/media_server_exceptions.dart'; import '../focus/key_event_utils.dart'; import '../i18n/strings.g.dart'; import '../theme/mono_tokens.dart'; import 'package:plezy/widgets/app_icon.dart'; import '../models/plex/plex_activity.dart'; import '../providers/multi_server_provider.dart'; +import '../utils/media_server_http_client.dart'; class ServerActivitiesButton extends StatefulWidget { const ServerActivitiesButton({super.key}); @@ -43,6 +45,8 @@ class ServerActivitiesButtonState extends State { OverlayEntry? _overlayEntry; final _panelNotifier = ValueNotifier<_PanelData>(_PanelData.loading); Timer? _pollTimer; + AbortController? _activeLoadAbort; + int _loadGeneration = 0; @override void deactivate() { @@ -60,6 +64,10 @@ class ServerActivitiesButtonState extends State { void _removeOverlay() { _pollTimer?.cancel(); _pollTimer = null; + _loadGeneration++; + final activeLoadAbort = _activeLoadAbort; + _activeLoadAbort = null; + activeLoadAbort?.abort(); _overlayEntry?.remove(); _overlayEntry = null; } @@ -84,10 +92,10 @@ class ServerActivitiesButtonState extends State { builder: (_) => _buildOverlay(right: right, top: top), ); Overlay.of(context).insert(_overlayEntry!); - _fetchActivities(); + _startRefresh(silent: false); } - Future> _loadFromServers() async { + Future> _loadFromServers(AbortController abort) async { final multiServer = Provider.of(context, listen: false); final serverIds = multiServer.onlineServerIds; @@ -95,7 +103,7 @@ class ServerActivitiesButtonState extends State { // Plex-only: `/activities` API is Plex-specific. final client = multiServer.getPlexClientForServer(ServerId(serverId)); if (client == null) return null; - final activities = await client.getActivities(); + final activities = await client.getActivities(abort: abort); return _ServerResult(serverId: serverId, serverName: client.serverName ?? serverId, activities: activities); }); @@ -103,32 +111,70 @@ class ServerActivitiesButtonState extends State { return rawResults.whereType<_ServerResult>().toList(); } - Future _fetchActivities() async { - try { - final results = await _loadFromServers(); - if (!mounted) return; - _panelNotifier.value = _PanelData(fetchState: _FetchState.loaded, results: results); - _startPolling(); - } catch (_) { - if (!mounted) return; - _panelNotifier.value = const _PanelData(fetchState: _FetchState.error, results: []); - } - } + void _startRefresh({required bool silent}) { + if (!mounted || _overlayEntry == null) return; - void _startPolling() { _pollTimer?.cancel(); - if (mounted && _overlayEntry != null) { - _pollTimer = Timer.periodic(const Duration(seconds: 3), (_) => _silentRefresh()); + _pollTimer = null; + final generation = ++_loadGeneration; + final supersededAbort = _activeLoadAbort; + final abort = AbortController(); + _activeLoadAbort = abort; + supersededAbort?.abort(); + + if (!silent) { + _panelNotifier.value = _PanelData.loading; + } + unawaited(_runRefresh(generation: generation, abort: abort, silent: silent)); + } + + Future _runRefresh({required int generation, required AbortController abort, required bool silent}) async { + var scheduleNext = false; + try { + final results = await _loadFromServers(abort); + if (!_ownsLoad(generation, abort)) return; + _panelNotifier.value = _PanelData(fetchState: _FetchState.loaded, results: results); + scheduleNext = true; + } on MediaServerHttpException catch (error) { + if (error.isCancellation || !_ownsLoad(generation, abort)) return; + if (silent) { + scheduleNext = true; + } else { + _panelNotifier.value = const _PanelData(fetchState: _FetchState.error, results: []); + } + } catch (_) { + if (!_ownsLoad(generation, abort)) return; + if (silent) { + scheduleNext = true; + } else { + _panelNotifier.value = const _PanelData(fetchState: _FetchState.error, results: []); + } + } finally { + if (identical(_activeLoadAbort, abort)) { + _activeLoadAbort = null; + if (scheduleNext && _isCurrentGeneration(generation)) { + _schedulePoll(generation); + } + } } } - Future _silentRefresh() async { - if (!mounted) return; - try { - final results = await _loadFromServers(); - if (!mounted) return; - _panelNotifier.value = _PanelData(fetchState: _FetchState.loaded, results: results); - } catch (_) {} + bool _ownsLoad(int generation, AbortController abort) { + return _isCurrentGeneration(generation) && identical(_activeLoadAbort, abort); + } + + bool _isCurrentGeneration(int generation) { + return mounted && _overlayEntry != null && _loadGeneration == generation; + } + + void _schedulePoll(int generation) { + _pollTimer?.cancel(); + if (!_isCurrentGeneration(generation)) return; + _pollTimer = Timer(const Duration(seconds: 3), () { + if (!_isCurrentGeneration(generation)) return; + _pollTimer = null; + _startRefresh(silent: true); + }); } Future _cancelActivity(ServerId serverId, String uuid) async { @@ -142,10 +188,7 @@ class ServerActivitiesButtonState extends State { return; } if (!mounted || _overlayEntry == null) return; - _pollTimer?.cancel(); - _pollTimer = null; - _panelNotifier.value = _PanelData.loading; - unawaited(_fetchActivities()); + _startRefresh(silent: false); } Widget _buildOverlay({required double right, required double top}) { diff --git a/lib/widgets/setting_tile.dart b/lib/widgets/setting_tile.dart index 56ccea0a..f8af24c2 100644 --- a/lib/widgets/setting_tile.dart +++ b/lib/widgets/setting_tile.dart @@ -49,8 +49,8 @@ class SettingSwitchTile extends StatelessWidget { title: Text(title, style: settingsOptionTitleStyle(context)), subtitle: subtitle != null ? Text(subtitle!) : null, value: value, - dense: settingsRowDense(), - visualDensity: settingsRowVisualDensity(), + dense: settingsRowDense(context), + visualDensity: settingsRowVisualDensity(context), onChanged: enabled ? (v) async { await svc.write(pref, v); @@ -93,8 +93,8 @@ class SettingNavigationTile extends StatelessWidget { subtitle: subtitle != null ? Text(subtitle!) : null, trailing: AppIcon(trailingIcon, fill: 1), onTap: onTap ?? () => Navigator.push(context, MaterialPageRoute(builder: destinationBuilder!)), - dense: settingsRowDense(), - visualDensity: settingsRowVisualDensity(), + dense: settingsRowDense(context), + visualDensity: settingsRowVisualDensity(context), ); } } @@ -134,8 +134,8 @@ class SettingNumberTile extends StatelessWidget { title: Text(title, style: settingsOptionTitleStyle(context)), subtitle: Text(subtitleBuilder(value)), trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), - dense: settingsRowDense(), - visualDensity: settingsRowVisualDensity(), + dense: settingsRowDense(context), + visualDensity: settingsRowVisualDensity(context), onTap: () => showNumericInputDialog( context: context, title: title, @@ -192,8 +192,8 @@ class SettingSelectionTile extends StatelessWidget { title: Text(title, style: settingsOptionTitleStyle(context)), subtitle: Text(subtitleBuilder(value)), trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), - dense: settingsRowDense(), - visualDensity: settingsRowVisualDensity(), + dense: settingsRowDense(context), + visualDensity: settingsRowVisualDensity(context), onTap: () async { final picked = await showSelectionDialog( context: context, @@ -241,8 +241,8 @@ class SettingRegexTile extends StatelessWidget { title: Text(title, style: settingsOptionTitleStyle(context)), subtitle: Text(subtitle), trailing: const AppIcon(Symbols.chevron_right_rounded, fill: 1), - dense: settingsRowDense(), - visualDensity: settingsRowVisualDensity(), + dense: settingsRowDense(context), + visualDensity: settingsRowVisualDensity(context), onTap: () => showRegexInputDialog( context: context, title: title, @@ -341,8 +341,8 @@ class SettingColorTile extends StatelessWidget { border: Border.all(color: Theme.of(context).colorScheme.outlineVariant), ), ), - dense: settingsRowDense(), - visualDensity: settingsRowVisualDensity(), + dense: settingsRowDense(context), + visualDensity: settingsRowVisualDensity(context), onTap: () => showColorInputDialog( context: context, title: title, diff --git a/lib/widgets/settings_section.dart b/lib/widgets/settings_section.dart index 6fdc40c9..8d8fd6fc 100644 --- a/lib/widgets/settings_section.dart +++ b/lib/widgets/settings_section.dart @@ -6,21 +6,19 @@ import 'expressive_button_group.dart'; /// Standard settings-option title style. /// -/// Matches Flutter's dense ListTile title size so custom controls and -/// ordinary settings rows keep the same hierarchy. TV retains the larger -/// body style used for D-pad readability at distance. +/// Mobile uses Flutter's compact ListTile title size. Desktop and TV retain +/// the larger body style used for pointer and D-pad readability. TextStyle? settingsOptionTitleStyle(BuildContext context) { final style = Theme.of(context).textTheme.bodyLarge; - return PlatformDetector.isTV() ? style : style?.copyWith(fontSize: 13); + return PlatformDetector.isMobile(context) ? style?.copyWith(fontSize: 13) : style; } /// Standard settings-row density, paired with [settingsOptionTitleStyle]: -/// compact rows everywhere except TV, where full-height rows keep D-pad -/// readability. -bool settingsRowDense() => !PlatformDetector.isTV(); +/// compact on mobile and full-height on desktop and TV. +bool settingsRowDense(BuildContext context) => PlatformDetector.isMobile(context); -VisualDensity settingsRowVisualDensity() => - settingsRowDense() ? const VisualDensity(vertical: -3) : VisualDensity.standard; +VisualDensity settingsRowVisualDensity(BuildContext context) => + settingsRowDense(context) ? const VisualDensity(vertical: -3) : VisualDensity.standard; class SettingsSectionHeader extends StatelessWidget { final String title; diff --git a/lib/widgets/tv_browse_rail.dart b/lib/widgets/tv_browse_rail.dart index 88cacf4e..56827ccb 100644 --- a/lib/widgets/tv_browse_rail.dart +++ b/lib/widgets/tv_browse_rail.dart @@ -306,6 +306,7 @@ enum TvRailTrailing { none, loading, error, viewAll } class TvBrowseRail extends StatefulWidget { final List hubs; + final HubFocusMemory focusMemory; final IconData Function(MediaHub hub, int index) iconForHub; /// Whether to show each hub's originating server name in its header. Used when @@ -354,6 +355,7 @@ class TvBrowseRail extends StatefulWidget { const TvBrowseRail({ super.key, required this.hubs, + required this.focusMemory, required this.iconForHub, this.showServerName = false, this.onFocusedItemChanged, @@ -774,7 +776,7 @@ class TvBrowseRailState extends State { final currentHub = _activeHub; if (currentHub != null) _rememberFocus(currentHub); final nextHub = widget.hubs[next]; - final remembered = HubFocusMemory.getForHubOnly(_hubKey(nextHub), _totalItemCount(nextHub)); + final remembered = widget.focusMemory.getForHubOnly(_hubKey(nextHub), _totalItemCount(nextHub)); // No setState: the active-hub change is observed through _focusModel // selectors (cards, headers, row dim), so a hub move repaints only the // two affected rows instead of rebuilding every visible card. Section @@ -857,7 +859,7 @@ class TvBrowseRailState extends State { } void _rememberFocus(MediaHub hub) { - HubFocusMemory.setForHub(_hubKey(hub), _itemIndex); + widget.focusMemory.setForHub(_hubKey(hub), _itemIndex); } void _scrollToItem({bool animate = true, Duration duration = _navigationScrollDuration}) { @@ -1354,7 +1356,7 @@ class TvBrowseRailState extends State { }) { final isActiveHub = hubIndex == _hubIndex; final totalCount = _totalItemCount(hub); - final inactiveIndex = HubFocusMemory.getForHubOnly(_hubKey(hub), totalCount); + final inactiveIndex = widget.focusMemory.getForHubOnly(_hubKey(hub), totalCount); final focusedIndex = isActiveHub ? _itemIndex : inactiveIndex; final scrollController = _scrollControllerForHub(hub, metrics, railViewportWidth, scale, focusedIndex); _metricsByHub[_hubKey(hub)] = metrics; diff --git a/lib/widgets/tv_virtual_keyboard.dart b/lib/widgets/tv_virtual_keyboard.dart index 1b3ae138..893a0d60 100644 --- a/lib/widgets/tv_virtual_keyboard.dart +++ b/lib/widgets/tv_virtual_keyboard.dart @@ -398,7 +398,7 @@ class _TvVirtualKeyboardDialogState extends State<_TvVirtualKeyboardDialog> { } } - return KeyEventResult.handled; + return KeyEventResult.ignored; } bool _handlePhysicalKeyboardTextInput(KeyEvent event) { @@ -564,22 +564,15 @@ class _TvVirtualKeyboardDialogState extends State<_TvVirtualKeyboardDialog> { void _backspace() { final value = widget.controller.value; final (:start, :end) = _selectionRangeForEdit(value); + if (start == end && start == 0) return; - if (start != end) { - _replace( - value.copyWith( - text: value.text.replaceRange(start, end, ''), - selection: TextSelection.collapsed(offset: start), - ), - ); - return; - } - if (start == 0) return; - + final codeUnitRange = start == end ? TextRange(start: start - 1, end: start) : TextRange(start: start, end: end); + final range = expandToGraphemeRange(value.text, codeUnitRange); + if (range.isCollapsed) return; _replace( value.copyWith( - text: value.text.replaceRange(start - 1, start, ''), - selection: TextSelection.collapsed(offset: start - 1), + text: value.text.replaceRange(range.start, range.end, ''), + selection: TextSelection.collapsed(offset: range.start), composing: TextRange.empty, ), ); @@ -588,23 +581,15 @@ class _TvVirtualKeyboardDialogState extends State<_TvVirtualKeyboardDialog> { void _deleteForward() { final value = widget.controller.value; final (:start, :end) = _selectionRangeForEdit(value); + if (start == end && start >= value.text.length) return; - if (start != end) { - _replace( - value.copyWith( - text: value.text.replaceRange(start, end, ''), - selection: TextSelection.collapsed(offset: start), - composing: TextRange.empty, - ), - ); - return; - } - if (start >= value.text.length) return; - + final codeUnitRange = start == end ? TextRange(start: start, end: start + 1) : TextRange(start: start, end: end); + final range = expandToGraphemeRange(value.text, codeUnitRange); + if (range.isCollapsed) return; _replace( value.copyWith( - text: value.text.replaceRange(start, start + 1, ''), - selection: TextSelection.collapsed(offset: start), + text: value.text.replaceRange(range.start, range.end, ''), + selection: TextSelection.collapsed(offset: range.start), composing: TextRange.empty, ), ); diff --git a/lib/widgets/video_controls/models/track_controls_state.dart b/lib/widgets/video_controls/models/track_controls_state.dart index 0180da1f..57e3a49e 100644 --- a/lib/widgets/video_controls/models/track_controls_state.dart +++ b/lib/widgets/video_controls/models/track_controls_state.dart @@ -47,8 +47,8 @@ class TrackControlsState { final VoidCallback? onToggleAlwaysOnTop; final Function(int)? onSwitchVersion; final ValueChanged? onSwitchQualityPreset; - final ValueChanged? onSwitchAudioStreamId; - final ValueChanged? onSwitchSubtitle; + final Future Function(int)? onSwitchAudioStreamId; + final Future Function(PlaybackSourceSubtitleChoice)? onSwitchSubtitle; final Function(AudioTrack)? onAudioTrackChanged; final Function(SubtitleTrack)? onSubtitleTrackChanged; final Function(SubtitleTrack)? onSecondarySubtitleTrackChanged; diff --git a/lib/widgets/video_controls/parts/track_controls.dart b/lib/widgets/video_controls/parts/track_controls.dart index 6cbc2966..d117162d 100644 --- a/lib/widgets/video_controls/parts/track_controls.dart +++ b/lib/widgets/video_controls/parts/track_controls.dart @@ -1,5 +1,7 @@ part of '../video_controls.dart'; +final Expando> _subtitleVisibilityWrites = Expando>(); + extension _PlexVideoControlsTrackMethods on _PlexVideoControlsState { void _toggleSubtitles() { final currentTrack = widget.player.state.track.subtitle; @@ -19,6 +21,8 @@ extension _PlexVideoControlsTrackMethods on _PlexVideoControlsState { void _setSubtitleVisibility(bool visible) { final targetPlayer = widget.player; + final coordinator = _subtitleVisibilityWrites[targetPlayer] ??= LatestAsyncWrite(); + final writeToken = coordinator.begin('sub-visibility'); final generation = ++_subtitleVisibilityWriteGeneration; _setControlsState(() { _subtitlesVisible = visible; @@ -26,12 +30,25 @@ extension _PlexVideoControlsTrackMethods on _PlexVideoControlsState { unawaited(() async { try { - await targetPlayer.setProperty('sub-visibility', visible ? 'yes' : 'no'); - if (!mounted || generation != _subtitleVisibilityWriteGeneration || targetPlayer != widget.player) return; - _confirmedSubtitlesVisible = visible; + final committed = await coordinator.commitIfLatest('sub-visibility', writeToken, () async { + await targetPlayer.setProperty('sub-visibility', visible ? 'yes' : 'no'); + if (mounted && targetPlayer == widget.player) { + // Preserve every successfully executed mutation as the rollback + // baseline, even when a newer optimistic toggle is queued. + _confirmedSubtitlesVisible = visible; + } + }); + if (!committed || + !mounted || + generation != _subtitleVisibilityWriteGeneration || + targetPlayer != widget.player) { + return; + } } catch (error, stackTrace) { appLogger.w('Failed to update subtitle visibility', error: error, stackTrace: stackTrace); - if (!mounted || generation != _subtitleVisibilityWriteGeneration || targetPlayer != widget.player) return; + if (!mounted || generation != _subtitleVisibilityWriteGeneration || targetPlayer != widget.player) { + return; + } _setControlsState(() { _subtitlesVisible = _confirmedSubtitlesVisible; }); diff --git a/lib/widgets/video_controls/parts/visibility.dart b/lib/widgets/video_controls/parts/visibility.dart index 5783539b..d9fe39ac 100644 --- a/lib/widgets/video_controls/parts/visibility.dart +++ b/lib/widgets/video_controls/parts/visibility.dart @@ -47,7 +47,12 @@ extension _PlexVideoControlsVisibilityMethods on _PlexVideoControlsState { } /// Controls hide delay: 5s on mobile/TV/keyboard-nav, 3s on desktop with mouse. + /// Maestro builds extend the delay because accessibility-tree queries can take + /// longer than the production timeout on physical devices. Duration get _hideDelay { + if (const bool.fromEnvironment('PLEZY_MAESTRO_E2E')) { + return const Duration(seconds: 30); + } final isMobile = (Platform.isIOS || Platform.isAndroid) && !PlatformDetector.isTV(); if (isMobile || PlatformDetector.isTV() || _videoPlayerNavigationEnabled) { return const Duration(seconds: 5); @@ -82,6 +87,15 @@ extension _PlexVideoControlsVisibilityMethods on _PlexVideoControlsState { widget.chromeController.toggle(); } + void _toggleControlsFromSemantics() { + if (_showControls) { + widget.chromeController.hide(); + return; + } + widget.chromeController.show(restartAutoHide: false); + widget.chromeController.cancelAutoHide(); + } + /// Apply preferred orientations for the given lock state. Wired to /// [SettingsService.rotationLocked] via [bindEffect] so any change โ€” from /// this toggle or from the settings screen โ€” fires the same SystemChrome call. diff --git a/lib/widgets/video_controls/sheets/track_sheet.dart b/lib/widgets/video_controls/sheets/track_sheet.dart index c6bf6896..b43a4f0f 100644 --- a/lib/widgets/video_controls/sheets/track_sheet.dart +++ b/lib/widgets/video_controls/sheets/track_sheet.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:material_symbols_icons/symbols.dart'; @@ -135,7 +137,7 @@ class TrackSheet extends StatelessWidget { class _SourceAudioColumn extends StatefulWidget { final List tracks; final int? selectedStreamId; - final ValueChanged onSelected; + final Future Function(int) onSelected; final bool showHeader; const _SourceAudioColumn({ @@ -151,6 +153,7 @@ class _SourceAudioColumn extends StatefulWidget { class _SourceAudioColumnState extends State<_SourceAudioColumn> { final _initialScroll = InitialItemScrollController(); + bool _selectionPending = false; @override void dispose() { @@ -158,6 +161,17 @@ class _SourceAudioColumnState extends State<_SourceAudioColumn> { super.dispose(); } + Future _select(int streamId) async { + if (_selectionPending) return; + setState(() => _selectionPending = true); + try { + await widget.onSelected(streamId); + if (mounted) OverlaySheetController.of(context).close(); + } finally { + if (mounted) setState(() => _selectionPending = false); + } + } + @override Widget build(BuildContext context) { final selectedId = _effectiveSelectedStreamId(); @@ -167,6 +181,7 @@ class _SourceAudioColumnState extends State<_SourceAudioColumn> { return Column( children: [ if (widget.showHeader) SheetColumnHeader(label: t.videoControls.audioLabel), + if (_selectionPending) const LinearProgressIndicator(minHeight: 2), Expanded( child: ListView.builder( controller: _initialScroll.controller, @@ -179,10 +194,7 @@ class _SourceAudioColumnState extends State<_SourceAudioColumn> { key: index == 0 ? _initialScroll.firstItemKey : null, label: track.label, isSelected: isSelected, - onTap: () { - OverlaySheetController.of(context).close(); - widget.onSelected(track.id); - }, + onTap: () => unawaited(_select(track.id)), ); }, ), @@ -214,6 +226,7 @@ class _SourceSubtitleColumn extends StatefulWidget { class _SourceSubtitleColumnState extends State<_SourceSubtitleColumn> { final _initialScroll = InitialItemScrollController(); + bool _selectionPending = false; @override void dispose() { @@ -221,6 +234,17 @@ class _SourceSubtitleColumnState extends State<_SourceSubtitleColumn> { super.dispose(); } + Future _select(PlaybackSourceSubtitleChoice choice) async { + if (_selectionPending) return; + setState(() => _selectionPending = true); + try { + await widget.trackControlsState.onSwitchSubtitle!(choice); + if (mounted) OverlaySheetController.of(context).close(); + } finally { + if (mounted) setState(() => _selectionPending = false); + } + } + @override Widget build(BuildContext context) { final selectedChoice = _effectiveSelectedChoice(); @@ -231,6 +255,7 @@ class _SourceSubtitleColumnState extends State<_SourceSubtitleColumn> { return Column( children: [ if (widget.showHeader) SheetColumnHeader(label: t.videoControls.subtitlesLabel), + if (_selectionPending) const LinearProgressIndicator(minHeight: 2), Expanded( child: ListView.builder( controller: _initialScroll.controller, @@ -241,10 +266,7 @@ class _SourceSubtitleColumnState extends State<_SourceSubtitleColumn> { context: context, key: _initialScroll.firstItemKey, isSelected: selectedChoice.isOff, - onTap: () { - OverlaySheetController.of(context).close(); - widget.trackControlsState.onSwitchSubtitle!(const PlaybackSourceSubtitleChoice.off()); - }, + onTap: () => unawaited(_select(const PlaybackSourceSubtitleChoice.off())), ); } @@ -253,10 +275,7 @@ class _SourceSubtitleColumnState extends State<_SourceSubtitleColumn> { context: context, label: track.labelForIndex(index - 1), isSelected: track.id == selectedId, - onTap: () { - OverlaySheetController.of(context).close(); - widget.trackControlsState.onSwitchSubtitle!(PlaybackSourceSubtitleChoice.source(track.id)); - }, + onTap: () => unawaited(_select(PlaybackSourceSubtitleChoice.source(track.id))), ); }, ), @@ -372,6 +391,7 @@ class _SubtitleColumn extends StatefulWidget { class _SubtitleColumnState extends State<_SubtitleColumn> { final _initialScroll = InitialItemScrollController(); + bool _selectionPending = false; @override void dispose() { @@ -379,6 +399,17 @@ class _SubtitleColumnState extends State<_SubtitleColumn> { super.dispose(); } + Future _selectSourceSidecar(int streamId) async { + if (_selectionPending) return; + setState(() => _selectionPending = true); + try { + await widget.trackControlsState.onSwitchSubtitle!(PlaybackSourceSubtitleChoice.source(streamId)); + if (mounted) OverlaySheetController.of(context).close(); + } finally { + if (mounted) setState(() => _selectionPending = false); + } + } + @override Widget build(BuildContext context) { final selectedSub = widget.selection.subtitle; @@ -401,6 +432,7 @@ class _SubtitleColumnState extends State<_SubtitleColumn> { return Column( children: [ if (widget.showHeader) SheetColumnHeader(label: t.videoControls.subtitlesLabel), + if (_selectionPending) const LinearProgressIndicator(minHeight: 2), Expanded( child: ListView.builder( controller: _initialScroll.controller, @@ -444,10 +476,7 @@ class _SubtitleColumnState extends State<_SubtitleColumn> { context: context, label: sourceTrack.labelForIndex(trackIndex), isSelected: false, - onTap: () { - OverlaySheetController.of(context).close(); - widget.trackControlsState.onSwitchSubtitle!(PlaybackSourceSubtitleChoice.source(sourceTrack.id)); - }, + onTap: () => unawaited(_selectSourceSidecar(sourceTrack.id)), ); } diff --git a/lib/widgets/video_controls/video_control_button.dart b/lib/widgets/video_controls/video_control_button.dart index 5b9b5927..7c9402f2 100644 --- a/lib/widgets/video_controls/video_control_button.dart +++ b/lib/widgets/video_controls/video_control_button.dart @@ -23,6 +23,12 @@ class VideoControlButton extends StatelessWidget { /// If not provided, falls back to tooltip. final String? semanticLabel; + /// Optional current value announced after [semanticLabel]. + final String? semanticValue; + + /// Optional checked state for toggle-style controls. + final bool? checked; + /// Whether this button represents an active state (e.g., a feature is enabled). /// When true, the icon color defaults to amber instead of white. final bool isActive; @@ -45,6 +51,8 @@ class VideoControlButton extends StatelessWidget { this.color, this.tooltip, this.semanticLabel, + this.semanticValue, + this.checked, this.isActive = false, this.focusNode, this.onKeyEvent, @@ -64,9 +72,8 @@ class VideoControlButton extends StatelessWidget { constraints: const BoxConstraints(minWidth: 40, minHeight: 40), ); - Widget result = semanticLabel != null - ? Semantics(label: semanticLabel, button: true, excludeSemantics: true, child: button) - : button; + final effectiveSemanticLabel = semanticLabel ?? tooltip; + Widget result = button; if (focusNode != null) { result = FocusableWrapper( @@ -75,12 +82,25 @@ class VideoControlButton extends StatelessWidget { onKeyEvent: onKeyEvent, onFocusChange: onFocusChange, autofocus: autofocus, - semanticLabel: semanticLabel, + semanticLabel: effectiveSemanticLabel, + semanticValue: semanticValue, + checked: checked, borderRadius: 20, // Circular for icon buttons autoScroll: false, // Video controls don't scroll useBackgroundFocus: true, // Use background highlight for video controls child: result, ); + } else if (effectiveSemanticLabel != null) { + result = Semantics( + label: effectiveSemanticLabel, + value: semanticValue, + button: true, + enabled: onPressed != null, + checked: checked, + onTap: onPressed, + excludeSemantics: true, + child: result, + ); } return result; diff --git a/lib/widgets/video_controls/video_controls.dart b/lib/widgets/video_controls/video_controls.dart index f982ed72..bd306e44 100644 --- a/lib/widgets/video_controls/video_controls.dart +++ b/lib/widgets/video_controls/video_controls.dart @@ -61,6 +61,7 @@ import '../../utils/player_utils.dart'; import '../../theme/mono_tokens.dart'; import '../../utils/provider_extensions.dart'; import '../../utils/snackbar_helper.dart'; +import '../../utils/latest_async_write.dart'; import 'icons.dart'; import 'player_chrome_controller.dart'; import 'playback_extras_loader.dart'; @@ -802,6 +803,9 @@ class _PlexVideoControlsState extends State @override void didUpdateWidget(PlexVideoControls oldWidget) { super.didUpdateWidget(oldWidget); + if (oldWidget.player != widget.player) { + ++_subtitleVisibilityWriteGeneration; + } if (oldWidget.chromeController != widget.chromeController) { oldWidget.chromeController.removeListener(_onChromeChanged); _lastControlsVisible = widget.chromeController.controlsVisible; @@ -827,6 +831,7 @@ class _PlexVideoControlsState extends State @override void dispose() { + ++_subtitleVisibilityWriteGeneration; HardwareKeyboard.instance.removeHandler(_handleGlobalKeyEvent); widget.chromeController.removeListener(_onChromeChanged); widget.hasFirstFrame?.removeListener(_onFirstFrameReady); @@ -977,13 +982,21 @@ class _PlexVideoControlsState extends State const Positioned(top: 0, left: 0, child: LinuxKeepAlive()), // Also handles long-press for 2x speed. Positioned.fill( - child: GestureDetector( - onTap: _handleOuterTap, - onLongPressStart: (_) => _handleLongPressStart(), - onLongPressEnd: (_) => _handleLongPressEnd(), - onLongPressCancel: _handleLongPressCancel, - behavior: HitTestBehavior.opaque, - child: const ColoredBox(color: Colors.transparent), + child: Semantics( + button: true, + label: _showControls + ? t.videoControls.hidePlaybackControls + : t.videoControls.showPlaybackControls, + onTap: _toggleControlsFromSemantics, + child: GestureDetector( + excludeFromSemantics: true, + onTap: _handleOuterTap, + onLongPressStart: (_) => _handleLongPressStart(), + onLongPressEnd: (_) => _handleLongPressEnd(), + onLongPressCancel: _handleLongPressCancel, + behavior: HitTestBehavior.opaque, + child: const ColoredBox(color: Colors.transparent), + ), ), ), // Mobile double-tap zones for skip forward/backward diff --git a/lib/widgets/video_controls/widgets/circular_control_button.dart b/lib/widgets/video_controls/widgets/circular_control_button.dart index 199e128f..ab2e111b 100644 --- a/lib/widgets/video_controls/widgets/circular_control_button.dart +++ b/lib/widgets/video_controls/widgets/circular_control_button.dart @@ -27,6 +27,8 @@ class CircularControlButton extends StatelessWidget { child: Semantics( label: semanticLabel, button: true, + enabled: isEnabled, + onTap: onPressed, excludeSemantics: true, child: IconButton( icon: AppIcon( diff --git a/lib/widgets/video_controls/widgets/content_strip.dart b/lib/widgets/video_controls/widgets/content_strip.dart index 691d70b9..f8cb894f 100644 --- a/lib/widgets/video_controls/widgets/content_strip.dart +++ b/lib/widgets/video_controls/widgets/content_strip.dart @@ -104,6 +104,18 @@ class ContentStripState extends State { if (!identical(oldWidget.player, widget.player) || !identical(oldWidget.chapters, widget.chapters)) { _bindChapterIndexStream(); } + _normalizeActiveTab(); + } + + void _normalizeActiveTab() { + if (_activeTab == _StripTab.chapters && !_hasChapters && _hasQueue) { + _activeTab = _StripTab.queue; + _lastAutoScrolledQueueItemID = null; + _lastAutoScrolledQueueIndex = null; + } else if (_activeTab == _StripTab.queue && !_hasQueue && _hasChapters) { + _activeTab = _StripTab.chapters; + _lastAutoScrolledChapterIndex = null; + } } void _bindChapterIndexStream() { diff --git a/lib/widgets/video_controls/widgets/sync_offset_control.dart b/lib/widgets/video_controls/widgets/sync_offset_control.dart index 8a68d976..ba14126d 100644 --- a/lib/widgets/video_controls/widgets/sync_offset_control.dart +++ b/lib/widgets/video_controls/widgets/sync_offset_control.dart @@ -69,6 +69,7 @@ class _SyncOffsetControlState extends State { late double _currentOffset; late double _confirmedOffset; int _writeGeneration = 0; + int _bindingGeneration = 0; Timer? _longPressTimer; @override @@ -85,6 +86,7 @@ class _SyncOffsetControlState extends State { widget.player != oldWidget.player || widget.propertyName != oldWidget.propertyName) { ++_writeGeneration; + ++_bindingGeneration; _currentOffset = widget.initialOffset.toDouble(); _confirmedOffset = _currentOffset; } @@ -93,6 +95,7 @@ class _SyncOffsetControlState extends State { @override void dispose() { ++_writeGeneration; + ++_bindingGeneration; _longPressTimer?.cancel(); super.dispose(); } @@ -104,16 +107,26 @@ class _SyncOffsetControlState extends State { final coordinator = _syncOffsetWrites[targetPlayer] ??= LatestAsyncWrite(); final writeToken = coordinator.begin(propertyName); final generation = ++_writeGeneration; + final bindingGeneration = _bindingGeneration; unawaited(() async { try { - // Convert milliseconds to seconds for mpv. - final offsetSeconds = offsetMs / 1000.0; - await targetPlayer.setProperty(propertyName, offsetSeconds.toString()); - final committed = await coordinator.commitIfLatest( - propertyName, - writeToken, - () => persistOffset(offsetMs.round()), - ); + final committed = await coordinator.commitIfLatest(propertyName, writeToken, () async { + // Convert milliseconds to seconds for mpv. Keep the native write and + // persistence on the same per-player/property queue so an older + // native write can never complete after a newer one. + final offsetSeconds = offsetMs / 1000.0; + await targetPlayer.setProperty(propertyName, offsetSeconds.toString()); + await persistOffset(offsetMs.round()); + if (mounted && + bindingGeneration == _bindingGeneration && + targetPlayer == widget.player && + propertyName == widget.propertyName) { + // A write may finish successfully after a newer intent was queued. + // Keep it as the rollback baseline without replacing the newer + // optimistic value currently shown by the control. + _confirmedOffset = offsetMs; + } + }); if (!committed || !mounted || generation != _writeGeneration || @@ -121,7 +134,6 @@ class _SyncOffsetControlState extends State { propertyName != widget.propertyName) { return; } - _confirmedOffset = offsetMs; } catch (error, stackTrace) { appLogger.w('Failed to update playback sync offset', error: error, stackTrace: stackTrace); if (!mounted || diff --git a/lib/widgets/video_controls/widgets/track_chapter_controls.dart b/lib/widgets/video_controls/widgets/track_chapter_controls.dart index 235abbbc..72efae64 100644 --- a/lib/widgets/video_controls/widgets/track_chapter_controls.dart +++ b/lib/widgets/video_controls/widgets/track_chapter_controls.dart @@ -9,6 +9,7 @@ import '../../../mpv/mpv.dart'; import '../../../media/media_source_info.dart'; import '../../../services/sleep_timer_service.dart'; import '../../../utils/platform_detector.dart'; +import '../../../utils/quality_preset_labels.dart'; import '../../../i18n/strings.g.dart'; import '../../../widgets/overlay_sheet.dart'; import '../models/track_controls_state.dart'; @@ -18,6 +19,7 @@ import '../sheets/queue_sheet.dart'; import '../sheets/track_sheet.dart'; import '../sheets/video_settings_sheet.dart'; import '../../../services/shader_service.dart'; +import '../../../utils/track_label_builder.dart'; import '../video_control_button.dart'; /// Row of track and chapter control buttons for the video player @@ -154,12 +156,16 @@ class TrackChapterControls extends StatelessWidget { required bool isMobile, required bool isDesktop, String? tooltip, + String? semanticValue, + bool? checked, bool isActive = false, }) { return VideoControlButton( icon: icon, tooltip: tooltip, semanticLabel: semanticLabel, + semanticValue: semanticValue, + checked: checked, isActive: isActive, focusNode: focusNodes != null && focusNodes!.length > buttonIndex ? focusNodes![buttonIndex] : null, onKeyEvent: focusNodes != null @@ -203,7 +209,9 @@ class TrackChapterControls extends StatelessWidget { buttonIndex: 0, icon: Symbols.tune_rounded, isActive: isActive, + checked: isActive, tooltip: t.videoControls.settingsButton, + semanticValue: _versionQualitySemanticValue(), semanticLabel: t.videoControls.settingsButton, isMobile: isMobile, isDesktop: isDesktop, @@ -250,28 +258,36 @@ class TrackChapterControls extends StatelessWidget { // Combined audio & subtitles button { final currentIndex = buttonIndex; - final hasSubtitleControls = trackControlsState.hasSubtitleControls(tracks); - final selectedSub = player.state.track.subtitle; - final hasActiveSubtitle = selectedSub != null && selectedSub.id != 'no'; - final isHidden = hasSubtitleControls && hasActiveSubtitle && !subtitlesVisible; - final icon = hasSubtitleControls - ? (isHidden ? Symbols.subtitles_off_rounded : Symbols.subtitles_rounded) - : Symbols.audiotrack_rounded; buttons.add( - _buildTrackButton( - buttonIndex: currentIndex, - icon: icon, - tooltip: t.videoControls.tracksButton, - semanticLabel: t.videoControls.tracksButton, - isMobile: isMobile, - isDesktop: isDesktop, - onPressed: () { - onCancelAutoHide?.call(); - OverlaySheetController.of(context) - .show( - builder: (_) => TrackSheet(player: player, trackControlsState: trackControlsState), - ) - .whenComplete(() => onStartAutoHide?.call()); + StreamBuilder( + stream: player.streams.track, + initialData: player.state.track, + builder: (context, selectionSnapshot) { + final selection = selectionSnapshot.data ?? player.state.track; + final hasSubtitleControls = trackControlsState.hasSubtitleControls(tracks); + final selectedSub = selection.subtitle; + final hasActiveSubtitle = selectedSub != null && selectedSub.id != SubtitleTrack.off.id; + final isHidden = hasSubtitleControls && hasActiveSubtitle && !subtitlesVisible; + final icon = hasSubtitleControls + ? (isHidden ? Symbols.subtitles_off_rounded : Symbols.subtitles_rounded) + : Symbols.audiotrack_rounded; + return _buildTrackButton( + buttonIndex: currentIndex, + icon: icon, + tooltip: t.videoControls.tracksButton, + semanticLabel: t.videoControls.tracksButton, + semanticValue: _selectionSemanticValue(tracks, selection), + isMobile: isMobile, + isDesktop: isDesktop, + onPressed: () { + onCancelAutoHide?.call(); + OverlaySheetController.of(context) + .show( + builder: (_) => TrackSheet(player: player, trackControlsState: trackControlsState), + ) + .whenComplete(() => onStartAutoHide?.call()); + }, + ); }, ), ); @@ -358,6 +374,7 @@ class TrackChapterControls extends StatelessWidget { icon: _getBoxFitIcon(boxFitMode), tooltip: _getBoxFitTooltip(boxFitMode), semanticLabel: t.videoControls.aspectRatioButton, + semanticValue: _getBoxFitTooltip(boxFitMode), isMobile: isMobile, isDesktop: isDesktop, onPressed: onCycleBoxFitMode, @@ -375,6 +392,7 @@ class TrackChapterControls extends StatelessWidget { icon: isRotationLocked ? Symbols.screen_lock_rotation_rounded : Symbols.screen_rotation_rounded, tooltip: isRotationLocked ? t.videoControls.unlockRotation : t.videoControls.lockRotation, semanticLabel: t.videoControls.rotationLockButton, + checked: isRotationLocked, isMobile: isMobile, isDesktop: isDesktop, onPressed: onToggleRotationLock, @@ -410,6 +428,7 @@ class TrackChapterControls extends StatelessWidget { tooltip: t.videoControls.alwaysOnTopButton, semanticLabel: t.videoControls.alwaysOnTopButton, isActive: isAlwaysOnTop, + checked: isAlwaysOnTop, isMobile: isMobile, isDesktop: isDesktop, onPressed: onToggleAlwaysOnTop, @@ -427,6 +446,7 @@ class TrackChapterControls extends StatelessWidget { icon: isFullscreen ? Symbols.fullscreen_exit_rounded : Symbols.fullscreen_rounded, tooltip: isFullscreen ? t.videoControls.exitFullscreenButton : t.videoControls.fullscreenButton, semanticLabel: isFullscreen ? t.videoControls.exitFullscreenButton : t.videoControls.fullscreenButton, + checked: isFullscreen, isMobile: isMobile, isDesktop: isDesktop, onPressed: onToggleFullscreen, @@ -441,6 +461,62 @@ class TrackChapterControls extends StatelessWidget { ); } + String? _versionQualitySemanticValue() { + final values = []; + if (availableVersions.length > 1) { + final index = selectedMediaIndex; + if (index >= 0 && index < availableVersions.length) { + values.add(availableVersions[index].displayLabel); + } + } + if (serverSupportsTranscoding) { + values.add(qualityPresetLabel(selectedQualityPreset)); + } + return values.isEmpty ? null : values.join(' / '); + } + + String? _selectionSemanticValue(Tracks? tracks, TrackSelection selection) { + final values = []; + final audio = selection.audio; + if (audio != null && audio.id != AudioTrack.off.id) { + final index = tracks?.audio.indexWhere((track) => track.id == audio.id) ?? -1; + final visibleIndex = index < 0 ? 0 : index; + final label = TrackLabelBuilder.audioLabel( + title: audio.title, + language: audio.language, + codec: audio.codec, + channels: audio.channelsCount, + index: visibleIndex, + ); + final fallback = 'Audio Track ${visibleIndex + 1}'; + values.add( + label.primary == fallback + ? _joinTrackLabel(t.audioTracks.track(n: visibleIndex + 1), label.secondary) + : label.joined, + ); + } + + final subtitle = selection.subtitle; + if (subtitle != null && subtitle.id != SubtitleTrack.off.id) { + final index = tracks?.subtitle.indexWhere((track) => track.id == subtitle.id) ?? -1; + values.add( + TrackLabelBuilder.subtitleLabel( + title: subtitle.title, + language: subtitle.language, + codec: subtitle.codec, + forced: subtitle.isForced, + index: index < 0 ? 0 : index, + ).joined, + ); + } + + return values.isEmpty ? null : values.join(', '); + } + + String _joinTrackLabel(String primary, String? secondary) { + return secondary == null ? primary : '$primary ยท $secondary'; + } + /// Calculate total button count for navigation int _getButtonCount(bool isMobile, bool isDesktop) { int count = 1; // Settings button always shown diff --git a/lib/widgets/video_controls/widgets/video_controls_header.dart b/lib/widgets/video_controls/widgets/video_controls_header.dart index 4597459c..1c7060ba 100644 --- a/lib/widgets/video_controls/widgets/video_controls_header.dart +++ b/lib/widgets/video_controls/widgets/video_controls_header.dart @@ -48,11 +48,7 @@ class VideoControlsHeader extends StatelessWidget { final itemTitle = metadata.title ?? t.common.unknown; return Row( children: [ - AppBarBackButton( - style: BackButtonStyle.video, - semanticLabel: t.common.back, - onPressed: onBack ?? () => Navigator.of(context).pop(true), - ), + AppBarBackButton(style: BackButtonStyle.video, onPressed: onBack ?? () => Navigator.of(context).pop(true)), const SizedBox(width: 16), Expanded( child: style == VideoHeaderStyle.singleLine diff --git a/lib/widgets/video_controls/widgets/volume_control.dart b/lib/widgets/video_controls/widgets/volume_control.dart index 45ccd969..4b63e224 100644 --- a/lib/widgets/video_controls/widgets/volume_control.dart +++ b/lib/widgets/video_controls/widgets/volume_control.dart @@ -128,6 +128,8 @@ class _VolumeControlState extends State { final muteButton = Semantics( label: isMuted ? t.videoControls.unmuteButton : t.videoControls.muteButton, button: true, + enabled: true, + onTap: widget.volumeController.toggleMute, excludeSemantics: true, child: IconButton( icon: AppIcon( diff --git a/pubspec.lock b/pubspec.lock index 4c68a051..ba6f39bc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1296,6 +1296,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.7" + unorm_dart: + dependency: "direct main" + description: + name: unorm_dart + sha256: "0c69186b03ca6addab0774bcc0f4f17b88d4ce78d9d4d8f0619e30a99ead58e7" + url: "https://pub.dev" + source: hosted + version: "0.3.2" url_launcher: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index c75fbfd5..f507dafc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -81,6 +81,7 @@ dependencies: freezed_annotation: ^3.1.0 xml: ^6.6.1 string_similarity: ^2.2.0 + unorm_dart: ^0.3.2 dev_dependencies: flutter_test: diff --git a/scripts/check_codegen.py b/scripts/check_codegen.py index e2582891..e6103daf 100755 --- a/scripts/check_codegen.py +++ b/scripts/check_codegen.py @@ -10,7 +10,12 @@ import sys import tempfile from pathlib import Path -EXPLICIT_GENERATED = {"server/relay_protocol_gen.go"} +EXPLICIT_GENERATED = { + "lib/data/ducet_order.dart", + "lib/data/hid_key_labels.dart", + "lib/data/iso_639_data.dart", + "server/relay_protocol_gen.go", +} DEPENDENCY_STATE = ("package_config.json", "package_graph.json") @@ -95,7 +100,7 @@ def _dirty_generated_paths(root: Path) -> set[str]: "-z", "--", "lib", - "server/relay_protocol_gen.go", + *EXPLICIT_GENERATED, ).stdout ) return {relative for relative in changed + untracked if _is_generated(relative)} diff --git a/scripts/codegen.sh b/scripts/codegen.sh index 0424944b..24b99cc8 100755 --- a/scripts/codegen.sh +++ b/scripts/codegen.sh @@ -7,6 +7,9 @@ if [[ "${1:-}" == "--check" ]]; then exec python3 scripts/check_codegen.py "$@" fi +dart run scripts/generate_ducet_ranks.dart +dart run scripts/generate_hid_key_labels.dart +dart run scripts/generate_iso_639_data.dart python3 scripts/generate_relay_protocol.py dart run slang dart run build_runner build --delete-conflicting-outputs "$@" diff --git a/scripts/data/FractionalUCA-651afecf9ccf1541a49306993e8210fa2209aa0b.txt.gz b/scripts/data/FractionalUCA-651afecf9ccf1541a49306993e8210fa2209aa0b.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..a0c9cce83e82fa5b76525d4a3422817d855b47d4 GIT binary patch literal 590413 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⋙WCHL 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
    V!kiA@7EPc4R4paMlH-%FVO}d8>Izw|_V_^- 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%0D~vuOp`ocI8=(S=aK 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�BFFu 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 gAvbjoo1LBn|MWNClMv|zpjlJbFS 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%0A&^5+>aUoL2@V;Z|RXGl}=9b&qA! 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 z

    leS#pe36LQ462^OB)`T?8)hJ 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%0A3y()3jW0Udo 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 TfBvX1?O*>7#$qP4gqIxv%kjr9 literal 0 HcmV?d00001 diff --git a/scripts/data/hid_key_labels.json b/scripts/data/hid_key_labels.json new file mode 100644 index 00000000..a89dba4d --- /dev/null +++ b/scripts/data/hid_key_labels.json @@ -0,0 +1,1331 @@ +{ + "schemaVersion": 1, + "description": "Plezy's curated physical-key compatibility labels, grouped for generated output. This is not a complete USB HID usage registry.", + "groups": [ + { + "name": "Special", + "keys": [ + { + "id": "00000010", + "label": "Hyper" + }, + { + "id": "00000011", + "label": "Super" + }, + { + "id": "00000012", + "label": "Fn" + }, + { + "id": "00000013", + "label": "Fn Lock" + }, + { + "id": "00000014", + "label": "Suspend" + }, + { + "id": "00000015", + "label": "Resume" + }, + { + "id": "00000016", + "label": "Turbo" + }, + { + "id": "00000017", + "label": "Privacy Screen Toggle" + }, + { + "id": "00000018", + "label": "Microphone Mute" + } + ] + }, + { + "name": "Generic Desktop", + "keys": [ + { + "id": "00010082", + "label": "Sleep" + }, + { + "id": "00010083", + "label": "Wake Up" + }, + { + "id": "000100b5", + "label": "Display Toggle" + } + ] + }, + { + "name": "Game Buttons", + "keys": [ + { + "id": "0005ff01", + "label": "Game Button 1" + }, + { + "id": "0005ff02", + "label": "Game Button 2" + }, + { + "id": "0005ff03", + "label": "Game Button 3" + }, + { + "id": "0005ff04", + "label": "Game Button 4" + }, + { + "id": "0005ff05", + "label": "Game Button 5" + }, + { + "id": "0005ff06", + "label": "Game Button 6" + }, + { + "id": "0005ff07", + "label": "Game Button 7" + }, + { + "id": "0005ff08", + "label": "Game Button 8" + }, + { + "id": "0005ff09", + "label": "Game Button 9" + }, + { + "id": "0005ff0a", + "label": "Game Button 10" + }, + { + "id": "0005ff0b", + "label": "Game Button 11" + }, + { + "id": "0005ff0c", + "label": "Game Button 12" + }, + { + "id": "0005ff0d", + "label": "Game Button 13" + }, + { + "id": "0005ff0e", + "label": "Game Button 14" + }, + { + "id": "0005ff0f", + "label": "Game Button 15" + }, + { + "id": "0005ff10", + "label": "Game Button 16" + }, + { + "id": "0005ff11", + "label": "Game Button A" + }, + { + "id": "0005ff12", + "label": "Game Button B" + }, + { + "id": "0005ff13", + "label": "Game Button C" + }, + { + "id": "0005ff14", + "label": "Game Button Left 1" + }, + { + "id": "0005ff15", + "label": "Game Button Left 2" + }, + { + "id": "0005ff16", + "label": "Game Button Mode" + }, + { + "id": "0005ff17", + "label": "Game Button Right 1" + }, + { + "id": "0005ff18", + "label": "Game Button Right 2" + }, + { + "id": "0005ff19", + "label": "Game Button Select" + }, + { + "id": "0005ff1a", + "label": "Game Button Start" + }, + { + "id": "0005ff1b", + "label": "Game Button Thumb Left" + }, + { + "id": "0005ff1c", + "label": "Game Button Thumb Right" + }, + { + "id": "0005ff1d", + "label": "Game Button X" + }, + { + "id": "0005ff1e", + "label": "Game Button Y" + }, + { + "id": "0005ff1f", + "label": "Game Button Z" + } + ] + }, + { + "name": "Keyboard/Keypad", + "keys": [ + { + "id": "00070004", + "label": "A" + }, + { + "id": "00070005", + "label": "B" + }, + { + "id": "00070006", + "label": "C" + }, + { + "id": "00070007", + "label": "D" + }, + { + "id": "00070008", + "label": "E" + }, + { + "id": "00070009", + "label": "F" + }, + { + "id": "0007000a", + "label": "G" + }, + { + "id": "0007000b", + "label": "H" + }, + { + "id": "0007000c", + "label": "I" + }, + { + "id": "0007000d", + "label": "J" + }, + { + "id": "0007000e", + "label": "K" + }, + { + "id": "0007000f", + "label": "L" + }, + { + "id": "00070010", + "label": "M" + }, + { + "id": "00070011", + "label": "N" + }, + { + "id": "00070012", + "label": "O" + }, + { + "id": "00070013", + "label": "P" + }, + { + "id": "00070014", + "label": "Q" + }, + { + "id": "00070015", + "label": "R" + }, + { + "id": "00070016", + "label": "S" + }, + { + "id": "00070017", + "label": "T" + }, + { + "id": "00070018", + "label": "U" + }, + { + "id": "00070019", + "label": "V" + }, + { + "id": "0007001a", + "label": "W" + }, + { + "id": "0007001b", + "label": "X" + }, + { + "id": "0007001c", + "label": "Y" + }, + { + "id": "0007001d", + "label": "Z" + }, + { + "id": "0007001e", + "label": "1" + }, + { + "id": "0007001f", + "label": "2" + }, + { + "id": "00070020", + "label": "3" + }, + { + "id": "00070021", + "label": "4" + }, + { + "id": "00070022", + "label": "5" + }, + { + "id": "00070023", + "label": "6" + }, + { + "id": "00070024", + "label": "7" + }, + { + "id": "00070025", + "label": "8" + }, + { + "id": "00070026", + "label": "9" + }, + { + "id": "00070027", + "label": "0" + }, + { + "id": "00070028", + "label": "Enter" + }, + { + "id": "00070029", + "label": "Escape" + }, + { + "id": "0007002a", + "label": "Backspace" + }, + { + "id": "0007002b", + "label": "Tab" + }, + { + "id": "0007002c", + "label": "Space" + }, + { + "id": "0007002d", + "label": "-" + }, + { + "id": "0007002e", + "label": "=" + }, + { + "id": "0007002f", + "label": "[" + }, + { + "id": "00070030", + "label": "]" + }, + { + "id": "00070031", + "label": "\\" + }, + { + "id": "00070033", + "label": ";" + }, + { + "id": "00070034", + "label": "'" + }, + { + "id": "00070035", + "label": "`" + }, + { + "id": "00070036", + "label": "," + }, + { + "id": "00070037", + "label": "." + }, + { + "id": "00070038", + "label": "/" + }, + { + "id": "00070039", + "label": "Caps Lock" + }, + { + "id": "0007003a", + "label": "F1" + }, + { + "id": "0007003b", + "label": "F2" + }, + { + "id": "0007003c", + "label": "F3" + }, + { + "id": "0007003d", + "label": "F4" + }, + { + "id": "0007003e", + "label": "F5" + }, + { + "id": "0007003f", + "label": "F6" + }, + { + "id": "00070040", + "label": "F7" + }, + { + "id": "00070041", + "label": "F8" + }, + { + "id": "00070042", + "label": "F9" + }, + { + "id": "00070043", + "label": "F10" + }, + { + "id": "00070044", + "label": "F11" + }, + { + "id": "00070045", + "label": "F12" + }, + { + "id": "00070046", + "label": "Print Screen" + }, + { + "id": "00070047", + "label": "Scroll Lock" + }, + { + "id": "00070048", + "label": "Pause" + }, + { + "id": "00070049", + "label": "Insert" + }, + { + "id": "0007004a", + "label": "Home" + }, + { + "id": "0007004b", + "label": "Page Up" + }, + { + "id": "0007004c", + "label": "Delete" + }, + { + "id": "0007004d", + "label": "End" + }, + { + "id": "0007004e", + "label": "Page Down" + }, + { + "id": "0007004f", + "label": "Arrow Right" + }, + { + "id": "00070050", + "label": "Arrow Left" + }, + { + "id": "00070051", + "label": "Arrow Down" + }, + { + "id": "00070052", + "label": "Arrow Up" + }, + { + "id": "00070053", + "label": "Num Lock" + }, + { + "id": "00070054", + "label": "Numpad /" + }, + { + "id": "00070055", + "label": "Numpad *" + }, + { + "id": "00070056", + "label": "Numpad -" + }, + { + "id": "00070057", + "label": "Numpad +" + }, + { + "id": "00070058", + "label": "Numpad Enter" + }, + { + "id": "00070059", + "label": "Numpad 1" + }, + { + "id": "0007005a", + "label": "Numpad 2" + }, + { + "id": "0007005b", + "label": "Numpad 3" + }, + { + "id": "0007005c", + "label": "Numpad 4" + }, + { + "id": "0007005d", + "label": "Numpad 5" + }, + { + "id": "0007005e", + "label": "Numpad 6" + }, + { + "id": "0007005f", + "label": "Numpad 7" + }, + { + "id": "00070060", + "label": "Numpad 8" + }, + { + "id": "00070061", + "label": "Numpad 9" + }, + { + "id": "00070062", + "label": "Numpad 0" + }, + { + "id": "00070063", + "label": "Numpad ." + }, + { + "id": "00070064", + "label": "Intl Backslash" + }, + { + "id": "00070065", + "label": "Context Menu" + }, + { + "id": "00070066", + "label": "Power" + }, + { + "id": "00070067", + "label": "Numpad =" + }, + { + "id": "00070068", + "label": "F13" + }, + { + "id": "00070069", + "label": "F14" + }, + { + "id": "0007006a", + "label": "F15" + }, + { + "id": "0007006b", + "label": "F16" + }, + { + "id": "0007006c", + "label": "F17" + }, + { + "id": "0007006d", + "label": "F18" + }, + { + "id": "0007006e", + "label": "F19" + }, + { + "id": "0007006f", + "label": "F20" + }, + { + "id": "00070070", + "label": "F21" + }, + { + "id": "00070071", + "label": "F22" + }, + { + "id": "00070072", + "label": "F23" + }, + { + "id": "00070073", + "label": "F24" + }, + { + "id": "00070074", + "label": "Open" + }, + { + "id": "00070075", + "label": "Help" + }, + { + "id": "00070077", + "label": "Select" + }, + { + "id": "00070079", + "label": "Again" + }, + { + "id": "0007007a", + "label": "Undo" + }, + { + "id": "0007007b", + "label": "Cut" + }, + { + "id": "0007007c", + "label": "Copy" + }, + { + "id": "0007007d", + "label": "Paste" + }, + { + "id": "0007007e", + "label": "Find" + }, + { + "id": "0007007f", + "label": "Volume Mute" + }, + { + "id": "00070080", + "label": "Volume Up" + }, + { + "id": "00070081", + "label": "Volume Down" + }, + { + "id": "00070085", + "label": "Numpad ," + }, + { + "id": "00070087", + "label": "Intl Ro" + }, + { + "id": "00070088", + "label": "Kana Mode" + }, + { + "id": "00070089", + "label": "Intl Yen" + }, + { + "id": "0007008a", + "label": "Convert" + }, + { + "id": "0007008b", + "label": "Non Convert" + }, + { + "id": "00070090", + "label": "Lang 1" + }, + { + "id": "00070091", + "label": "Lang 2" + }, + { + "id": "00070092", + "label": "Lang 3" + }, + { + "id": "00070093", + "label": "Lang 4" + }, + { + "id": "00070094", + "label": "Lang 5" + }, + { + "id": "0007009b", + "label": "Abort" + }, + { + "id": "000700a3", + "label": "Props" + }, + { + "id": "000700b6", + "label": "Numpad (" + }, + { + "id": "000700b7", + "label": "Numpad )" + }, + { + "id": "000700bb", + "label": "Numpad Backspace" + }, + { + "id": "000700d0", + "label": "Numpad Memory Store" + }, + { + "id": "000700d1", + "label": "Numpad Memory Recall" + }, + { + "id": "000700d2", + "label": "Numpad Memory Clear" + }, + { + "id": "000700d3", + "label": "Numpad Memory Add" + }, + { + "id": "000700d4", + "label": "Numpad Memory Subtract" + }, + { + "id": "000700d7", + "label": "Numpad Sign Change" + }, + { + "id": "000700d8", + "label": "Numpad Clear" + }, + { + "id": "000700d9", + "label": "Numpad Clear Entry" + }, + { + "id": "000700e0", + "label": "Ctrl" + }, + { + "id": "000700e1", + "label": "Shift" + }, + { + "id": "000700e2", + "label": "Alt" + }, + { + "id": "000700e3", + "label": "Meta" + }, + { + "id": "000700e4", + "label": "Ctrl" + }, + { + "id": "000700e5", + "label": "Shift" + }, + { + "id": "000700e6", + "label": "Alt" + }, + { + "id": "000700e7", + "label": "Meta" + } + ] + }, + { + "name": "Consumer", + "keys": [ + { + "id": "000c0030", + "label": "Power" + }, + { + "id": "000c0032", + "label": "Sleep" + }, + { + "id": "000c0040", + "label": "Menu" + }, + { + "id": "000c0041", + "label": "Menu Pick" + }, + { + "id": "000c0042", + "label": "Menu Up" + }, + { + "id": "000c0043", + "label": "Menu Down" + }, + { + "id": "000c0044", + "label": "Menu Left" + }, + { + "id": "000c0045", + "label": "Menu Right" + }, + { + "id": "000c0046", + "label": "Menu Escape" + }, + { + "id": "000c0047", + "label": "Menu Value Increase" + }, + { + "id": "000c0048", + "label": "Menu Value Decrease" + }, + { + "id": "000c0060", + "label": "Info" + }, + { + "id": "000c0061", + "label": "Closed Caption" + }, + { + "id": "000c0062", + "label": "Closed Caption Select" + }, + { + "id": "000c0063", + "label": "VCR/TV" + }, + { + "id": "000c0064", + "label": "Broadcast Mode" + }, + { + "id": "000c0065", + "label": "Snapshot" + }, + { + "id": "000c0066", + "label": "Still" + }, + { + "id": "000c0067", + "label": "PiP Toggle" + }, + { + "id": "000c0068", + "label": "PiP Swap" + }, + { + "id": "000c0069", + "label": "Red Button" + }, + { + "id": "000c006a", + "label": "Green Button" + }, + { + "id": "000c006b", + "label": "Blue Button" + }, + { + "id": "000c006c", + "label": "Yellow Button" + }, + { + "id": "000c006d", + "label": "Aspect" + }, + { + "id": "000c006e", + "label": "3D Mode Select" + }, + { + "id": "000c006f", + "label": "Brightness Up" + }, + { + "id": "000c0070", + "label": "Brightness Down" + }, + { + "id": "000c0072", + "label": "Brightness Toggle" + }, + { + "id": "000c0073", + "label": "Brightness Min" + }, + { + "id": "000c0074", + "label": "Brightness Max" + }, + { + "id": "000c0075", + "label": "Brightness Auto" + }, + { + "id": "000c0079", + "label": "Kbd Illum Up" + }, + { + "id": "000c007a", + "label": "Kbd Illum Down" + }, + { + "id": "000c0082", + "label": "Mode Step" + }, + { + "id": "000c0083", + "label": "Recall Last" + }, + { + "id": "000c0084", + "label": "Enter Channel" + }, + { + "id": "000c0085", + "label": "Order Movie" + }, + { + "id": "000c0086", + "label": "Channel" + }, + { + "id": "000c0088", + "label": "Media Computer" + }, + { + "id": "000c0089", + "label": "Media TV" + }, + { + "id": "000c008a", + "label": "Media WWW" + }, + { + "id": "000c008b", + "label": "Media DVD" + }, + { + "id": "000c008c", + "label": "Media Telephone" + }, + { + "id": "000c008d", + "label": "Program Guide" + }, + { + "id": "000c008e", + "label": "Media Video Phone" + }, + { + "id": "000c008f", + "label": "Media Games" + }, + { + "id": "000c0090", + "label": "Media Messages" + }, + { + "id": "000c0091", + "label": "Media CD" + }, + { + "id": "000c0092", + "label": "Media VCR" + }, + { + "id": "000c0093", + "label": "Media Tuner" + }, + { + "id": "000c0094", + "label": "Quit" + }, + { + "id": "000c0095", + "label": "Help" + }, + { + "id": "000c0096", + "label": "Media Tape" + }, + { + "id": "000c0097", + "label": "Media Cable" + }, + { + "id": "000c0098", + "label": "Media Satellite" + }, + { + "id": "000c0099", + "label": "Media Security" + }, + { + "id": "000c009a", + "label": "Media Home" + }, + { + "id": "000c009b", + "label": "Media Call" + }, + { + "id": "000c009c", + "label": "Channel Up" + }, + { + "id": "000c009d", + "label": "Channel Down" + }, + { + "id": "000c009e", + "label": "Media SAP" + }, + { + "id": "000c00b0", + "label": "Play" + }, + { + "id": "000c00b1", + "label": "Pause" + }, + { + "id": "000c00b2", + "label": "Record" + }, + { + "id": "000c00b3", + "label": "Fast Forward" + }, + { + "id": "000c00b4", + "label": "Rewind" + }, + { + "id": "000c00b5", + "label": "Next Track" + }, + { + "id": "000c00b6", + "label": "Previous Track" + }, + { + "id": "000c00b7", + "label": "Stop" + }, + { + "id": "000c00b8", + "label": "Eject" + }, + { + "id": "000c00b9", + "label": "Random Play" + }, + { + "id": "000c00ba", + "label": "Select Disc" + }, + { + "id": "000c00bb", + "label": "Enter Disc" + }, + { + "id": "000c00bc", + "label": "Repeat" + }, + { + "id": "000c00c0", + "label": "Frame Forward" + }, + { + "id": "000c00c1", + "label": "Frame Back" + }, + { + "id": "000c00cc", + "label": "Stop/Eject" + }, + { + "id": "000c00cd", + "label": "Play/Pause" + }, + { + "id": "000c00ce", + "label": "Play/Skip" + }, + { + "id": "000c00cf", + "label": "Voice Command" + }, + { + "id": "000c00e0", + "label": "Volume" + }, + { + "id": "000c00e2", + "label": "Mute" + }, + { + "id": "000c00e5", + "label": "Bass Boost" + }, + { + "id": "000c00e6", + "label": "Surround Mode" + }, + { + "id": "000c00e7", + "label": "Loudness" + }, + { + "id": "000c00e9", + "label": "Volume Up" + }, + { + "id": "000c00ea", + "label": "Volume Down" + }, + { + "id": "000c0183", + "label": "Media Select" + }, + { + "id": "000c0184", + "label": "Launch Word Processor" + }, + { + "id": "000c0186", + "label": "Launch Spreadsheet" + }, + { + "id": "000c018a", + "label": "Launch Mail" + }, + { + "id": "000c018d", + "label": "Launch Contacts" + }, + { + "id": "000c018e", + "label": "Launch Calendar" + }, + { + "id": "000c0192", + "label": "Launch Calculator" + }, + { + "id": "000c0194", + "label": "Launch File Browser" + }, + { + "id": "000c0196", + "label": "Launch Browser" + }, + { + "id": "000c019c", + "label": "Log Off" + }, + { + "id": "000c019e", + "label": "Lock Screen" + }, + { + "id": "000c019f", + "label": "Launch Control Panel" + }, + { + "id": "000c01a2", + "label": "Select Task" + }, + { + "id": "000c01a7", + "label": "Launch Documents" + }, + { + "id": "000c01ab", + "label": "Spell Check" + }, + { + "id": "000c01ae", + "label": "Launch Keyboard Layout" + }, + { + "id": "000c01b1", + "label": "Launch Screen Saver" + }, + { + "id": "000c01b7", + "label": "Launch Audio Browser" + }, + { + "id": "000c01cb", + "label": "Launch Assistant" + }, + { + "id": "000c0201", + "label": "New" + }, + { + "id": "000c0203", + "label": "Close" + }, + { + "id": "000c0207", + "label": "Save" + }, + { + "id": "000c0208", + "label": "Print" + }, + { + "id": "000c0221", + "label": "Browser Search" + }, + { + "id": "000c0223", + "label": "Browser Home" + }, + { + "id": "000c0224", + "label": "Browser Back" + }, + { + "id": "000c0225", + "label": "Browser Forward" + }, + { + "id": "000c0226", + "label": "Browser Stop" + }, + { + "id": "000c0227", + "label": "Browser Refresh" + }, + { + "id": "000c022a", + "label": "Browser Favorites" + }, + { + "id": "000c022d", + "label": "Zoom In" + }, + { + "id": "000c022e", + "label": "Zoom Out" + }, + { + "id": "000c0232", + "label": "Zoom Toggle" + }, + { + "id": "000c0279", + "label": "Redo" + }, + { + "id": "000c0289", + "label": "Mail Reply" + }, + { + "id": "000c028b", + "label": "Mail Forward" + }, + { + "id": "000c028c", + "label": "Mail Send" + }, + { + "id": "000c029d", + "label": "Keyboard Layout Select" + }, + { + "id": "000c029f", + "label": "Show All Windows" + } + ] + } + ] +} diff --git a/scripts/data/iso_639_codes.json b/scripts/data/iso_639_codes.json new file mode 100644 index 00000000..8b5659b6 --- /dev/null +++ b/scripts/data/iso_639_codes.json @@ -0,0 +1,1110 @@ +{ + "schemaVersion": 1, + "description": "Plezy's curated ISO 639 compatibility catalog, preserved from the application's original generated table. This is not a complete ISO registry.", + "languages": { + "aa": { + "primary": "aa", + "terminology": "aar", + "bibliographic": null, + "name": "Afar" + }, + "ab": { + "primary": "ab", + "terminology": "abk", + "bibliographic": null, + "name": "Abkhaz" + }, + "ae": { + "primary": "ae", + "terminology": "ave", + "bibliographic": null, + "name": "Avestan" + }, + "af": { + "primary": "af", + "terminology": "afr", + "bibliographic": null, + "name": "Afrikaans" + }, + "ak": { + "primary": "ak", + "terminology": "aka", + "bibliographic": null, + "name": "Akan" + }, + "am": { + "primary": "am", + "terminology": "amh", + "bibliographic": null, + "name": "Amharic" + }, + "an": { + "primary": "an", + "terminology": "arg", + "bibliographic": null, + "name": "Aragonese" + }, + "ar": { + "primary": "ar", + "terminology": "ara", + "bibliographic": null, + "name": "Arabic" + }, + "as": { + "primary": "as", + "terminology": "asm", + "bibliographic": null, + "name": "Assamese" + }, + "av": { + "primary": "av", + "terminology": "ava", + "bibliographic": null, + "name": "Avaric" + }, + "ay": { + "primary": "ay", + "terminology": "aym", + "bibliographic": null, + "name": "Aymara" + }, + "az": { + "primary": "az", + "terminology": "aze", + "bibliographic": null, + "name": "Azerbaijani" + }, + "ba": { + "primary": "ba", + "terminology": "bak", + "bibliographic": null, + "name": "Bashkir" + }, + "be": { + "primary": "be", + "terminology": "bel", + "bibliographic": null, + "name": "Belarusian" + }, + "bg": { + "primary": "bg", + "terminology": "bul", + "bibliographic": null, + "name": "Bulgarian" + }, + "bh": { + "primary": "bh", + "terminology": "bih", + "bibliographic": null, + "name": "Bihari" + }, + "bi": { + "primary": "bi", + "terminology": "bis", + "bibliographic": null, + "name": "Bislama" + }, + "bm": { + "primary": "bm", + "terminology": "bam", + "bibliographic": null, + "name": "Bambara" + }, + "bn": { + "primary": "bn", + "terminology": "ben", + "bibliographic": null, + "name": "Bengali, Bangla" + }, + "bo": { + "primary": "bo", + "terminology": "bod", + "bibliographic": "tib", + "name": "Tibetan Standard, Tibetan, Central" + }, + "br": { + "primary": "br", + "terminology": "bre", + "bibliographic": null, + "name": "Breton" + }, + "bs": { + "primary": "bs", + "terminology": "bos", + "bibliographic": null, + "name": "Bosnian" + }, + "ca": { + "primary": "ca", + "terminology": "cat", + "bibliographic": null, + "name": "Catalan" + }, + "ce": { + "primary": "ce", + "terminology": "che", + "bibliographic": null, + "name": "Chechen" + }, + "ch": { + "primary": "ch", + "terminology": "cha", + "bibliographic": null, + "name": "Chamorro" + }, + "co": { + "primary": "co", + "terminology": "cos", + "bibliographic": null, + "name": "Corsican" + }, + "cr": { + "primary": "cr", + "terminology": "cre", + "bibliographic": null, + "name": "Cree" + }, + "cs": { + "primary": "cs", + "terminology": "ces", + "bibliographic": "cze", + "name": "Czech" + }, + "cu": { + "primary": "cu", + "terminology": "chu", + "bibliographic": null, + "name": "Old Church Slavonic, Church Slavonic, Old Bulgarian" + }, + "cv": { + "primary": "cv", + "terminology": "chv", + "bibliographic": null, + "name": "Chuvash" + }, + "cy": { + "primary": "cy", + "terminology": "cym", + "bibliographic": "wel", + "name": "Welsh" + }, + "da": { + "primary": "da", + "terminology": "dan", + "bibliographic": null, + "name": "Danish" + }, + "de": { + "primary": "de", + "terminology": "deu", + "bibliographic": "ger", + "name": "German" + }, + "dv": { + "primary": "dv", + "terminology": "div", + "bibliographic": null, + "name": "Divehi, Dhivehi, Maldivian" + }, + "dz": { + "primary": "dz", + "terminology": "dzo", + "bibliographic": null, + "name": "Dzongkha" + }, + "ee": { + "primary": "ee", + "terminology": "ewe", + "bibliographic": null, + "name": "Ewe" + }, + "el": { + "primary": "el", + "terminology": "ell", + "bibliographic": "gre", + "name": "Greek (modern)" + }, + "en": { + "primary": "en", + "terminology": "eng", + "bibliographic": null, + "name": "English" + }, + "eo": { + "primary": "eo", + "terminology": "epo", + "bibliographic": null, + "name": "Esperanto" + }, + "es": { + "primary": "es", + "terminology": "spa", + "bibliographic": null, + "name": "Spanish" + }, + "et": { + "primary": "et", + "terminology": "est", + "bibliographic": null, + "name": "Estonian" + }, + "eu": { + "primary": "eu", + "terminology": "eus", + "bibliographic": "baq", + "name": "Basque" + }, + "fa": { + "primary": "fa", + "terminology": "fas", + "bibliographic": "per", + "name": "Persian (Farsi)" + }, + "ff": { + "primary": "ff", + "terminology": "ful", + "bibliographic": null, + "name": "Fula, Fulah, Pulaar, Pular" + }, + "fi": { + "primary": "fi", + "terminology": "fin", + "bibliographic": null, + "name": "Finnish" + }, + "fj": { + "primary": "fj", + "terminology": "fij", + "bibliographic": null, + "name": "Fijian" + }, + "fo": { + "primary": "fo", + "terminology": "fao", + "bibliographic": null, + "name": "Faroese" + }, + "fr": { + "primary": "fr", + "terminology": "fra", + "bibliographic": "fre", + "name": "French" + }, + "fy": { + "primary": "fy", + "terminology": "fry", + "bibliographic": null, + "name": "Western Frisian" + }, + "ga": { + "primary": "ga", + "terminology": "gle", + "bibliographic": null, + "name": "Irish" + }, + "gd": { + "primary": "gd", + "terminology": "gla", + "bibliographic": null, + "name": "Scottish Gaelic, Gaelic" + }, + "gl": { + "primary": "gl", + "terminology": "glg", + "bibliographic": null, + "name": "Galician" + }, + "gn": { + "primary": "gn", + "terminology": "grn", + "bibliographic": null, + "name": "Guaranรญ" + }, + "gu": { + "primary": "gu", + "terminology": "guj", + "bibliographic": null, + "name": "Gujarati" + }, + "gv": { + "primary": "gv", + "terminology": "glv", + "bibliographic": null, + "name": "Manx" + }, + "ha": { + "primary": "ha", + "terminology": "hau", + "bibliographic": null, + "name": "Hausa" + }, + "he": { + "primary": "he", + "terminology": "heb", + "bibliographic": null, + "name": "Hebrew (modern)" + }, + "hi": { + "primary": "hi", + "terminology": "hin", + "bibliographic": null, + "name": "Hindi" + }, + "ho": { + "primary": "ho", + "terminology": "hmo", + "bibliographic": null, + "name": "Hiri Motu" + }, + "hr": { + "primary": "hr", + "terminology": "hrv", + "bibliographic": null, + "name": "Croatian" + }, + "ht": { + "primary": "ht", + "terminology": "hat", + "bibliographic": null, + "name": "Haitian, Haitian Creole" + }, + "hu": { + "primary": "hu", + "terminology": "hun", + "bibliographic": null, + "name": "Hungarian" + }, + "hy": { + "primary": "hy", + "terminology": "hye", + "bibliographic": "arm", + "name": "Armenian" + }, + "hz": { + "primary": "hz", + "terminology": "her", + "bibliographic": null, + "name": "Herero" + }, + "ia": { + "primary": "ia", + "terminology": "ina", + "bibliographic": null, + "name": "Interlingua" + }, + "id": { + "primary": "id", + "terminology": "ind", + "bibliographic": null, + "name": "Indonesian" + }, + "ie": { + "primary": "ie", + "terminology": "ile", + "bibliographic": null, + "name": "Interlingue" + }, + "ig": { + "primary": "ig", + "terminology": "ibo", + "bibliographic": null, + "name": "Igbo" + }, + "ii": { + "primary": "ii", + "terminology": "iii", + "bibliographic": null, + "name": "Nuosu" + }, + "ik": { + "primary": "ik", + "terminology": "ipk", + "bibliographic": null, + "name": "Inupiaq" + }, + "io": { + "primary": "io", + "terminology": "ido", + "bibliographic": null, + "name": "Ido" + }, + "is": { + "primary": "is", + "terminology": "isl", + "bibliographic": "ice", + "name": "Icelandic" + }, + "it": { + "primary": "it", + "terminology": "ita", + "bibliographic": null, + "name": "Italian" + }, + "iu": { + "primary": "iu", + "terminology": "iku", + "bibliographic": null, + "name": "Inuktitut" + }, + "ja": { + "primary": "ja", + "terminology": "jpn", + "bibliographic": null, + "name": "Japanese" + }, + "jv": { + "primary": "jv", + "terminology": "jav", + "bibliographic": null, + "name": "Javanese" + }, + "ka": { + "primary": "ka", + "terminology": "kat", + "bibliographic": "geo", + "name": "Georgian" + }, + "kg": { + "primary": "kg", + "terminology": "kon", + "bibliographic": null, + "name": "Kongo" + }, + "ki": { + "primary": "ki", + "terminology": "kik", + "bibliographic": null, + "name": "Kikuyu, Gikuyu" + }, + "kj": { + "primary": "kj", + "terminology": "kua", + "bibliographic": null, + "name": "Kwanyama, Kuanyama" + }, + "kk": { + "primary": "kk", + "terminology": "kaz", + "bibliographic": null, + "name": "Kazakh" + }, + "kl": { + "primary": "kl", + "terminology": "kal", + "bibliographic": null, + "name": "Kalaallisut, Greenlandic" + }, + "km": { + "primary": "km", + "terminology": "khm", + "bibliographic": null, + "name": "Khmer" + }, + "kn": { + "primary": "kn", + "terminology": "kan", + "bibliographic": null, + "name": "Kannada" + }, + "ko": { + "primary": "ko", + "terminology": "kor", + "bibliographic": null, + "name": "Korean" + }, + "kr": { + "primary": "kr", + "terminology": "kau", + "bibliographic": null, + "name": "Kanuri" + }, + "ks": { + "primary": "ks", + "terminology": "kas", + "bibliographic": null, + "name": "Kashmiri" + }, + "ku": { + "primary": "ku", + "terminology": "kur", + "bibliographic": null, + "name": "Kurdish" + }, + "kv": { + "primary": "kv", + "terminology": "kom", + "bibliographic": null, + "name": "Komi" + }, + "kw": { + "primary": "kw", + "terminology": "cor", + "bibliographic": null, + "name": "Cornish" + }, + "ky": { + "primary": "ky", + "terminology": "kir", + "bibliographic": null, + "name": "Kyrgyz" + }, + "la": { + "primary": "la", + "terminology": "lat", + "bibliographic": null, + "name": "Latin" + }, + "lb": { + "primary": "lb", + "terminology": "ltz", + "bibliographic": null, + "name": "Luxembourgish, Letzeburgesch" + }, + "lg": { + "primary": "lg", + "terminology": "lug", + "bibliographic": null, + "name": "Ganda" + }, + "li": { + "primary": "li", + "terminology": "lim", + "bibliographic": null, + "name": "Limburgish, Limburgan, Limburger" + }, + "ln": { + "primary": "ln", + "terminology": "lin", + "bibliographic": null, + "name": "Lingala" + }, + "lo": { + "primary": "lo", + "terminology": "lao", + "bibliographic": null, + "name": "Lao" + }, + "lt": { + "primary": "lt", + "terminology": "lit", + "bibliographic": null, + "name": "Lithuanian" + }, + "lu": { + "primary": "lu", + "terminology": "lub", + "bibliographic": null, + "name": "Luba-Katanga" + }, + "lv": { + "primary": "lv", + "terminology": "lav", + "bibliographic": null, + "name": "Latvian" + }, + "mg": { + "primary": "mg", + "terminology": "mlg", + "bibliographic": null, + "name": "Malagasy" + }, + "mh": { + "primary": "mh", + "terminology": "mah", + "bibliographic": null, + "name": "Marshallese" + }, + "mi": { + "primary": "mi", + "terminology": "mri", + "bibliographic": "mao", + "name": "Mฤori" + }, + "mk": { + "primary": "mk", + "terminology": "mkd", + "bibliographic": "mac", + "name": "Macedonian" + }, + "ml": { + "primary": "ml", + "terminology": "mal", + "bibliographic": null, + "name": "Malayalam" + }, + "mn": { + "primary": "mn", + "terminology": "mon", + "bibliographic": null, + "name": "Mongolian" + }, + "mr": { + "primary": "mr", + "terminology": "mar", + "bibliographic": null, + "name": "Marathi (Marฤแนญhฤซ)" + }, + "ms": { + "primary": "ms", + "terminology": "msa", + "bibliographic": "may", + "name": "Malay" + }, + "mt": { + "primary": "mt", + "terminology": "mlt", + "bibliographic": null, + "name": "Maltese" + }, + "my": { + "primary": "my", + "terminology": "mya", + "bibliographic": "bur", + "name": "Burmese" + }, + "na": { + "primary": "na", + "terminology": "nau", + "bibliographic": null, + "name": "Nauruan" + }, + "nb": { + "primary": "nb", + "terminology": "nob", + "bibliographic": null, + "name": "Norwegian Bokmรฅl" + }, + "nd": { + "primary": "nd", + "terminology": "nde", + "bibliographic": null, + "name": "Northern Ndebele" + }, + "ne": { + "primary": "ne", + "terminology": "nep", + "bibliographic": null, + "name": "Nepali" + }, + "ng": { + "primary": "ng", + "terminology": "ndo", + "bibliographic": null, + "name": "Ndonga" + }, + "nl": { + "primary": "nl", + "terminology": "nld", + "bibliographic": "dut", + "name": "Dutch" + }, + "nn": { + "primary": "nn", + "terminology": "nno", + "bibliographic": null, + "name": "Norwegian Nynorsk" + }, + "no": { + "primary": "no", + "terminology": "nor", + "bibliographic": null, + "name": "Norwegian" + }, + "nr": { + "primary": "nr", + "terminology": "nbl", + "bibliographic": null, + "name": "Southern Ndebele" + }, + "nv": { + "primary": "nv", + "terminology": "nav", + "bibliographic": null, + "name": "Navajo, Navaho" + }, + "ny": { + "primary": "ny", + "terminology": "nya", + "bibliographic": null, + "name": "Chichewa, Chewa, Nyanja" + }, + "oc": { + "primary": "oc", + "terminology": "oci", + "bibliographic": null, + "name": "Occitan" + }, + "oj": { + "primary": "oj", + "terminology": "oji", + "bibliographic": null, + "name": "Ojibwe, Ojibwa" + }, + "om": { + "primary": "om", + "terminology": "orm", + "bibliographic": null, + "name": "Oromo" + }, + "or": { + "primary": "or", + "terminology": "ori", + "bibliographic": null, + "name": "Oriya" + }, + "os": { + "primary": "os", + "terminology": "oss", + "bibliographic": null, + "name": "Ossetian, Ossetic" + }, + "pa": { + "primary": "pa", + "terminology": "pan", + "bibliographic": null, + "name": "(Eastern) Punjabi" + }, + "pi": { + "primary": "pi", + "terminology": "pli", + "bibliographic": null, + "name": "Pฤli" + }, + "pl": { + "primary": "pl", + "terminology": "pol", + "bibliographic": null, + "name": "Polish" + }, + "ps": { + "primary": "ps", + "terminology": "pus", + "bibliographic": null, + "name": "Pashto, Pushto" + }, + "pt": { + "primary": "pt", + "terminology": "por", + "bibliographic": null, + "name": "Portuguese" + }, + "qu": { + "primary": "qu", + "terminology": "que", + "bibliographic": null, + "name": "Quechua" + }, + "rm": { + "primary": "rm", + "terminology": "roh", + "bibliographic": null, + "name": "Romansh" + }, + "rn": { + "primary": "rn", + "terminology": "run", + "bibliographic": null, + "name": "Kirundi" + }, + "ro": { + "primary": "ro", + "terminology": "ron", + "bibliographic": "rum", + "name": "Romanian" + }, + "ru": { + "primary": "ru", + "terminology": "rus", + "bibliographic": null, + "name": "Russian" + }, + "rw": { + "primary": "rw", + "terminology": "kin", + "bibliographic": null, + "name": "Kinyarwanda" + }, + "sa": { + "primary": "sa", + "terminology": "san", + "bibliographic": null, + "name": "Sanskrit (Saแนskแน›ta)" + }, + "sc": { + "primary": "sc", + "terminology": "srd", + "bibliographic": null, + "name": "Sardinian" + }, + "sd": { + "primary": "sd", + "terminology": "snd", + "bibliographic": null, + "name": "Sindhi" + }, + "se": { + "primary": "se", + "terminology": "sme", + "bibliographic": null, + "name": "Northern Sami" + }, + "sg": { + "primary": "sg", + "terminology": "sag", + "bibliographic": null, + "name": "Sango" + }, + "si": { + "primary": "si", + "terminology": "sin", + "bibliographic": null, + "name": "Sinhalese, Sinhala" + }, + "sk": { + "primary": "sk", + "terminology": "slk", + "bibliographic": "slo", + "name": "Slovak" + }, + "sl": { + "primary": "sl", + "terminology": "slv", + "bibliographic": null, + "name": "Slovene" + }, + "sm": { + "primary": "sm", + "terminology": "smo", + "bibliographic": null, + "name": "Samoan" + }, + "sn": { + "primary": "sn", + "terminology": "sna", + "bibliographic": null, + "name": "Shona" + }, + "so": { + "primary": "so", + "terminology": "som", + "bibliographic": null, + "name": "Somali" + }, + "sq": { + "primary": "sq", + "terminology": "sqi", + "bibliographic": "alb", + "name": "Albanian" + }, + "sr": { + "primary": "sr", + "terminology": "srp", + "bibliographic": null, + "name": "Serbian" + }, + "ss": { + "primary": "ss", + "terminology": "ssw", + "bibliographic": null, + "name": "Swati" + }, + "st": { + "primary": "st", + "terminology": "sot", + "bibliographic": null, + "name": "Southern Sotho" + }, + "su": { + "primary": "su", + "terminology": "sun", + "bibliographic": null, + "name": "Sundanese" + }, + "sv": { + "primary": "sv", + "terminology": "swe", + "bibliographic": null, + "name": "Swedish" + }, + "sw": { + "primary": "sw", + "terminology": "swa", + "bibliographic": null, + "name": "Swahili" + }, + "ta": { + "primary": "ta", + "terminology": "tam", + "bibliographic": null, + "name": "Tamil" + }, + "te": { + "primary": "te", + "terminology": "tel", + "bibliographic": null, + "name": "Telugu" + }, + "tg": { + "primary": "tg", + "terminology": "tgk", + "bibliographic": null, + "name": "Tajik" + }, + "th": { + "primary": "th", + "terminology": "tha", + "bibliographic": null, + "name": "Thai" + }, + "ti": { + "primary": "ti", + "terminology": "tir", + "bibliographic": null, + "name": "Tigrinya" + }, + "tk": { + "primary": "tk", + "terminology": "tuk", + "bibliographic": null, + "name": "Turkmen" + }, + "tl": { + "primary": "tl", + "terminology": "tgl", + "bibliographic": null, + "name": "Tagalog" + }, + "tn": { + "primary": "tn", + "terminology": "tsn", + "bibliographic": null, + "name": "Tswana" + }, + "to": { + "primary": "to", + "terminology": "ton", + "bibliographic": null, + "name": "Tonga (Tonga Islands)" + }, + "tr": { + "primary": "tr", + "terminology": "tur", + "bibliographic": null, + "name": "Turkish" + }, + "ts": { + "primary": "ts", + "terminology": "tso", + "bibliographic": null, + "name": "Tsonga" + }, + "tt": { + "primary": "tt", + "terminology": "tat", + "bibliographic": null, + "name": "Tatar" + }, + "tw": { + "primary": "tw", + "terminology": "twi", + "bibliographic": null, + "name": "Twi" + }, + "ty": { + "primary": "ty", + "terminology": "tah", + "bibliographic": null, + "name": "Tahitian" + }, + "ug": { + "primary": "ug", + "terminology": "uig", + "bibliographic": null, + "name": "Uyghur" + }, + "uk": { + "primary": "uk", + "terminology": "ukr", + "bibliographic": null, + "name": "Ukrainian" + }, + "ur": { + "primary": "ur", + "terminology": "urd", + "bibliographic": null, + "name": "Urdu" + }, + "uz": { + "primary": "uz", + "terminology": "uzb", + "bibliographic": null, + "name": "Uzbek" + }, + "ve": { + "primary": "ve", + "terminology": "ven", + "bibliographic": null, + "name": "Venda" + }, + "vi": { + "primary": "vi", + "terminology": "vie", + "bibliographic": null, + "name": "Vietnamese" + }, + "vo": { + "primary": "vo", + "terminology": "vol", + "bibliographic": null, + "name": "Volapรผk" + }, + "wa": { + "primary": "wa", + "terminology": "wln", + "bibliographic": null, + "name": "Walloon" + }, + "wo": { + "primary": "wo", + "terminology": "wol", + "bibliographic": null, + "name": "Wolof" + }, + "xh": { + "primary": "xh", + "terminology": "xho", + "bibliographic": null, + "name": "Xhosa" + }, + "yi": { + "primary": "yi", + "terminology": "yid", + "bibliographic": null, + "name": "Yiddish" + }, + "yo": { + "primary": "yo", + "terminology": "yor", + "bibliographic": null, + "name": "Yoruba" + }, + "za": { + "primary": "za", + "terminology": "zha", + "bibliographic": null, + "name": "Zhuang, Chuang" + }, + "zh": { + "primary": "zh", + "terminology": "zho", + "bibliographic": "chi", + "name": "Chinese" + }, + "zu": { + "primary": "zu", + "terminology": "zul", + "bibliographic": null, + "name": "Zulu" + } + } +} diff --git a/scripts/generate_ducet_ranks.dart b/scripts/generate_ducet_ranks.dart index f3f852a1..620aa39c 100644 --- a/scripts/generate_ducet_ranks.dart +++ b/scripts/generate_ducet_ranks.dart @@ -1,27 +1,242 @@ -/// Generates lib/data/ducet_order.dart from Unicode allkeys.txt and CLDR FractionalUCA.txt. +/// Generates lib/data/ducet_order.dart from pinned Unicode and CLDR data. /// /// Usage: /// dart run scripts/generate_ducet_ranks.dart [allkeys.txt] [FractionalUCA.txt] /// -/// Downloads the files automatically if not provided. +/// Default generation uses tracked deterministic gzip copies of the pinned source bytes. +/// Unicode data is redistributed unmodified under the Unicode License v3. +/// Explicit/cache/download inputs remain available for integrity and HTTP failure testing. library; +import 'dart:async'; import 'dart:io'; -// --------------------------------------------------------------------------- -// Weight tuple for multi-level UCA comparison -// --------------------------------------------------------------------------- +import 'package:crypto/crypto.dart'; + +final class SourceDescriptor { + const SourceDescriptor({ + required this.name, + required this.url, + required this.bundledFileName, + required this.cacheFileName, + required this.sha256Digest, + required this.licenseUrl, + }); + + final String name; + final String url; + final String bundledFileName; + final String cacheFileName; + final String sha256Digest; + final String licenseUrl; +} + +const allKeysSource = SourceDescriptor( + name: 'Unicode 13.0 allkeys', + url: 'https://www.unicode.org/Public/UCA/13.0.0/allkeys.txt', + bundledFileName: 'allkeys-13.0.0.txt.gz', + cacheFileName: 'plezy-allkeys-13.0.0-a3255d45b7af97f4dc14fb8364d7573b434425e5c58cacf00d16901ce081c78d.txt', + sha256Digest: 'a3255d45b7af97f4dc14fb8364d7573b434425e5c58cacf00d16901ce081c78d', + licenseUrl: 'https://www.unicode.org/license.txt', +); + +const fractionalUcaSource = SourceDescriptor( + name: 'CLDR FractionalUCA at 651afecf9ccf1541a49306993e8210fa2209aa0b', + url: + 'https://raw.githubusercontent.com/unicode-org/cldr/651afecf9ccf1541a49306993e8210fa2209aa0b/common/uca/FractionalUCA.txt', + bundledFileName: 'FractionalUCA-651afecf9ccf1541a49306993e8210fa2209aa0b.txt.gz', + cacheFileName: + 'plezy-FractionalUCA-651afecf9ccf1541a49306993e8210fa2209aa0b-' + 'a6144d0c8c19cc899a5d2f48fbc14e3e31e819049a73aa86b67111f1f3f81637.txt', + sha256Digest: 'a6144d0c8c19cc899a5d2f48fbc14e3e31e819049a73aa86b67111f1f3f81637', + licenseUrl: 'https://github.com/unicode-org/cldr/blob/651afecf9ccf1541a49306993e8210fa2209aa0b/LICENSE', +); + +final class SourceDownloadResponse { + const SourceDownloadResponse({required this.statusCode, required this.bytes, this.close}); + + final int statusCode; + final Stream> bytes; + final void Function()? close; +} + +typedef SourceDownloader = Future Function(Uri uri); +typedef GeneratedFileWriter = void Function(File output, String contents); + +final class SourceIntegrityException implements Exception { + const SourceIntegrityException(this.message); + + final String message; + + @override + String toString() => 'SourceIntegrityException: $message'; +} + +final class VerifiedSourceBundle { + VerifiedSourceBundle({ + required this.allKeysFile, + required this.fractionalUcaFile, + required this._stagingDirectory, + required this._stagedCacheFiles, + }); + + final File allKeysFile; + final File fractionalUcaFile; + final Directory _stagingDirectory; + final Map _stagedCacheFiles; + + void commitCaches() { + for (final entry in _stagedCacheFiles.entries) { + final staged = entry.key; + final cache = entry.value; + cache.parent.createSync(recursive: true); + staged.renameSync(cache.path); + } + _stagedCacheFiles.clear(); + } + + void dispose() { + if (_stagingDirectory.existsSync()) { + _stagingDirectory.deleteSync(recursive: true); + } + } +} + +Future downloadSource(Uri uri) async { + final client = HttpClient(); + try { + final request = await client.getUrl(uri); + request.headers.set(HttpHeaders.userAgentHeader, 'Plezy DUCET generator'); + final response = await request.close(); + return SourceDownloadResponse( + statusCode: response.statusCode, + bytes: response, + close: () => client.close(force: true), + ); + } catch (_) { + client.close(force: true); + rethrow; + } +} + +Future sha256ForFile(File file) async => (await sha256.bind(file.openRead()).first).toString(); + +Future verifySourceFile(File file, SourceDescriptor descriptor) async { + if (!await file.exists()) { + throw SourceIntegrityException('${descriptor.name} is missing: ${file.path}'); + } + final actualDigest = await sha256ForFile(file); + if (actualDigest != descriptor.sha256Digest) { + throw SourceIntegrityException( + '${descriptor.name} SHA-256 mismatch: expected ${descriptor.sha256Digest}, got $actualDigest', + ); + } +} + +Future loadBundledSources({ + required Directory bundledSourceDirectory, + SourceDescriptor allKeysDescriptor = allKeysSource, + SourceDescriptor fractionalUcaDescriptor = fractionalUcaSource, +}) async { + final staging = await Directory.systemTemp.createTemp('plezy_ducet_bundled_'); + + Future decompressAndVerify(SourceDescriptor descriptor) async { + final compressed = File.fromUri(bundledSourceDirectory.uri.resolve(descriptor.bundledFileName)); + if (!await compressed.exists()) { + throw SourceIntegrityException('${descriptor.name} bundled source is missing: ${compressed.path}'); + } + final decompressed = File.fromUri(staging.uri.resolve('${descriptor.bundledFileName}.raw')); + try { + await compressed.openRead().transform(gzip.decoder).pipe(decompressed.openWrite()); + } catch (error) { + throw SourceIntegrityException('${descriptor.name} bundled gzip is invalid: $error'); + } + await verifySourceFile(decompressed, descriptor); + return decompressed; + } + + try { + final allKeys = await decompressAndVerify(allKeysDescriptor); + final fractionalUca = await decompressAndVerify(fractionalUcaDescriptor); + return VerifiedSourceBundle( + allKeysFile: allKeys, + fractionalUcaFile: fractionalUca, + stagingDirectory: staging, + stagedCacheFiles: {}, + ); + } catch (_) { + if (await staging.exists()) { + await staging.delete(recursive: true); + } + rethrow; + } +} + +Future loadVerifiedSources({ + File? explicitAllKeys, + File? explicitFractionalUca, + Directory? cacheDirectory, + SourceDownloader downloader = downloadSource, + SourceDescriptor allKeysDescriptor = allKeysSource, + SourceDescriptor fractionalUcaDescriptor = fractionalUcaSource, +}) async { + final cacheRoot = cacheDirectory ?? Directory.systemTemp; + final staging = await Directory.systemTemp.createTemp('plezy_ducet_sources_'); + final stagedCacheFiles = {}; + + Future resolve(SourceDescriptor descriptor, File? explicit) async { + if (explicit != null) { + await verifySourceFile(explicit, descriptor); + return explicit; + } + + final cache = File.fromUri(cacheRoot.uri.resolve(descriptor.cacheFileName)); + if (await cache.exists()) { + await verifySourceFile(cache, descriptor); + return cache; + } + + final staged = File.fromUri(staging.uri.resolve(descriptor.cacheFileName)); + final response = await downloader(Uri.parse(descriptor.url)); + try { + if (response.statusCode != HttpStatus.ok) { + throw SourceIntegrityException('${descriptor.name} download returned HTTP ${response.statusCode}'); + } + await response.bytes.pipe(staged.openWrite()); + } finally { + response.close?.call(); + } + await verifySourceFile(staged, descriptor); + stagedCacheFiles[staged] = cache; + return staged; + } + + try { + final allKeys = await resolve(allKeysDescriptor, explicitAllKeys); + final fractionalUca = await resolve(fractionalUcaDescriptor, explicitFractionalUca); + return VerifiedSourceBundle( + allKeysFile: allKeys, + fractionalUcaFile: fractionalUca, + stagingDirectory: staging, + stagedCacheFiles: stagedCacheFiles, + ); + } catch (_) { + if (await staging.exists()) { + await staging.delete(recursive: true); + } + rethrow; + } +} + class Weight implements Comparable { final List<(int, int, int)> levels; - final int codepoint; // tiebreaker + final int codepoint; const Weight(this.levels, this.codepoint); @override int compareTo(Weight other) { final len = levels.length < other.levels.length ? levels.length : other.levels.length; - - // Primary pass for (var i = 0; i < len; i++) { final cmp = levels[i].$1.compareTo(other.levels[i].$1); if (cmp != 0) return cmp; @@ -29,39 +244,21 @@ class Weight implements Comparable { if (levels.length != other.levels.length) { return levels.length.compareTo(other.levels.length); } - - // Secondary pass for (var i = 0; i < len; i++) { final cmp = levels[i].$2.compareTo(other.levels[i].$2); if (cmp != 0) return cmp; } - - // Tertiary pass for (var i = 0; i < len; i++) { final cmp = levels[i].$3.compareTo(other.levels[i].$3); if (cmp != 0) return cmp; } - - // Codepoint tiebreaker return codepoint.compareTo(other.codepoint); } } -// --------------------------------------------------------------------------- -// Katakana codepoint ranges (for CLDR kana tertiary reversal) -// --------------------------------------------------------------------------- bool _isKatakana(int cp) => - (cp >= 0x30A0 && cp <= 0x30FF) || // Katakana - (cp >= 0x31F0 && cp <= 0x31FF) || // Katakana Phonetic Extensions - (cp >= 0xFF65 && cp <= 0xFF9F); // Halfwidth Katakana + (cp >= 0x30A0 && cp <= 0x30FF) || (cp >= 0x31F0 && cp <= 0x31FF) || (cp >= 0xFF65 && cp <= 0xFF9F); -// --------------------------------------------------------------------------- -// Parse allkeys.txt โ†’ Map -// -// CLDR kana fix: ICU/CLDR root collation sorts katakana before hiragana -// (opposite of raw DUCET). We adjust by subtracting 6 from katakana tertiary -// weights, placing them below hiragana tertiaries (0x000D+). -// --------------------------------------------------------------------------- Map parseAllKeys(String text) { final result = {}; final weightRe = RegExp(r'\[([.*])([0-9A-Fa-f]{4})\.([0-9A-Fa-f]{4})\.([0-9A-Fa-f]{4})\]'); @@ -69,251 +266,239 @@ Map parseAllKeys(String text) { for (final line in text.split('\n')) { final trimmed = line.trim(); if (trimmed.isEmpty || trimmed.startsWith('#') || trimmed.startsWith('@')) continue; - final semiIdx = trimmed.indexOf(';'); if (semiIdx < 0) continue; - final cpPart = trimmed.substring(0, semiIdx).trim(); - if (cpPart.contains(' ')) continue; // skip multi-codepoint - + if (cpPart.contains(' ')) continue; final cp = int.tryParse(cpPart, radix: 16); - if (cp == null || cp > 0xFFFF) continue; // BMP only + if (cp == null || cp > 0xFFFF) continue; - final weightPart = trimmed.substring(semiIdx + 1); - final matches = weightRe.allMatches(weightPart); + final matches = weightRe.allMatches(trimmed.substring(semiIdx + 1)); if (matches.isEmpty) continue; - - final isKat = _isKatakana(cp); final levels = <(int, int, int)>[]; - for (final m in matches) { - final p = int.parse(m.group(2)!, radix: 16); - final s = int.parse(m.group(3)!, radix: 16); - var t = int.parse(m.group(4)!, radix: 16); - // CLDR kana fix: lower katakana tertiary below hiragana range - if (isKat && t >= 0x000F) t -= 6; - levels.add((p, s, t)); + for (final match in matches) { + final primary = int.parse(match.group(2)!, radix: 16); + final secondary = int.parse(match.group(3)!, radix: 16); + var tertiary = int.parse(match.group(4)!, radix: 16); + if (_isKatakana(cp) && tertiary >= 0x000F) tertiary -= 6; + levels.add((primary, secondary, tertiary)); + } + if (levels.every((level) => level.$1 == 0 && level.$2 == 0 && level.$3 == 0)) continue; + if (result.containsKey(cp)) { + throw FormatException('Duplicate allkeys entry for U+${cp.toRadixString(16).padLeft(4, '0')}'); } - - if (levels.every((l) => l.$1 == 0 && l.$2 == 0 && l.$3 == 0)) continue; - result[cp] = Weight(levels, cp); } - return result; } -// --------------------------------------------------------------------------- -// Parse FractionalUCA.txt radical lines โ†’ CJK codepoints in radical-stroke -// order, plus Kangxi radical โ†’ CJK decomposition map. -// --------------------------------------------------------------------------- (List, Map) parseRadicals(String text) { final order = []; - final kangxiDecomp = {}; // kangxi radical CP โ†’ CJK CP + final kangxiDecomp = {}; final radicalRe = RegExp(r'^\[radical \d+'); for (final line in text.split('\n')) { if (!radicalRe.hasMatch(line)) continue; - - // Parse header: [radical N=:] final eqIdx = line.indexOf('='); final colonIdx = line.indexOf(':'); if (eqIdx < 0 || colonIdx < 0 || colonIdx <= eqIdx) continue; final closeBracket = line.lastIndexOf(']'); if (closeBracket < 0) continue; - // Extract Kangxi radical โ†’ CJK mapping from header final headerChars = line.substring(eqIdx + 1, colonIdx).runes.toList(); if (headerChars.length >= 2) { final kangxi = headerChars.first; final cjk = headerChars[1]; - // Kangxi Radicals: U+2F00-U+2FD5 if (kangxi >= 0x2F00 && kangxi <= 0x2FD5 && cjk <= 0xFFFF) { kangxiDecomp[kangxi] = cjk; } } - // Parse character list after colon - final charList = line.substring(colonIdx + 1, closeBracket); - final runes = charList.runes.toList(); + final runes = line.substring(colonIdx + 1, closeBracket).runes.toList(); var i = 0; while (i < runes.length) { final cp = runes[i]; - if (cp == 0x20) { i++; continue; } - - // Check for range: - if (i + 2 < runes.length && runes[i + 1] == 0x2D) { final endCp = runes[i + 2]; - for (var c = cp; c <= endCp; c++) { - if (c <= 0xFFFF) order.add(c); + for (var value = cp; value <= endCp; value++) { + if (value <= 0xFFFF) order.add(value); } i += 3; continue; } - if (cp <= 0xFFFF) order.add(cp); i++; } } - // Deduplicate preserving order final seen = {}; - final deduped = order.where((cp) => seen.add(cp)).toList(); - return (deduped, kangxiDecomp); + return (order.where(seen.add).toList(), kangxiDecomp); } -// --------------------------------------------------------------------------- -// Build final ordered list -// --------------------------------------------------------------------------- List buildOrder(Map allKeys, List cjkRadicalOrder) { - final entries = allKeys.entries.toList(); - entries.sort((a, b) => a.value.compareTo(b.value)); - + final entries = allKeys.entries.toList()..sort((a, b) => a.value.compareTo(b.value)); final ordered = []; final cjkSet = cjkRadicalOrder.toSet(); - bool cjkInserted = false; + var cjkInserted = false; - for (final e in entries) { - if (cjkSet.contains(e.key)) continue; - - if (!cjkInserted && e.value.levels.isNotEmpty && e.value.levels.first.$1 >= 0xFB00) { - for (final cp in cjkRadicalOrder) { - if (cp <= 0xFFFF) ordered.add(cp); - } + for (final entry in entries) { + if (cjkSet.contains(entry.key)) continue; + if (!cjkInserted && entry.value.levels.isNotEmpty && entry.value.levels.first.$1 >= 0xFB00) { + ordered.addAll(cjkRadicalOrder); cjkInserted = true; } - - ordered.add(e.key); + ordered.add(entry.key); } - - if (!cjkInserted) { - for (final cp in cjkRadicalOrder) { - if (cp <= 0xFFFF) ordered.add(cp); - } - } - + if (!cjkInserted) ordered.addAll(cjkRadicalOrder); return ordered; } -// --------------------------------------------------------------------------- -// Main -// --------------------------------------------------------------------------- -Future main(List args) async { - final allKeysPath = args.isNotEmpty ? args.first : '/tmp/allkeys.txt'; - final fracUcaPath = args.length > 1 ? args[1] : '/tmp/FractionalUCA.txt'; - - // Download if missing - if (!File(allKeysPath).existsSync()) { - stderr.writeln('Downloading allkeys.txt...'); - final result = await Process.run('curl', [ - '-sL', - 'https://www.unicode.org/Public/UCA/13.0.0/allkeys.txt', - '-o', - allKeysPath, - ]); - if (result.exitCode != 0) { - stderr.writeln('Failed to download allkeys.txt'); - exit(1); +String buildDenseRankLookup(List ordered) { + if (ordered.length > 0xFFFF) { + throw StateError('Rank table overflow: ${ordered.length} entries exceed 65535'); + } + final ranks = List.filled(0x10000, 0); + for (var rank = 0; rank < ordered.length; rank++) { + final codepoint = ordered[rank]; + if (codepoint < 0 || codepoint > 0xFFFF) { + throw RangeError.range(codepoint, 0, 0xFFFF, 'codepoint'); } - } - - if (!File(fracUcaPath).existsSync()) { - stderr.writeln('Downloading FractionalUCA.txt...'); - final result = await Process.run('curl', [ - '-sL', - 'https://raw.githubusercontent.com/unicode-org/cldr/release-39/common/uca/FractionalUCA.txt', - '-o', - fracUcaPath, - ]); - if (result.exitCode != 0) { - stderr.writeln('Failed to download FractionalUCA.txt'); - exit(1); + if (ranks[codepoint] != 0) { + throw StateError('Duplicate codepoint U+${codepoint.toRadixString(16).padLeft(4, '0')}'); } + ranks[codepoint] = rank + 1; + } + return String.fromCharCodes(ranks); +} + +String _escapeCodeUnit(int codeUnit) { + if (codeUnit == 0x27) return r"\'"; + if (codeUnit == 0x5C) return r'\\'; + if (codeUnit == 0x24) return r'\$'; + return '\\u${codeUnit.toRadixString(16).padLeft(4, '0')}'; +} + +String renderDucetOrder(List ordered, Map kangxiDecomp) { + final denseRanks = buildDenseRankLookup(ordered); + final buffer = StringBuffer() + ..writeln('/// Dense BMP ranks per DUCET (Unicode 13.0) + pinned CLDR CJK radical-stroke.') + ..writeln('/// Each code unit stores rank + 1; zero means absent.') + ..writeln('/// Katakana sorts before hiragana (CLDR root tailoring).') + ..writeln('/// Generated by scripts/generate_ducet_ranks.dart โ€” do not edit.') + ..writeln('library;') + ..writeln() + ..writeln('const String _ducetRanks ='); + const unitsPerLine = 128; + for (var start = 0; start < denseRanks.length; start += unitsPerLine) { + final end = start + unitsPerLine < denseRanks.length ? start + unitsPerLine : denseRanks.length; + buffer.write(" '"); + for (var i = start; i < end; i++) { + buffer.write(_escapeCodeUnit(denseRanks.codeUnitAt(i))); + } + buffer.writeln(start + unitsPerLine >= denseRanks.length ? "';" : "'"); + } + + buffer + ..writeln() + ..writeln('/// Kangxi Radicals (U+2F00-U+2FD5) โ†’ CJK Unified equivalents.') + ..writeln('/// ICU decomposes these via NFD before collation.') + ..writeln('const Map _kangxiDecomp = {'); + final sortedKangxi = kangxiDecomp.entries.toList()..sort((a, b) => a.key.compareTo(b.key)); + for (final entry in sortedKangxi) { + buffer.writeln( + ' 0x${entry.key.toRadixString(16).toUpperCase()}: ' + '0x${entry.value.toRadixString(16).toUpperCase()},', + ); + } + buffer + ..writeln('};') + ..writeln() + ..writeln('/// Compare two characters using DUCET + CLDR ordering.') + ..writeln('/// Decomposes Kangxi radicals to CJK equivalents before lookup.') + ..writeln('/// Falls back to codepoint order for characters not in the table.') + ..writeln('int ducetCompare(String a, String b) {') + ..writeln(' var cpA = a.runes.first;') + ..writeln(' var cpB = b.runes.first;') + ..writeln(' cpA = _kangxiDecomp[cpA] ?? cpA;') + ..writeln(' cpB = _kangxiDecomp[cpB] ?? cpB;') + ..writeln(' final storedRankA = cpA <= 0xFFFF ? _ducetRanks.codeUnitAt(cpA) : 0;') + ..writeln(' final storedRankB = cpB <= 0xFFFF ? _ducetRanks.codeUnitAt(cpB) : 0;') + ..writeln(' final rankA = storedRankA == 0 ? 0x100000 + cpA : storedRankA - 1;') + ..writeln(' final rankB = storedRankB == 0 ? 0x100000 + cpB : storedRankB - 1;') + ..writeln(' return rankA.compareTo(rankB);') + ..writeln('}'); + return buffer.toString(); +} + +void writeGeneratedFile(File output, String contents) { + output.parent.createSync(recursive: true); + final staged = File('${output.path}.$pid.tmp'); + try { + staged.writeAsStringSync(contents, flush: true); + staged.renameSync(output.path); + } finally { + if (staged.existsSync()) staged.deleteSync(); + } +} + +Future generateDucetRanks({ + bool useBundledSources = true, + Directory? bundledSourceDirectory, + File? explicitAllKeys, + File? explicitFractionalUca, + Directory? cacheDirectory, + File? output, + SourceDownloader downloader = downloadSource, + GeneratedFileWriter writer = writeGeneratedFile, + SourceDescriptor allKeysDescriptor = allKeysSource, + SourceDescriptor fractionalUcaDescriptor = fractionalUcaSource, +}) async { + final sources = useBundledSources + ? await loadBundledSources( + bundledSourceDirectory: + bundledSourceDirectory ?? Directory.fromUri(Directory.current.uri.resolve('scripts/data/')), + allKeysDescriptor: allKeysDescriptor, + fractionalUcaDescriptor: fractionalUcaDescriptor, + ) + : await loadVerifiedSources( + explicitAllKeys: explicitAllKeys, + explicitFractionalUca: explicitFractionalUca, + cacheDirectory: cacheDirectory, + downloader: downloader, + allKeysDescriptor: allKeysDescriptor, + fractionalUcaDescriptor: fractionalUcaDescriptor, + ); + try { + final allKeys = parseAllKeys(await sources.allKeysFile.readAsString()); + final (cjkOrder, kangxiDecomp) = parseRadicals(await sources.fractionalUcaFile.readAsString()); + final ordered = buildOrder(allKeys, cjkOrder); + final rendered = renderDucetOrder(ordered, kangxiDecomp); + sources.commitCaches(); + writer(output ?? File.fromUri(Directory.current.uri.resolve('lib/data/ducet_order.dart')), rendered); + } finally { + sources.dispose(); + } +} + +Future main(List args) async { + if (args.length > 2) { + stderr.writeln('Usage: dart run scripts/generate_ducet_ranks.dart [allkeys.txt] [FractionalUCA.txt]'); + exitCode = 64; + return; + } + try { + await generateDucetRanks( + explicitAllKeys: args.isNotEmpty ? File(args.first) : null, + explicitFractionalUca: args.length > 1 ? File(args[1]) : null, + useBundledSources: args.isEmpty, + ); + stderr.writeln('Written to ${File.fromUri(Directory.current.uri.resolve('lib/data/ducet_order.dart')).path}'); + } catch (error) { + stderr.writeln(error); + exitCode = 1; } - - stderr.writeln('Parsing allkeys.txt (with CLDR kana fix)...'); - final allKeysText = File(allKeysPath).readAsStringSync(); - final allKeys = parseAllKeys(allKeysText); - stderr.writeln(' ${allKeys.length} BMP entries'); - - stderr.writeln('Parsing FractionalUCA.txt...'); - final fracText = File(fracUcaPath).readAsStringSync(); - final (cjkOrder, kangxiDecomp) = parseRadicals(fracText); - stderr.writeln(' ${cjkOrder.length} CJK codepoints in radical-stroke order'); - stderr.writeln(' ${kangxiDecomp.length} Kangxi radical decompositions'); - final bmpCjk = cjkOrder.where((cp) => cp <= 0xFFFF).length; - stderr.writeln(' $bmpCjk BMP CJK codepoints'); - - stderr.writeln('Building total order...'); - final ordered = buildOrder(allKeys, cjkOrder); - stderr.writeln(' ${ordered.length} total BMP codepoints in order'); - - stderr.writeln(' ${ordered.length * 2} raw bytes'); - - // Generate Dart file โ€” store codepoints as a raw UTF-16 string constant. - // Each char IS the codepoint. Dart strings are UTF-16 natively, so the - // compiled snapshot stores the data as raw 2-byte values with zero decoding. - final outPath = '${Directory.current.path}/lib/data/ducet_order.dart'; - final buf = StringBuffer(); - buf.writeln('/// Sorted BMP codepoints per DUCET (Unicode 13.0) + CLDR 39 CJK radical-stroke.'); - buf.writeln('/// Katakana sorts before hiragana (CLDR root tailoring).'); - buf.writeln('/// Generated by scripts/generate_ducet_ranks.dart โ€” do not edit.'); - buf.writeln(); - - // Raw UTF-16 string โ€” each code unit is a codepoint in DUCET order. - // Use \uXXXX escapes so the source stays ASCII-safe. - buf.write("const String _ducetOrder = '"); - for (var i = 0; i < ordered.length; i++) { - final cp = ordered[i]; - if (cp == 0x27) { - buf.write(r"\'"); // escape single quote - } else if (cp == 0x5C) { - buf.write(r'\\'); // escape backslash - } else if (cp == 0x24) { - buf.write(r'\$'); // escape dollar - } else { - buf.write('\\u${cp.toRadixString(16).padLeft(4, '0')}'); - } - } - buf.writeln("';"); - - // Kangxi radical decomposition map - buf.writeln(); - buf.writeln('/// Kangxi Radicals (U+2F00-U+2FD5) โ†’ CJK Unified equivalents.'); - buf.writeln('/// ICU decomposes these via NFD before collation.'); - buf.writeln('const Map _kangxiDecomp = {'); - final sortedKangxi = kangxiDecomp.entries.toList()..sort((a, b) => a.key.compareTo(b.key)); - for (final e in sortedKangxi) { - buf.writeln(' 0x${e.key.toRadixString(16).toUpperCase()}: 0x${e.value.toRadixString(16).toUpperCase()},'); - } - buf.writeln('};'); - - buf.writeln(); - buf.writeln('late final Map _ranks = _buildRanks();'); - buf.writeln(); - buf.writeln('Map _buildRanks() {'); - buf.writeln(' return {'); - buf.writeln(' for (var i = 0; i < _ducetOrder.length; i++)'); - buf.writeln(' _ducetOrder.codeUnitAt(i): i,'); - buf.writeln(' };'); - buf.writeln('}'); - buf.writeln(); - buf.writeln('/// Compare two characters using DUCET + CLDR ordering.'); - buf.writeln('/// Decomposes Kangxi radicals to CJK equivalents before lookup.'); - buf.writeln('/// Falls back to codepoint order for characters not in the table.'); - buf.writeln('int ducetCompare(String a, String b) {'); - buf.writeln(' var cpA = a.runes.first;'); - buf.writeln(' var cpB = b.runes.first;'); - buf.writeln(' cpA = _kangxiDecomp[cpA] ?? cpA;'); - buf.writeln(' cpB = _kangxiDecomp[cpB] ?? cpB;'); - buf.writeln(' final rankA = _ranks[cpA] ?? (0x100000 + cpA);'); - buf.writeln(' final rankB = _ranks[cpB] ?? (0x100000 + cpB);'); - buf.writeln(' return rankA.compareTo(rankB);'); - buf.writeln('}'); - - File(outPath).writeAsStringSync(buf.toString()); - stderr.writeln('Written to $outPath'); } diff --git a/scripts/generate_hid_key_labels.dart b/scripts/generate_hid_key_labels.dart new file mode 100644 index 00000000..63ac589c --- /dev/null +++ b/scripts/generate_hid_key_labels.dart @@ -0,0 +1,208 @@ +/// Generates lib/data/hid_key_labels.dart from the curated offline HID catalog. +/// +/// Usage: +/// dart run scripts/generate_hid_key_labels.dart [input.json] [output.dart] +library; + +import 'dart:convert'; +import 'dart:io'; + +const defaultHidKeyLabelsInput = 'scripts/data/hid_key_labels.json'; +const defaultHidKeyLabelsOutput = 'lib/data/hid_key_labels.dart'; + +final class HidKeyLabel { + const HidKeyLabel({required this.id, required this.label}); + + final String id; + final String label; + + int get numericId => int.parse(id, radix: 16); +} + +final class HidKeyGroup { + const HidKeyGroup({required this.name, required this.keys}); + + final String name; + final List keys; +} + +final class HidKeyCatalog { + const HidKeyCatalog({required this.groups}); + + final List groups; +} + +typedef AtomicFileWriter = Future Function(String path, String contents); + +HidKeyCatalog parseHidKeyLabelsCatalog(String source) { + final Object? decoded; + try { + decoded = jsonDecode(source); + } on FormatException catch (error) { + throw FormatException('Invalid HID catalog JSON: ${error.message}'); + } + + final root = _expectMap(decoded, 'catalog'); + if (root['schemaVersion'] != 1) { + throw const FormatException('HID catalog schemaVersion must be 1'); + } + + final rawGroups = _expectList(root['groups'], 'groups'); + if (rawGroups.isEmpty) { + throw const FormatException('HID catalog groups must not be empty'); + } + + final groups = []; + final groupNames = {}; + final ids = {}; + var previousId = -1; + + for (var groupIndex = 0; groupIndex < rawGroups.length; groupIndex++) { + final rawGroup = _expectMap(rawGroups[groupIndex], 'groups[$groupIndex]'); + final name = _expectNonemptyString(rawGroup['name'], 'groups[$groupIndex].name'); + if (!groupNames.add(name)) { + throw FormatException('Duplicate HID group name: $name'); + } + + final rawKeys = _expectList(rawGroup['keys'], 'groups[$groupIndex].keys'); + if (rawKeys.isEmpty) { + throw FormatException('HID group "$name" must contain at least one key'); + } + + final keys = []; + for (var keyIndex = 0; keyIndex < rawKeys.length; keyIndex++) { + final path = 'groups[$groupIndex].keys[$keyIndex]'; + final rawKey = _expectMap(rawKeys[keyIndex], path); + final id = _expectString(rawKey['id'], '$path.id'); + if (!RegExp(r'^[0-9a-f]{8}$').hasMatch(id)) { + throw FormatException('$path.id must be exactly eight lowercase hexadecimal digits'); + } + if (!ids.add(id)) { + throw FormatException('Duplicate HID key ID: $id'); + } + + final numericId = int.parse(id, radix: 16); + if (numericId <= previousId) { + throw FormatException('HID key IDs must be in strictly increasing numeric order: $id'); + } + previousId = numericId; + + final label = _expectNonemptyString(rawKey['label'], '$path.label'); + keys.add(HidKeyLabel(id: id, label: label)); + } + groups.add(HidKeyGroup(name: name, keys: List.unmodifiable(keys))); + } + + return HidKeyCatalog(groups: List.unmodifiable(groups)); +} + +String renderHidKeyLabels(HidKeyCatalog catalog) { + final output = StringBuffer() + ..writeln( + '// Generated by dart run scripts/generate_hid_key_labels.dart from ' + 'scripts/data/hid_key_labels.json; do not edit by hand.', + ) + ..writeln() + ..writeln('/// Human-readable labels for physical keyboard keys, keyed by USB HID usage code.') + ..writeln('const hidKeyLabels = {'); + + for (final group in catalog.groups) { + output.writeln(' // ${group.name}'); + for (final key in group.keys) { + output.writeln(' 0x${key.id}: ${_dartString(key.label)},'); + } + } + + output.writeln('};'); + return output.toString(); +} + +Future writeFileAtomically(String path, String contents) async { + final output = File(path); + await output.parent.create(recursive: true); + final temporary = File('$path.tmp.$pid.${DateTime.now().microsecondsSinceEpoch}'); + try { + await temporary.writeAsString(contents, flush: true); + await temporary.rename(path); + } finally { + if (await temporary.exists()) { + await temporary.delete(); + } + } +} + +Future generateHidKeyLabels( + String inputPath, + String outputPath, { + AtomicFileWriter writer = writeFileAtomically, +}) async { + final source = await File(inputPath).readAsString(); + final catalog = parseHidKeyLabelsCatalog(source); + final rendered = renderHidKeyLabels(catalog); + await writer(outputPath, rendered); +} + +Future main(List arguments) async { + if (arguments.length > 2) { + stderr.writeln('Usage: dart run scripts/generate_hid_key_labels.dart [input.json] [output.dart]'); + exitCode = 64; + return; + } + + final inputPath = arguments.isEmpty ? defaultHidKeyLabelsInput : arguments[0]; + final outputPath = arguments.length < 2 ? defaultHidKeyLabelsOutput : arguments[1]; + await generateHidKeyLabels(inputPath, outputPath); +} + +Map _expectMap(Object? value, String path) { + if (value is! Map) { + throw FormatException('$path must be a JSON object'); + } + return value; +} + +List _expectList(Object? value, String path) { + if (value is! List) { + throw FormatException('$path must be a JSON array'); + } + return value; +} + +String _expectString(Object? value, String path) { + if (value is! String) { + throw FormatException('$path must be a string'); + } + return value; +} + +String _expectNonemptyString(Object? value, String path) { + final string = _expectString(value, path); + if (string.trim().isEmpty) { + throw FormatException('$path must not be empty'); + } + return string; +} + +String _dartString(String value) { + if (value == r'\') return r"r'\'"; + + if (value.contains("'")) { + final escaped = value + .replaceAll(r'\', r'\\') + .replaceAll('"', r'\"') + .replaceAll(r'$', r'\$') + .replaceAll('\r', r'\r') + .replaceAll('\n', r'\n') + .replaceAll('\t', r'\t'); + return '"$escaped"'; + } + + final escaped = value + .replaceAll(r'\', r'\\') + .replaceAll("'", r"\'") + .replaceAll(r'$', r'\$') + .replaceAll('\r', r'\r') + .replaceAll('\n', r'\n') + .replaceAll('\t', r'\t'); + return "'$escaped'"; +} diff --git a/scripts/generate_iso_639_data.dart b/scripts/generate_iso_639_data.dart new file mode 100644 index 00000000..30b48f75 --- /dev/null +++ b/scripts/generate_iso_639_data.dart @@ -0,0 +1,239 @@ +/// Generates lib/data/iso_639_data.dart from the curated offline ISO 639 catalog. +/// +/// Usage: +/// dart run scripts/generate_iso_639_data.dart [input.json] [output.dart] +library; + +import 'dart:convert'; +import 'dart:io'; + +const defaultIso639Input = 'scripts/data/iso_639_codes.json'; +const defaultIso639Output = 'lib/data/iso_639_data.dart'; + +final class Iso639CatalogEntry { + const Iso639CatalogEntry({ + required this.primary, + required this.terminology, + required this.bibliographic, + required this.name, + }); + + final String primary; + final String terminology; + final String? bibliographic; + final String name; +} + +final class Iso639Catalog { + const Iso639Catalog({required this.entries}); + + final List entries; +} + +typedef AtomicFileWriter = Future Function(String path, String contents); + +Iso639Catalog parseIso639Catalog(String source) { + final Object? decoded; + try { + decoded = jsonDecode(source); + } on FormatException catch (error) { + throw FormatException('Invalid ISO 639 catalog JSON: ${error.message}'); + } + + final root = _expectMap(decoded, 'catalog'); + if (root['schemaVersion'] != 1) { + throw const FormatException('ISO 639 catalog schemaVersion must be 1'); + } + + final languages = _expectMap(root['languages'], 'languages'); + if (languages.isEmpty) { + throw const FormatException('ISO 639 catalog languages must not be empty'); + } + + final entries = []; + final allCodes = {}; + String? previousPrimary; + + for (final catalogEntry in languages.entries) { + final key = catalogEntry.key; + if (!_isPrimaryCode(key)) { + throw FormatException('Language key must be exactly two lowercase letters: $key'); + } + if (previousPrimary != null && key.compareTo(previousPrimary) <= 0) { + throw FormatException('Language keys must be in strictly increasing order: $key'); + } + previousPrimary = key; + + final rawEntry = _expectMap(catalogEntry.value, 'languages.$key'); + final primary = _expectString(rawEntry['primary'], 'languages.$key.primary'); + if (primary != key) { + throw FormatException('Language key $key does not match primary code $primary'); + } + if (!_isPrimaryCode(primary)) { + throw FormatException('languages.$key.primary must be exactly two lowercase letters'); + } + if (!allCodes.add(primary)) { + throw FormatException('Duplicate ISO 639 code: $primary'); + } + + final terminology = _expectString(rawEntry['terminology'], 'languages.$key.terminology'); + if (!_isAliasCode(terminology)) { + throw FormatException('languages.$key.terminology must be exactly three lowercase letters'); + } + if (!allCodes.add(terminology)) { + throw FormatException('Duplicate ISO 639 code: $terminology'); + } + + final rawBibliographic = rawEntry['bibliographic']; + final String? bibliographic; + if (rawBibliographic == null) { + bibliographic = null; + } else { + bibliographic = _expectString(rawBibliographic, 'languages.$key.bibliographic'); + if (!_isAliasCode(bibliographic)) { + throw FormatException('languages.$key.bibliographic must be null or exactly three lowercase letters'); + } + if (!allCodes.add(bibliographic)) { + throw FormatException('Duplicate ISO 639 code: $bibliographic'); + } + } + + final name = _expectNonemptyString(rawEntry['name'], 'languages.$key.name'); + entries.add( + Iso639CatalogEntry(primary: primary, terminology: terminology, bibliographic: bibliographic, name: name), + ); + } + + return Iso639Catalog(entries: List.unmodifiable(entries)); +} + +String renderIso639Data(Iso639Catalog catalog) { + final output = StringBuffer() + ..writeln( + '// Generated by dart run scripts/generate_iso_639_data.dart from ' + 'scripts/data/iso_639_codes.json; do not edit by hand.', + ) + ..writeln() + ..writeln('class LanguageEntry {') + ..writeln(' final String code1;') + ..writeln(' final String code2;') + ..writeln(' final String? code2B;') + ..writeln(' final String name;') + ..writeln(' const LanguageEntry(this.code1, this.code2, this.code2B, this.name);') + ..writeln('}') + ..writeln() + ..writeln('const languageEntries = {'); + + for (final entry in catalog.entries) { + final bibliographic = entry.bibliographic == null ? 'null' : _dartString(entry.bibliographic!); + output.writeln( + ' ${_dartString(entry.primary)}: LanguageEntry(' + '${_dartString(entry.primary)}, ${_dartString(entry.terminology)}, $bibliographic, ${_dartString(entry.name)}),', + ); + } + + output + ..writeln('};') + ..writeln() + ..writeln('const code2ToCode1 = {'); + for (final entry in catalog.entries) { + output.writeln(' ${_dartString(entry.terminology)}: ${_dartString(entry.primary)},'); + } + + output + ..writeln('};') + ..writeln() + ..writeln('const code2BToCode1 = {'); + for (final entry in catalog.entries) { + final bibliographic = entry.bibliographic; + if (bibliographic != null) { + output.writeln(' ${_dartString(bibliographic)}: ${_dartString(entry.primary)},'); + } + } + output.writeln('};'); + return output.toString(); +} + +Future writeFileAtomically(String path, String contents) async { + final output = File(path); + await output.parent.create(recursive: true); + final temporary = File('$path.tmp.$pid.${DateTime.now().microsecondsSinceEpoch}'); + try { + await temporary.writeAsString(contents, flush: true); + await temporary.rename(path); + } finally { + if (await temporary.exists()) { + await temporary.delete(); + } + } +} + +Future generateIso639Data( + String inputPath, + String outputPath, { + AtomicFileWriter writer = writeFileAtomically, +}) async { + final source = await File(inputPath).readAsString(); + final catalog = parseIso639Catalog(source); + final rendered = renderIso639Data(catalog); + await writer(outputPath, rendered); +} + +Future main(List arguments) async { + if (arguments.length > 2) { + stderr.writeln('Usage: dart run scripts/generate_iso_639_data.dart [input.json] [output.dart]'); + exitCode = 64; + return; + } + + final inputPath = arguments.isEmpty ? defaultIso639Input : arguments[0]; + final outputPath = arguments.length < 2 ? defaultIso639Output : arguments[1]; + await generateIso639Data(inputPath, outputPath); +} + +Map _expectMap(Object? value, String path) { + if (value is! Map) { + throw FormatException('$path must be a JSON object'); + } + return value; +} + +String _expectString(Object? value, String path) { + if (value is! String) { + throw FormatException('$path must be a string'); + } + return value; +} + +String _expectNonemptyString(Object? value, String path) { + final string = _expectString(value, path); + if (string.trim().isEmpty) { + throw FormatException('$path must not be empty'); + } + return string; +} + +bool _isPrimaryCode(String code) => RegExp(r'^[a-z]{2}$').hasMatch(code); +bool _isAliasCode(String code) => RegExp(r'^[a-z]{3}$').hasMatch(code); + +String _dartString(String value) { + if (value.contains("'")) { + final escaped = value + .replaceAll(r'\', r'\\') + .replaceAll('"', r'\"') + .replaceAll(r'$', r'\$') + .replaceAll('\r', r'\r') + .replaceAll('\n', r'\n') + .replaceAll('\t', r'\t'); + return '"$escaped"'; + } + + final escaped = value + .replaceAll(r'\', r'\\') + .replaceAll("'", r"\'") + .replaceAll(r'$', r'\$') + .replaceAll('\r', r'\r') + .replaceAll('\n', r'\n') + .replaceAll('\t', r'\t'); + return "'$escaped'"; +} diff --git a/scripts/test_check_codegen.py b/scripts/test_check_codegen.py index 52c8d00a..0481d122 100644 --- a/scripts/test_check_codegen.py +++ b/scripts/test_check_codegen.py @@ -10,6 +10,9 @@ from pathlib import Path SCRIPT_DIR = Path(__file__).resolve().parent GENERATED_PATHS = ( + "lib/data/ducet_order.dart", + "lib/data/hid_key_labels.dart", + "lib/data/iso_639_data.dart", "lib/i18n/strings.g.dart", "lib/models/model.freezed.dart", "lib/models/model.g.dart", @@ -58,6 +61,18 @@ cp source.txt server/relay_protocol_gen.go """#!/usr/bin/env bash if [ "${FAIL_DART:-0}" -ne 0 ]; then exit "$FAIL_DART"; fi case "$*" in + *"generate_ducet_ranks.dart") + mkdir -p lib/data + cp source.txt lib/data/ducet_order.dart + ;; + *"generate_hid_key_labels.dart") + mkdir -p lib/data + cp source.txt lib/data/hid_key_labels.dart + ;; + *"generate_iso_639_data.dart") + mkdir -p lib/data + cp source.txt lib/data/iso_639_data.dart + ;; "run slang") mkdir -p lib/i18n cp source.txt lib/i18n/strings.g.dart @@ -194,6 +209,18 @@ esac self.assertEqual(untracked.read_text(encoding="utf-8"), "caller sentinel\n") self.assertEqual(self.git_status(), status_before) + def test_deleted_explicit_dart_output_is_reported_without_repair(self) -> None: + deleted = self.root / "lib" / "data" / "hid_key_labels.dart" + deleted.unlink() + status_before = self.git_status() + + result = self.run_codegen("--check") + + self.assertEqual(result.returncode, 1) + self.assertIn("lib/data/hid_key_labels.dart", result.stderr) + self.assertFalse(deleted.exists()) + self.assertEqual(self.git_status(), status_before) + def test_write_mode_updates_outputs_and_forwards_build_runner_arguments(self) -> None: (self.root / "source.txt").write_text("version two\n", encoding="utf-8") diff --git a/slang.yaml b/slang.yaml index 4df90738..dcb04c60 100644 --- a/slang.yaml +++ b/slang.yaml @@ -2,8 +2,8 @@ input_directory: lib/i18n input_file_pattern: .i18n.json output_directory: lib/i18n timestamp: false -# Fall back to base (en) for any key missing in a non-base locale. -# Without this, every locale would need every key declared up-front and -# the generator would emit `class is missing implementations forโ€ฆ` -# errors when a new English string lands. -fallback_strategy: base_locale +# Fall back to base (en) when a non-base key is missing or still has the +# translation cleanup placeholder (`""`). Without this, every locale would +# need every key translated up-front and empty placeholders would render +# without meaningful text. +fallback_strategy: base_locale_empty_string diff --git a/test/data/ducet_order_test.dart b/test/data/ducet_order_test.dart new file mode 100644 index 00000000..36cb21c6 --- /dev/null +++ b/test/data/ducet_order_test.dart @@ -0,0 +1,42 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/data/ducet_order.dart'; + +void main() { + test('applies CLDR kana ordering', () { + expect(ducetCompare('ใ‚ข', 'ใ‚'), isNegative); + expect(ducetCompare('ใ‚ซ', 'ใ‹'), isNegative); + }); + + test('orders representative scripts by DUCET rank', () { + expect(ducetCompare('A', 'ฮฑ'), isNegative); + expect(ducetCompare('ฮฑ', 'ะ–'), isNegative); + expect(ducetCompare('ะ–', 'ไธ€'), isNegative); + }); + + test('decomposes Kangxi radicals to their unified equivalents', () { + expect(ducetCompare('โผ€', 'ไธ€'), 0); + expect(ducetCompare('โฟ•', '้พ '), 0); + }); + + test('uses codepoint fallback for missing BMP and supplementary characters', () { + expect(ducetCompare('\u0378', '\u0379'), isNegative); + expect(ducetCompare('\u0378', 'A'), isPositive); + expect(ducetCompare('๐Ÿ˜€', '๐Ÿ˜'), isNegative); + expect(ducetCompare('๐Ÿ˜€', 'A'), isPositive); + }); + + test('preserves apostrophe, backslash, and dollar ranks in generated literal', () { + expect(ducetCompare("'", r'$'), isNegative); + expect(ducetCompare(r'$', r'\'), isPositive); + }); + + test('compares only the first rune', () { + expect(ducetCompare('A trailing text', 'A different text'), 0); + expect(ducetCompare('๐Ÿ˜€ trailing text', '๐Ÿ˜€ different text'), 0); + }); + + test('preserves empty-input failure', () { + expect(() => ducetCompare('', 'A'), throwsStateError); + expect(() => ducetCompare('A', ''), throwsStateError); + }); +} diff --git a/test/data/hid_key_labels_test.dart b/test/data/hid_key_labels_test.dart new file mode 100644 index 00000000..a08e32fa --- /dev/null +++ b/test/data/hid_key_labels_test.dart @@ -0,0 +1,31 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/data/hid_key_labels.dart'; +import 'package:plezy/models/hotkey_model.dart'; + +void main() { + test('catalog preserves all 325 unique keys in canonical numeric order', () { + final ids = hidKeyLabels.keys.toList(); + final sortedIds = [...ids]..sort(); + + expect(hidKeyLabels, hasLength(325)); + expect(ids.toSet(), hasLength(ids.length)); + expect(ids, sortedIds); + expect(ids.every((id) => id >= 0 && id <= 0xffffffff), isTrue); + expect(hidKeyLabels.values.every((label) => label.trim().isNotEmpty), isTrue); + }); + + test('catalog preserves representative labels across usage groups', () { + expect(hidKeyLabels[0x00000012], 'Fn'); + expect(hidKeyLabels[0x000100b5], 'Display Toggle'); + expect(hidKeyLabels[0x0005ff1f], 'Game Button Z'); + expect(hidKeyLabels[0x00070031], r'\'); + expect(hidKeyLabels[0x000c00cd], 'Play/Pause'); + expect(hidKeyLabels[0x000c029f], 'Show All Windows'); + }); + + test('physicalKeyLabel uses the catalog and formats an unknown HID fallback', () { + expect(physicalKeyLabel(PhysicalKeyboardKey.keyA), 'A'); + expect(physicalKeyLabel(const PhysicalKeyboardKey(0xffffffff)), 'Key 0xffffffff'); + }); +} diff --git a/test/data/iso_639_data_test.dart b/test/data/iso_639_data_test.dart new file mode 100644 index 00000000..4e7273bc --- /dev/null +++ b/test/data/iso_639_data_test.dart @@ -0,0 +1,54 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/data/iso_639_data.dart'; +import 'package:plezy/utils/language_codes.dart'; + +void main() { + test('catalog preserves 184 canonical entries and globally unique codes', () { + final primaryCodes = languageEntries.keys.toList(); + final sortedPrimaryCodes = [...primaryCodes]..sort(); + final allCodes = {}; + + expect(languageEntries, hasLength(184)); + expect(primaryCodes, sortedPrimaryCodes); + for (final mapEntry in languageEntries.entries) { + final entry = mapEntry.value; + expect(entry.code1, mapEntry.key); + expect(entry.code1, matches(RegExp(r'^[a-z]{2}$'))); + expect(entry.code2, matches(RegExp(r'^[a-z]{3}$'))); + expect(entry.name.trim(), isNotEmpty); + expect(allCodes.add(entry.code1), isTrue); + expect(allCodes.add(entry.code2), isTrue); + if (entry.code2B case final bibliographic?) { + expect(bibliographic, matches(RegExp(r'^[a-z]{3}$'))); + expect(allCodes.add(bibliographic), isTrue); + } + } + }); + + test('reverse maps are derived completely from terminology and bibliographic aliases', () { + expect(code2ToCode1, hasLength(184)); + expect(code2BToCode1, hasLength(20)); + + for (final entry in languageEntries.values) { + expect(code2ToCode1[entry.code2], entry.code1); + if (entry.code2B case final bibliographic?) { + expect(code2BToCode1[bibliographic], entry.code1); + } + } + }); + + test('representative terminology and bibliographic aliases preserve behavior', () { + final german = languageEntries['de']!; + expect(german.code2, 'deu'); + expect(german.code2B, 'ger'); + expect(german.name, 'German'); + expect(languageEntries['bn']!.name, 'Bengali, Bangla'); + expect(languageEntries['mi']!.name, 'Mฤori'); + + expect(LanguageCodes.getIso6391Code(' DEU '), 'de'); + expect(LanguageCodes.getIso6391Code('ger'), 'de'); + expect(LanguageCodes.getLanguageName('GER'), 'German'); + expect(LanguageCodes.getVariations('ger'), unorderedEquals(['ger', 'de', 'deu'])); + expect(LanguageCodes.getLanguageName('zzz'), isNull); + }); +} diff --git a/test/focus/focusable_chip_long_press_test.dart b/test/focus/focusable_chip_long_press_test.dart index dad25dcc..f476cde8 100644 --- a/test/focus/focusable_chip_long_press_test.dart +++ b/test/focus/focusable_chip_long_press_test.dart @@ -1,3 +1,5 @@ +import 'dart:ui' show SemanticsAction, Tristate; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -39,4 +41,22 @@ void main() { expect(longPressed, 0); }); + + testWidgets('tab chips expose one operable node with selected state', (tester) async { + final semantics = tester.ensureSemantics(); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: FocusableTabChip(label: 'Selected tab', isSelected: true, onSelect: () {}), + ), + ), + ); + + final node = tester.getSemantics(find.bySemanticsLabel('Selected tab')).getSemanticsData(); + expect(node.flagsCollection.isButton, isTrue); + expect(node.flagsCollection.isSelected, Tristate.isTrue); + expect(node.hasAction(SemanticsAction.tap), isTrue); + semantics.dispose(); + }); } diff --git a/test/focus/grid_focus_node_mixin_test.dart b/test/focus/grid_focus_node_mixin_test.dart new file mode 100644 index 00000000..7de64b99 --- /dev/null +++ b/test/focus/grid_focus_node_mixin_test.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/mixins/grid_focus_node_mixin.dart'; + +void main() { + testWidgets('focused distant nodes retain ownership until a later eviction', (tester) async { + final key = GlobalKey<_GridFocusHarnessState>(); + + await tester.pumpWidget(MaterialApp(home: _GridFocusHarness(key: key))); + final state = key.currentState!; + final retained = state.getGridItemFocusNode(0); + state.getGridItemFocusNode(10); + final center = state.getGridItemFocusNode(20); + state.refresh(); + await tester.pump(); + + retained.requestFocus(); + await tester.pump(); + expect(retained.hasFocus, isTrue); + + state.evictDistantFocusNodes(20, keepCount: 1); + + expect(state.gridItemFocusNodes[0], same(retained)); + expect(state.gridItemFocusNodes.containsKey(10), isFalse); + expect(state.getGridItemFocusNode(0), same(retained)); + state.refresh(); + await tester.pump(); + + center.requestFocus(); + await tester.pump(); + expect(retained.hasFocus, isFalse); + + state.evictDistantFocusNodes(20, keepCount: 1); + + expect(state.gridItemFocusNodes.containsKey(0), isFalse); + expect(state.gridItemFocusNodes[20], same(center)); + state.refresh(); + await tester.pump(); + }); +} + +class _GridFocusHarness extends StatefulWidget { + const _GridFocusHarness({super.key}); + + @override + State<_GridFocusHarness> createState() => _GridFocusHarnessState(); +} + +class _GridFocusHarnessState extends State<_GridFocusHarness> with GridFocusNodeMixin<_GridFocusHarness> { + void refresh() => setState(() {}); + @override + void dispose() { + disposeGridFocusNodes(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => Row( + children: [ + for (final node in gridItemFocusNodes.values) + Focus(focusNode: node, child: const SizedBox(width: 10, height: 10)), + ], + ); +} diff --git a/test/focus/input_mode_tracker_test.dart b/test/focus/input_mode_tracker_test.dart index 5a0e81c8..67ff213f 100644 --- a/test/focus/input_mode_tracker_test.dart +++ b/test/focus/input_mode_tracker_test.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:plezy/focus/input_mode_tracker.dart'; import 'package:plezy/services/gamepad_service.dart'; +import 'package:plezy/utils/platform_detector.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -51,4 +52,65 @@ void main() { expect(oneShotMode, InputMode.pointer); expect(oneShotBuilds, 1); }); + + testWidgets('keyboard-mode cursor shield preserves pointer activation', (tester) async { + var taps = 0; + + await tester.pumpWidget( + InputModeTracker( + child: Directionality( + textDirection: TextDirection.ltr, + child: GestureDetector( + key: const Key('target'), + behavior: HitTestBehavior.opaque, + onTap: () => taps++, + child: const SizedBox(width: 120, height: 80), + ), + ), + ), + ); + + GamepadService.onGamepadInput!.call(); + await tester.pump(); + + expect(tester.widget(find.byType(MouseRegion)).cursor, SystemMouseCursors.none); + + await tester.tap(find.byKey(const Key('target'))); + await tester.pump(); + + expect(taps, 1); + expect(find.byType(MouseRegion), findsNothing); + }); + + testWidgets('non-desktop TV path has no cursor shield and remains pointer-reachable', (tester) async { + TvDetectionService.debugSetAppleTVOverride(true); + PlatformDetector.debugSetIsDesktopOSOverride(false); + addTearDown(() { + TvDetectionService.debugSetAppleTVOverride(null); + PlatformDetector.debugSetIsDesktopOSOverride(null); + }); + var taps = 0; + + await tester.pumpWidget( + InputModeTracker( + child: Directionality( + textDirection: TextDirection.ltr, + child: GestureDetector( + key: const Key('tv-target'), + behavior: HitTestBehavior.opaque, + onTap: () => taps++, + child: const SizedBox(width: 120, height: 80), + ), + ), + ), + ); + + GamepadService.onGamepadInput!.call(); + await tester.pump(); + + expect(find.byType(MouseRegion), findsNothing); + await tester.tap(find.byKey(const Key('tv-target'))); + await tester.pump(); + expect(taps, 1); + }); } diff --git a/test/focus/key_event_utils_test.dart b/test/focus/key_event_utils_test.dart index 4e8b56d4..e10a9855 100644 --- a/test/focus/key_event_utils_test.dart +++ b/test/focus/key_event_utils_test.dart @@ -75,6 +75,35 @@ void main() { await tester.pump(); }); + test('one-shot select consumes every phase and activates only on key down', () { + var activations = 0; + const down = KeyDownEvent( + physicalKey: PhysicalKeyboardKey.select, + logicalKey: LogicalKeyboardKey.select, + timeStamp: Duration.zero, + ); + const repeat = KeyRepeatEvent( + physicalKey: PhysicalKeyboardKey.select, + logicalKey: LogicalKeyboardKey.select, + timeStamp: Duration(milliseconds: 100), + ); + const up = KeyUpEvent( + physicalKey: PhysicalKeyboardKey.select, + logicalKey: LogicalKeyboardKey.select, + timeStamp: Duration(milliseconds: 200), + ); + const unrelated = KeyDownEvent( + physicalKey: PhysicalKeyboardKey.f12, + logicalKey: LogicalKeyboardKey.f12, + timeStamp: Duration.zero, + ); + + expect(handleOneShotSelect(down, () => activations++), KeyEventResult.handled); + expect(handleOneShotSelect(repeat, () => activations++), KeyEventResult.handled); + expect(handleOneShotSelect(up, () => activations++), KeyEventResult.handled); + expect(handleOneShotSelect(unrelated, () => activations++), KeyEventResult.ignored); + expect(activations, 1); + }); group('BackKeyCoordinator', () { testWidgets('suppresses one parallel back dispatch in the current frame', (tester) async { BackKeyCoordinator.markHandled(); @@ -214,6 +243,77 @@ void main() { expect(FocusManager.instance.primaryFocus?.debugLabel, 'ActionBar[0]'); }); + testWidgets('skips disabled actions for entry and horizontal traversal', (tester) async { + final key = GlobalKey(); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: FocusableActionBar( + key: key, + actions: [ + const FocusableAction(icon: Icons.block), + FocusableAction(icon: Icons.add, onPressed: () {}), + const FocusableAction(icon: Icons.block), + FocusableAction(icon: Icons.remove, onPressed: () {}), + ], + ), + ), + ), + ); + await tester.pump(); + + key.currentState!.requestFocusOnFirst(); + await tester.pump(); + expect(FocusManager.instance.primaryFocus?.debugLabel, 'ActionBar[1]'); + + await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight); + await tester.pump(); + expect(FocusManager.instance.primaryFocus?.debugLabel, 'ActionBar[3]'); + + await tester.sendKeyEvent(LogicalKeyboardKey.arrowLeft); + await tester.pump(); + expect(FocusManager.instance.primaryFocus?.debugLabel, 'ActionBar[1]'); + }); + + testWidgets('dynamic callback changes remove a disabled action from focus', (tester) async { + final key = GlobalKey(); + late StateSetter rebuild; + var firstEnabled = true; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: StatefulBuilder( + builder: (context, setState) { + rebuild = setState; + return FocusableActionBar( + key: key, + actions: [ + FocusableAction(icon: Icons.add, onPressed: firstEnabled ? () {} : null), + FocusableAction(icon: Icons.remove, onPressed: () {}), + ], + ); + }, + ), + ), + ), + ); + await tester.pump(); + + key.currentState!.requestFocusOnFirst(); + await tester.pump(); + expect(FocusManager.instance.primaryFocus?.debugLabel, 'ActionBar[0]'); + + rebuild(() => firstEnabled = false); + await tester.pump(); + expect(key.currentState!.getFocusNode(0)!.canRequestFocus, isFalse); + expect(key.currentState!.getFocusNode(0)!.hasFocus, isFalse); + + key.currentState!.requestFocusOnFirst(); + await tester.pump(); + expect(FocusManager.instance.primaryFocus?.debugLabel, 'ActionBar[1]'); + }); testWidgets('still invokes onNavigateLeft at the left edge when wired', (tester) async { final key = GlobalKey(); final leftTarget = FocusNode(debugLabel: 'left-target'); @@ -279,4 +379,25 @@ void main() { expect(activations, 1); }); }); + + group('expandToGraphemeRange', () { + for (final grapheme in ['๐Ÿ˜€', 'e\u0301', '๐Ÿ‡ฏ๐Ÿ‡ต', '๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ']) { + test('expands partial ${grapheme.runes.length}-scalar ranges', () { + final text = 'A${grapheme}B'; + final graphemeEnd = 1 + grapheme.length; + final expected = TextRange(start: 1, end: graphemeEnd); + + expect(expandToGraphemeRange(text, const TextRange(start: 1, end: 2)), expected); + expect(expandToGraphemeRange(text, TextRange(start: graphemeEnd - 1, end: graphemeEnd)), expected); + expect(expandToGraphemeRange(text, TextSelection(baseOffset: graphemeEnd - 1, extentOffset: 1)), expected); + expect(expandToGraphemeRange(text, TextRange(start: graphemeEnd - 1, end: 1)), expected); + }); + } + + test('preserves document edges and empty ranges', () { + expect(expandToGraphemeRange('abc', const TextRange(start: 0, end: 1)), const TextRange(start: 0, end: 1)); + expect(expandToGraphemeRange('abc', const TextRange(start: 3, end: 3)), const TextRange.collapsed(3)); + expect(expandToGraphemeRange('', const TextRange(start: 0, end: 1)), TextRange.empty); + }); + }); } diff --git a/test/focus/locked_hub_controller_test.dart b/test/focus/locked_hub_controller_test.dart new file mode 100644 index 00000000..f81cfaf2 --- /dev/null +++ b/test/focus/locked_hub_controller_test.dart @@ -0,0 +1,27 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/focus/locked_hub_controller.dart'; + +void main() { + test('focus memory and last-column hint are isolated per browse owner', () { + final ownerA = HubFocusMemory(); + final ownerB = HubFocusMemory(); + + ownerA.setForHub('detail_episodes', 7); + + expect(ownerA.getForHubOnly('detail_episodes', 5), 4); + expect(ownerA.getForHub('detail_episodes', 3), 2); + expect(ownerA.getForHub('detail_extras', 4), 3); + + expect(ownerB.getForHubOnly('detail_episodes', 5), 0); + expect(ownerB.getForHub('detail_episodes', 5), 0); + expect(ownerB.getForHub('detail_extras', 5), 0); + }); + + test('per-hub fallback and empty rows keep their existing clamping behavior', () { + final memory = HubFocusMemory(); + + expect(memory.getForHubOnly('unseen', 3, fallback: 9), 2); + expect(memory.getForHubOnly('unseen', 0, fallback: 9), 0); + expect(memory.getForHub('unseen', 0), 0); + }); +} diff --git a/test/i18n/empty_string_fallback_test.dart b/test/i18n/empty_string_fallback_test.dart new file mode 100644 index 00000000..d20aa4a5 --- /dev/null +++ b/test/i18n/empty_string_fallback_test.dart @@ -0,0 +1,73 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/i18n/strings.g.dart'; + +void main() { + test('empty overrides fall back in every affected locale', () async { + final english = await AppLocale.en.build(); + final commonEnglishValues = [ + english.videoControls.showPlaybackControls, + english.videoControls.hidePlaybackControls, + ]; + final spotlightEnglishValues = [ + english.settings.tvCornerSpotlightBackdrop, + english.settings.tvCornerSpotlightBackdropDescription, + ]; + + expect([...commonEnglishValues, ...spotlightEnglishValues], everyElement(isNotEmpty)); + + const commonFallbackLocales = [ + AppLocale.bg, + AppLocale.da, + AppLocale.de, + AppLocale.es, + AppLocale.fr, + AppLocale.it, + AppLocale.ja, + AppLocale.ko, + AppLocale.nb, + AppLocale.nl, + AppLocale.pl, + AppLocale.pt, + AppLocale.ru, + AppLocale.sv, + AppLocale.zh, + ]; + const spotlightFallbackLocales = [ + AppLocale.bg, + AppLocale.da, + AppLocale.es, + AppLocale.fr, + AppLocale.it, + AppLocale.ja, + AppLocale.ko, + AppLocale.nb, + AppLocale.nl, + AppLocale.pl, + AppLocale.pt, + AppLocale.ru, + AppLocale.sv, + AppLocale.zh, + ]; + + for (final locale in commonFallbackLocales) { + final translations = await locale.build(); + expect( + [translations.videoControls.showPlaybackControls, translations.videoControls.hidePlaybackControls], + commonEnglishValues, + reason: '${locale.languageCode} must inherit the common English values', + ); + } + + for (final locale in spotlightFallbackLocales) { + final translations = await locale.build(); + expect( + [ + translations.settings.tvCornerSpotlightBackdrop, + translations.settings.tvCornerSpotlightBackdropDescription, + ], + spotlightEnglishValues, + reason: '${locale.languageCode} must inherit the English spotlight values', + ); + } + }); +} diff --git a/test/i18n/locale_fallback_source_test.dart b/test/i18n/locale_fallback_source_test.dart new file mode 100644 index 00000000..99950460 --- /dev/null +++ b/test/i18n/locale_fallback_source_test.dart @@ -0,0 +1,47 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('recovery and error locale entries are absent or non-empty', () { + const recoveryPaths = >[ + ['auth', 'localDataRecoveryRequired'], + ['settings', 'watchTogetherRelayInvalid'], + ['settings', 'saveFailed'], + ['messages', 'playbackAuthenticationRequired'], + ['messages', 'playbackServerUnavailable'], + ['messages', 'playbackDataInvalid'], + ['messages', 'playbackCancelled'], + ['messages', 'playbackFailed'], + ['profiles', 'borrowLoadFailed'], + ['liveTv', 'favoritesUpdateFailed'], + ['settings', 'downloadLocationPickerUnavailable'], + ]; + final sourceDirectory = Directory('lib/i18n'); + final english = _decodeLocale(File('${sourceDirectory.path}/en.i18n.json')); + final localeFiles = sourceDirectory.listSync().whereType().where( + (file) => file.path.endsWith('.i18n.json') && !file.path.endsWith('en.i18n.json'), + ); + + for (final path in recoveryPaths) { + expect(_valueAt(english, path), isNotEmpty, reason: 'English base value ${path.join('.')} must be usable'); + for (final localeFile in localeFiles) { + final locale = _decodeLocale(localeFile); + final value = _valueAt(locale, path); + expect(value, anyOf(isNull, isNotEmpty), reason: '${localeFile.path} must omit or translate ${path.join('.')}'); + } + } + }); +} + +Map _decodeLocale(File file) => jsonDecode(file.readAsStringSync()) as Map; + +String? _valueAt(Map locale, List path) { + Object? value = locale; + for (final segment in path) { + if (value is! Map || !value.containsKey(segment)) return null; + value = value[segment]; + } + return value as String?; +} diff --git a/test/models/shader_preset_test.dart b/test/models/shader_preset_test.dart index 05b9d22b..4ad7ea28 100644 --- a/test/models/shader_preset_test.dart +++ b/test/models/shader_preset_test.dart @@ -3,21 +3,88 @@ import 'package:plezy/models/shader_preset.dart'; void main() { group('ShaderPreset ArtCNN presets', () { - test('exposes stable built-in preset ids in the expected order', () { - final ids = ShaderPreset.allPresets.map((preset) => preset.id).toList(); - - expect(ids.take(8), [ - ShaderPreset.none.id, - ShaderPreset.nvscalerDefault.id, - 'artcnn_c4f16_neutral', - 'artcnn_c4f16_dn', - 'artcnn_c4f16_ds', - 'artcnn_c4f32_neutral', - 'artcnn_c4f32_dn', - 'artcnn_c4f32_ds', + test('exposes the complete built-in catalog in stable order', () { + expect(ShaderPreset.allPresets.map((preset) => preset.toJson()).toList(), [ + {'id': 'none', 'name': 'Off', 'type': 'none'}, + { + 'id': 'nvscaler', + 'name': 'NVScaler', + 'type': 'nvscaler', + 'nvscalerConfig': {'autoHdrSkip': true}, + }, + { + 'id': 'artcnn_c4f16_neutral', + 'name': 'ArtCNN C4F16', + 'type': 'artcnn', + 'artcnnConfig': {'model': 'c4f16', 'variant': 'neutral'}, + }, + { + 'id': 'artcnn_c4f16_dn', + 'name': 'ArtCNN C4F16 Denoise', + 'type': 'artcnn', + 'artcnnConfig': {'model': 'c4f16', 'variant': 'denoise'}, + }, + { + 'id': 'artcnn_c4f16_ds', + 'name': 'ArtCNN C4F16 Denoise + Sharpen', + 'type': 'artcnn', + 'artcnnConfig': {'model': 'c4f16', 'variant': 'denoiseSharpen'}, + }, + { + 'id': 'artcnn_c4f32_neutral', + 'name': 'ArtCNN C4F32', + 'type': 'artcnn', + 'artcnnConfig': {'model': 'c4f32', 'variant': 'neutral'}, + }, + { + 'id': 'artcnn_c4f32_dn', + 'name': 'ArtCNN C4F32 Denoise', + 'type': 'artcnn', + 'artcnnConfig': {'model': 'c4f32', 'variant': 'denoise'}, + }, + { + 'id': 'artcnn_c4f32_ds', + 'name': 'ArtCNN C4F32 Denoise + Sharpen', + 'type': 'artcnn', + 'artcnnConfig': {'model': 'c4f32', 'variant': 'denoiseSharpen'}, + }, + for (final entry in const [ + ('fast', 'modeA', 'Anime4K Fast A'), + ('fast', 'modeB', 'Anime4K Fast B'), + ('fast', 'modeC', 'Anime4K Fast C'), + ('fast', 'modeAA', 'Anime4K Fast A+A'), + ('fast', 'modeBB', 'Anime4K Fast B+B'), + ('fast', 'modeCA', 'Anime4K Fast C+A'), + ('hq', 'modeA', 'Anime4K HQ A'), + ('hq', 'modeB', 'Anime4K HQ B'), + ('hq', 'modeC', 'Anime4K HQ C'), + ('hq', 'modeAA', 'Anime4K HQ A+A'), + ('hq', 'modeBB', 'Anime4K HQ B+B'), + ('hq', 'modeCA', 'Anime4K HQ C+A'), + ]) + { + 'id': 'anime4k_${entry.$1}_${entry.$2}', + 'name': entry.$3, + 'type': 'anime4k', + 'anime4kConfig': {'quality': entry.$1, 'mode': entry.$2}, + }, ]); }); + test('shares an unmodifiable catalog and canonical id lookup', () { + final first = ShaderPreset.allPresets; + final second = ShaderPreset.allPresets; + + expect(identical(first, second), isTrue); + expect(() => first.add(ShaderPreset.none), throwsUnsupportedError); + expect(() => first.removeLast(), throwsUnsupportedError); + for (final preset in first) { + expect(identical(ShaderPreset.fromId(preset.id), preset), isTrue); + expect(identical(ShaderPreset.fromJson(preset.toJson()), preset), isTrue); + } + expect(ShaderPreset.fromId('unknown'), isNull); + }); + test('creates ArtCNN presets with names, type, and config', () { final neutral = ShaderPreset.artcnnPreset(ArtCNNModel.c4f16, ArtCNNVariant.neutral); final denoise = ShaderPreset.artcnnPreset(ArtCNNModel.c4f32, ArtCNNVariant.denoise); diff --git a/test/providers/shader_provider_test.dart b/test/providers/shader_provider_test.dart index 31d70d4c..9cf7ee72 100644 --- a/test/providers/shader_provider_test.dart +++ b/test/providers/shader_provider_test.dart @@ -1,9 +1,17 @@ +import 'dart:io'; + +import 'dart:convert'; +import 'package:path/path.dart' as path; +import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; + import 'package:flutter_test/flutter_test.dart'; import 'package:plezy/models/shader_preset.dart'; import 'package:plezy/providers/shader_provider.dart'; import 'package:plezy/services/base_shared_preferences_service.dart'; import 'package:plezy/services/settings_service.dart'; +import 'package:plezy/services/settings_export_service.dart'; +import '../test_helpers/io_fakes.dart'; import '../test_helpers/prefs.dart'; void main() { @@ -163,6 +171,117 @@ void main() { p.dispose(); }); + test('reuses the unmodifiable built-in catalog when no custom presets exist', () async { + final p = ShaderProvider(); + await Future.delayed(Duration.zero); + + expect(identical(p.allPresets, ShaderPreset.allPresets), isTrue); + expect(identical(p.allPresets, p.allPresets), isTrue); + expect(() => p.allPresets.add(ShaderPreset.none), throwsUnsupportedError); + p.dispose(); + }); + + test('refreshes a stable merged catalog when custom presets change', () async { + final originalPathProvider = PathProviderPlatform.instance; + final root = await Directory.systemTemp.createTemp('plezy_shader_provider_test_'); + PathProviderPlatform.instance = FakePathProvider(root); + addTearDown(() async { + PathProviderPlatform.instance = originalPathProvider; + if (await root.exists()) await root.delete(recursive: true); + }); + final source = File(path.join(root.path, 'custom.glsl'))..writeAsStringSync('shader'); + final p = ShaderProvider(); + addTearDown(p.dispose); + await Future.delayed(Duration.zero); + final builtIns = p.allPresets; + + final custom = await p.importCustomShader(source.path, 'Custom'); + final merged = p.allPresets; + expect(identical(merged, builtIns), isFalse); + expect(identical(merged, p.allPresets), isTrue); + expect(merged.last, custom); + expect(() => merged.removeLast(), throwsUnsupportedError); + + await p.deleteCustomShader(custom); + expect(p.findPresetById(custom.id), isNull); + expect(identical(p.allPresets, ShaderPreset.allPresets), isTrue); + }); + + test('filters unsafe persisted custom shader rows and invalid saved selection', () async { + const valid = ShaderPreset( + id: 'custom_ks9p7.glsl', + name: 'Legacy', + type: ShaderPresetType.custom, + fileName: 'ks9p7.glsl', + ); + const unsafeRows = [ + ShaderPreset( + id: 'custom_traversal', + name: 'Traversal', + type: ShaderPresetType.custom, + fileName: '../sentinel.glsl', + ), + ShaderPreset( + id: 'custom_nested', + name: 'Nested', + type: ShaderPresetType.custom, + fileName: 'nested/shader.glsl', + ), + ShaderPreset( + id: 'custom_wrong_type', + name: 'Wrong type', + type: ShaderPresetType.custom, + fileName: 'shader.txt', + ), + ]; + final svc = await SettingsService.getInstance(); + await svc.write(SettingsService.customShaderPresets, [valid.toJson(), ...unsafeRows.map((row) => row.toJson())]); + await svc.write(SettingsService.globalShaderPreset, unsafeRows.first.id); + + final p = ShaderProvider(); + await Future.delayed(Duration.zero); + + expect(p.customPresets, [valid]); + expect(p.findPresetById(unsafeRows.first.id), isNull); + expect(p.savedPreset, ShaderPreset.none); + expect(p.currentPreset, ShaderPreset.none); + p.dispose(); + }); + + test('portable settings import cannot expose an unsafe custom shader row', () async { + const unsafe = ShaderPreset( + id: 'custom_imported_traversal', + name: 'Imported traversal', + type: ShaderPresetType.custom, + fileName: '../sentinel.glsl', + ); + final prefs = await BaseSharedPreferencesService.sharedCache(); + final result = await SettingsExportService.applyImportMap( + { + 'formatVersion': SettingsExportService.formatVersion, + 'prefs': { + 'custom_shader_presets': { + 'type': 'string', + 'value': jsonEncode([unsafe.toJson()]), + }, + }, + }, + prefs, + currentUserUuid: 'profile', + ); + expect(result.keysImported, 0); + final svc = await SettingsService.getInstance(); + await svc.write(SettingsService.globalShaderPreset, unsafe.id); + + final p = ShaderProvider(); + await Future.delayed(Duration.zero); + + expect(p.customPresets, isEmpty); + expect(p.findPresetById(unsafe.id), isNull); + expect(p.savedPreset, ShaderPreset.none); + p.dispose(); + }); + test('safeNotifyListeners no-ops after dispose', () async { final p = ShaderProvider(); await Future.delayed(Duration.zero); diff --git a/test/screens/catalog_item_detail_screen_test.dart b/test/screens/catalog_item_detail_screen_test.dart index 539b2a61..4e43dad2 100644 --- a/test/screens/catalog_item_detail_screen_test.dart +++ b/test/screens/catalog_item_detail_screen_test.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -26,6 +28,13 @@ import '../test_helpers/prefs.dart'; class _FakeCatalogSource implements CatalogSource { final WatchlistChangeNotifier _watchlistChanges = WatchlistChangeNotifier(); + _FakeCatalogSource({bool watchlistLoading = false}) + : _watchlistValue = watchlistLoading ? null : false, + _watchlistLoad = watchlistLoading ? Completer() : null; + + bool? _watchlistValue; + final Completer? _watchlistLoad; + int addToWatchlistCalls = 0; @override CatalogSourceId get id => CatalogSourceId.trakt; @@ -56,7 +65,26 @@ class _FakeCatalogSource implements CatalogSource { ]; @override - bool? isOnWatchlist(MediaKind kind, CatalogItemIds ids) => false; + Future ensureWatchlistLoaded() async { + final load = _watchlistLoad; + if (load != null) await load.future; + } + + void completeWatchlistLoad() { + _watchlistValue = false; + _watchlistChanges.notify(); + _watchlistLoad!.complete(); + } + + @override + Future addToWatchlist(MediaKind kind, CatalogItemIds ids) async { + addToWatchlistCalls++; + _watchlistValue = true; + _watchlistChanges.notify(); + } + + @override + bool? isOnWatchlist(MediaKind kind, CatalogItemIds ids) => _watchlistValue; @override void dispose() => _watchlistChanges.dispose(); @@ -216,6 +244,35 @@ void main() { expect(FocusManager.instance.primaryFocus?.debugLabel, 'catalog_library_match_1'); }); + testWidgets('loading watchlist action cannot receive focus or activate', (tester) async { + final source = _FakeCatalogSource(watchlistLoading: true); + await _pumpDetail(tester, source); + + final actionBar = tester.widget(find.byType(FocusableActionBar)); + expect(actionBar.actions.single.onPressed, isNull); + final actionNode = tester + .widgetList(find.descendant(of: find.byType(FocusableActionBar), matching: find.byType(Focus))) + .map((widget) => widget.focusNode) + .whereType() + .singleWhere((node) => node.debugLabel == 'ActionBar[0]'); + expect(actionNode.canRequestFocus, isFalse); + + actionNode.requestFocus(); + await tester.pump(); + await tester.sendKeyEvent(LogicalKeyboardKey.select); + expect(actionNode.hasFocus, isFalse); + expect(source.addToWatchlistCalls, 0); + + source.completeWatchlistLoad(); + await tester.pump(); + final loadedActionBar = tester.widget(find.byType(FocusableActionBar)); + expect(loadedActionBar.actions.single.onPressed, isNotNull); + actionNode.requestFocus(); + await tester.pump(); + await tester.sendKeyEvent(LogicalKeyboardKey.select); + await tester.pump(); + expect(source.addToWatchlistCalls, 1); + }); testWidgets('TV Back closes a hosted sheet without popping the catalog route', (tester) async { await _pumpDetail(tester, _FakeCatalogSource(), pushedRoute: true); diff --git a/test/screens/collection_detail_screen_test.dart b/test/screens/collection_detail_screen_test.dart index ff6aae5e..4da96f39 100644 --- a/test/screens/collection_detail_screen_test.dart +++ b/test/screens/collection_detail_screen_test.dart @@ -24,6 +24,7 @@ import 'package:plezy/theme/mono_theme.dart'; import 'package:plezy/utils/media_server_http_client.dart'; import 'package:plezy/utils/platform_detector.dart'; import 'package:plezy/widgets/focusable_media_card.dart'; +import 'package:plezy/widgets/media_card.dart'; import 'package:plezy/widgets/media_card_sliver_layout.dart'; import 'package:provider/provider.dart'; @@ -66,6 +67,42 @@ void main() { expect(layout.fullBleedImage, isFalse); expect(tester.widget(find.byType(FocusableMediaCard)).cardShapeOverride, CardShape.square); }); + + testWidgets('collection cards announce list position without duplicate actions', (tester) async { + final semantics = tester.ensureSemantics(); + final items = [ + testMediaItem( + id: 'movie_1', + backend: MediaBackend.plex, + kind: MediaKind.movie, + title: 'First movie', + serverId: 'server_1', + serverName: 'Server', + ), + testMediaItem( + id: 'movie_2', + backend: MediaBackend.plex, + kind: MediaKind.movie, + title: 'Second movie', + serverId: 'server_1', + serverName: 'Server', + ), + ]; + final harness = await _createHarness(items); + await SettingsService.instance.write(SettingsService.viewMode, ViewMode.list); + + await tester.pumpWidget( + harness.wrap(SizedBox(width: 1280, height: 720, child: CollectionDetailScreen(collection: _collection))), + ); + await tester.pumpAndSettle(); + + final cards = tester.widgetList(find.byType(FocusableMediaCard)).toList(); + expect(cards.map((card) => card.semanticValue), ['Row 1 of 2', 'Row 2 of 2']); + + final first = tester.getSemantics(find.bySemanticsLabel(mediaCardSemanticLabel(items.first))).getSemanticsData(); + expect(first.value, 'Row 1 of 2'); + semantics.dispose(); + }); } final _collection = MediaItem( diff --git a/test/screens/libraries/alpha_jump_bar_test.dart b/test/screens/libraries/alpha_jump_bar_test.dart index e52be905..ca6219c0 100644 --- a/test/screens/libraries/alpha_jump_bar_test.dart +++ b/test/screens/libraries/alpha_jump_bar_test.dart @@ -1,8 +1,11 @@ +import 'dart:ui' show SemanticsAction, Tristate; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:plezy/focus/dpad_navigator.dart'; import 'package:plezy/focus/key_event_utils.dart'; +import 'package:plezy/i18n/strings.g.dart'; import 'package:plezy/media/library_first_character.dart'; import 'package:plezy/screens/libraries/alpha_jump_bar.dart'; import 'package:plezy/utils/platform_detector.dart'; @@ -215,6 +218,43 @@ void main() { expect(jumpedTo, 2); }); + testWidgets('exposes operable letter buttons with selected state', (tester) async { + final semantics = tester.ensureSemantics(); + final focusNode = FocusNode(debugLabel: 'test_alpha_jump_semantics'); + addTearDown(focusNode.dispose); + int? jumpedTo; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: SizedBox( + height: 300, + child: AlphaJumpBar( + firstCharacters: const [ + LibraryFirstCharacter(key: 'A', title: 'A', size: 3), + LibraryFirstCharacter(key: 'B', title: 'B', size: 4), + LibraryFirstCharacter(key: 'C', title: 'C', size: 2), + ], + currentLetter: 'B', + focusNode: focusNode, + onJump: (index) => jumpedTo = index, + ), + ), + ), + ), + ); + + expect(find.bySemanticsLabel(t.accessibility.alphabetNavigation), findsOneWidget); + final selected = tester.getSemantics(find.bySemanticsLabel('B')).getSemanticsData(); + expect(selected.flagsCollection.isButton, isTrue); + expect(selected.flagsCollection.isSelected, Tristate.isTrue); + expect(selected.hasAction(SemanticsAction.tap), isTrue); + + final cNode = tester.getSemantics(find.bySemanticsLabel('C')); + cNode.owner!.performAction(cNode.id, SemanticsAction.tap); + expect(jumpedTo, 7); + semantics.dispose(); + }); } class _BackKeyCase { diff --git a/test/screens/libraries/alpha_scroll_handle_test.dart b/test/screens/libraries/alpha_scroll_handle_test.dart new file mode 100644 index 00000000..2a647264 --- /dev/null +++ b/test/screens/libraries/alpha_scroll_handle_test.dart @@ -0,0 +1,78 @@ +import 'dart:ui' show SemanticsAction; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/i18n/strings.g.dart'; +import 'package:plezy/media/library_first_character.dart'; +import 'package:plezy/screens/libraries/alpha_scroll_handle.dart'; + +void main() { + const characters = [ + LibraryFirstCharacter(key: 'A', title: 'A', size: 2), + LibraryFirstCharacter(key: 'B', title: 'B', size: 3), + LibraryFirstCharacter(key: 'C', title: 'C', size: 4), + ]; + + Widget buildHandle({required bool isScrolling, required ValueChanged onJump}) { + return MaterialApp( + home: Scaffold( + body: Align( + alignment: Alignment.centerRight, + child: SizedBox( + height: 300, + child: AlphaScrollHandle( + firstCharacters: characters, + currentLetter: 'B', + isScrolling: isScrolling, + onJump: onJump, + ), + ), + ), + ), + ); + } + + testWidgets('keeps adjustable semantics mounted while fully hidden', (tester) async { + final semantics = tester.ensureSemantics(); + final jumps = []; + + await tester.pumpWidget(buildHandle(isScrolling: false, onJump: jumps.add)); + + final finder = find.bySemanticsLabel(t.accessibility.alphabetNavigation); + expect(finder, findsOneWidget); + final node = tester.getSemantics(finder); + final data = node.getSemanticsData(); + expect(data.value, 'B'); + expect(data.hasAction(SemanticsAction.increase), isTrue); + expect(data.hasAction(SemanticsAction.decrease), isTrue); + expect(tester.widget(find.byType(IgnorePointer).last).ignoring, isTrue); + + node.owner!.performAction(node.id, SemanticsAction.increase); + expect(jumps, [5]); + semantics.dispose(); + }); + + testWidgets('announces the current letter and exposes bounded letter steps', (tester) async { + final semantics = tester.ensureSemantics(); + final jumps = []; + + await tester.pumpWidget(buildHandle(isScrolling: false, onJump: jumps.add)); + await tester.pumpWidget(buildHandle(isScrolling: true, onJump: jumps.add)); + await tester.pump(const Duration(milliseconds: 250)); + + final finder = find.bySemanticsLabel(t.accessibility.alphabetNavigation); + expect(finder, findsOneWidget); + final node = tester.getSemantics(finder); + final data = node.getSemanticsData(); + expect(data.value, 'B'); + expect(data.hint, t.accessibility.alphabetScrollHint); + expect(data.hasAction(SemanticsAction.increase), isTrue); + expect(data.hasAction(SemanticsAction.decrease), isTrue); + + node.owner!.performAction(node.id, SemanticsAction.increase); + expect(jumps, [5]); + node.owner!.performAction(node.id, SemanticsAction.decrease); + expect(jumps, [5, 0]); + semantics.dispose(); + }); +} diff --git a/test/screens/profile/add_local_profile_screen_test.dart b/test/screens/profile/add_local_profile_screen_test.dart index 00f39bd9..2f80e234 100644 --- a/test/screens/profile/add_local_profile_screen_test.dart +++ b/test/screens/profile/add_local_profile_screen_test.dart @@ -38,6 +38,10 @@ void main() { expect(FocusManager.instance.primaryFocus?.debugLabel, 'TvVirtualKeyboard'); expect(find.byKey(const Key('tv_virtual_keyboard_panel')), findsOneWidget); + await tester.sendKeyEvent(LogicalKeyboardKey.select); + await tester.pump(); + expect(tester.widget(find.byType(TextField)).controller!.text, isNotEmpty); + await tester.sendKeyEvent(LogicalKeyboardKey.gameButtonB); await tester.pumpAndSettle(); diff --git a/test/screens/profile/borrow_connection_screen_test.dart b/test/screens/profile/borrow_connection_screen_test.dart new file mode 100644 index 00000000..a3956508 --- /dev/null +++ b/test/screens/profile/borrow_connection_screen_test.dart @@ -0,0 +1,103 @@ +import 'dart:async'; +import 'dart:collection'; + +import 'package:drift/native.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/connection/connection_registry.dart'; +import 'package:plezy/database/app_database.dart'; +import 'package:plezy/focus/input_mode_tracker.dart'; +import 'package:plezy/i18n/strings.g.dart'; +import 'package:plezy/profiles/plex_home_service.dart'; +import 'package:plezy/profiles/profile.dart'; +import 'package:plezy/profiles/profile_connection_registry.dart'; +import 'package:plezy/profiles/profile_registry.dart'; +import 'package:plezy/screens/profile/borrow_connection_screen.dart'; +import 'package:plezy/services/storage_service.dart'; +import 'package:plezy/theme/mono_theme.dart'; +import 'package:provider/provider.dart'; + +import '../../test_helpers/prefs.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() { + resetSharedPreferencesForTest(); + LocaleSettings.setLocaleSync(AppLocale.en); + }); + + testWidgets('load failure has retry and remains distinct from successful empty state', (tester) async { + final db = AppDatabase.forTesting(NativeDatabase.memory()); + final connections = ConnectionRegistry(db); + final profileConnections = ProfileConnectionRegistry(db); + final profiles = ProfileRegistry(db); + final storage = await StorageService.getInstance(); + final plexHome = _ControlledPlexHomeService( + connections: connections, + profileConnections: profileConnections, + storage: storage, + ); + addTearDown(() async { + await plexHome.dispose(); + await db.close(); + }); + + final target = Profile.local(id: 'target', displayName: 'Target', createdAt: DateTime(2026)); + + await tester.pumpWidget( + TranslationProvider( + child: MultiProvider( + providers: [ + Provider.value(value: profileConnections), + Provider.value(value: connections), + Provider.value(value: profiles), + Provider.value(value: plexHome), + ], + child: InputModeTracker( + child: MaterialApp( + theme: monoTheme(dark: true), + home: BorrowConnectionScreen(targetProfile: target), + ), + ), + ), + ), + ); + + expect(plexHome.starts, hasLength(1)); + expect(find.byType(CircularProgressIndicator), findsOneWidget); + + plexHome.starts.first.completeError(StateError('load failed')); + await tester.pumpAndSettle(); + + expect(find.text(t.profiles.borrowLoadFailed), findsOneWidget); + expect(find.text(t.common.retry), findsOneWidget); + expect(find.text(t.profiles.borrowEmpty), findsNothing); + + await tester.tap(find.text(t.common.retry)); + await tester.pump(); + + expect(plexHome.starts, hasLength(2)); + expect(find.byType(CircularProgressIndicator), findsOneWidget); + expect(find.text(t.profiles.borrowLoadFailed), findsNothing); + + plexHome.starts.last.complete(); + await tester.pumpAndSettle(); + + expect(find.text(t.profiles.borrowEmpty), findsOneWidget); + expect(find.text(t.profiles.borrowLoadFailed), findsNothing); + }); +} + +class _ControlledPlexHomeService extends PlexHomeService { + _ControlledPlexHomeService({required super.connections, required super.profileConnections, required super.storage}); + + final Queue> starts = Queue(); + + @override + Future start() { + final completer = Completer(); + starts.add(completer); + return completer.future; + } +} diff --git a/test/screens/settings/keyboard_shortcuts_screen_test.dart b/test/screens/settings/keyboard_shortcuts_screen_test.dart new file mode 100644 index 00000000..850f82d2 --- /dev/null +++ b/test/screens/settings/keyboard_shortcuts_screen_test.dart @@ -0,0 +1,167 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/i18n/strings.g.dart'; +import 'package:plezy/screens/settings/keyboard_shortcuts_screen.dart'; +import 'package:plezy/services/base_shared_preferences_service.dart'; +import 'package:plezy/services/keyboard_shortcuts_service.dart'; +import 'package:plezy/services/settings_service.dart'; +import 'package:plezy/theme/mono_theme.dart'; +import 'package:plezy/widgets/dialog_action_button.dart'; +import 'package:plezy/widgets/focusable_list_tile.dart'; +import 'package:plezy/widgets/hotkey_recorder.dart'; +import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart'; +import 'package:shared_preferences_platform_interface/shared_preferences_async_platform_interface.dart'; +import 'package:shared_preferences_platform_interface/types.dart'; + +import '../../test_helpers/prefs.dart'; + +void main() { + setUpAll(() => LocaleSettings.setLocaleSync(AppLocale.en)); + + setUp(() { + resetSharedPreferencesForTest(); + SettingsService.resetForTesting(); + }); + + testWidgets('clear persists an unassigned row that can be rebound', (tester) async { + final service = await KeyboardShortcutsService.getInstance(); + addTearDown(service.dispose); + await _pumpScreen(tester, service); + + await _openAction(tester, service, 'play_pause'); + await tester.tap(find.byTooltip(t.hotkeys.clearShortcut)); + await tester.pump(); + await tester.tap(_saveButton()); + await tester.pumpAndSettle(); + + expect(find.byType(AlertDialog), findsNothing); + expect(service.getHotkey('play_pause'), isNull); + expect(find.text(t.hotkeys.noShortcutSet), findsOneWidget); + final stored = + json.decode(SettingsService.instance.prefs.getString(SettingsService.keyboardHotkeys.key)!) + as Map; + expect(stored['play_pause'], {'disabled': true}); + + await _openAction(tester, service, 'play_pause'); + expect(tester.widget(find.byType(HotKeyRecorder)).initalHotKey, isNull); + await tester.tap(_recorderSurface()); + await tester.pump(); + await tester.sendKeyEvent(LogicalKeyboardKey.keyK, physicalKey: PhysicalKeyboardKey.keyK); + await tester.pump(); + await tester.pump(); + await tester.tap(_saveButton()); + await tester.pumpAndSettle(); + + expect(service.getHotkey('play_pause')?.key, PhysicalKeyboardKey.keyK); + expect(find.text(service.formatHotkey(service.getHotkey('play_pause'))), findsOneWidget); + }); + + testWidgets('clear then cancel keeps the persisted assignment', (tester) async { + final service = await KeyboardShortcutsService.getInstance(); + addTearDown(service.dispose); + await _pumpScreen(tester, service); + + await _openAction(tester, service, 'play_pause'); + await tester.tap(find.byTooltip(t.hotkeys.clearShortcut)); + await tester.pump(); + await tester.tap(find.widgetWithText(TextButton, t.common.cancel)); + await tester.pumpAndSettle(); + + expect(service.getHotkey('play_pause')?.key, PhysicalKeyboardKey.space); + expect(find.text(service.formatHotkey(service.getHotkey('play_pause'))), findsOneWidget); + }); + + testWidgets('conflicting recording is rejected without changing either action', (tester) async { + final service = await KeyboardShortcutsService.getInstance(); + addTearDown(service.dispose); + await _pumpScreen(tester, service); + + await _openAction(tester, service, 'play_pause'); + await tester.tap(_recorderSurface()); + await tester.pump(); + await tester.sendKeyEvent(LogicalKeyboardKey.arrowUp, physicalKey: PhysicalKeyboardKey.arrowUp); + await tester.pump(); + await tester.pump(); + await tester.tap(_saveButton()); + await tester.pumpAndSettle(); + + expect(find.byType(AlertDialog), findsNothing); + expect(service.getHotkey('play_pause')?.key, PhysicalKeyboardKey.space); + expect(service.getHotkey('volume_up')?.key, PhysicalKeyboardKey.arrowUp); + expect( + find.text(t.settings.shortcutAlreadyAssigned(action: service.getActionDisplayName('volume_up'))), + findsOneWidget, + ); + }); + + testWidgets('persistence failure keeps the dialog retryable and the row unchanged', (tester) async { + final preferences = _FailingHotkeyPreferences(const {}); + SharedPreferencesAsyncPlatform.instance = preferences; + SettingsService.resetForTesting(); + BaseSharedPreferencesService.resetForTesting(); + final service = await KeyboardShortcutsService.getInstance(); + addTearDown(service.dispose); + await _pumpScreen(tester, service); + + await _openAction(tester, service, 'play_pause'); + await tester.tap(find.byTooltip(t.hotkeys.clearShortcut)); + await tester.pump(); + preferences.failNextHotkeyWrite = true; + await tester.tap(_saveButton()); + await tester.pumpAndSettle(); + + expect(find.byType(AlertDialog), findsOneWidget); + expect(service.getHotkey('play_pause')?.key, PhysicalKeyboardKey.space); + expect(find.text(t.common.error), findsOneWidget); + expect( + tester.widget(find.widgetWithText(DialogActionButton, t.common.save)).onPressed, + isNotNull, + ); + + await tester.tap(_saveButton()); + await tester.pumpAndSettle(); + expect(find.byType(AlertDialog), findsNothing); + expect(service.getHotkey('play_pause'), isNull); + }); +} + +Future _pumpScreen(WidgetTester tester, KeyboardShortcutsService service) async { + await tester.pumpWidget( + TranslationProvider( + child: MaterialApp( + theme: monoTheme(dark: true), + home: KeyboardShortcutsScreen(keyboardService: service), + ), + ), + ); + await tester.pumpAndSettle(); +} + +Future _openAction(WidgetTester tester, KeyboardShortcutsService service, String action) async { + await tester.tap(find.widgetWithText(FocusableListTile, service.getActionDisplayName(action))); + await tester.pumpAndSettle(); + expect(find.byType(AlertDialog), findsOneWidget); +} + +Finder _recorderSurface() => + find.ancestor(of: find.byType(HotKeyRecorder), matching: find.byType(GestureDetector)).first; + +Finder _saveButton() => find.widgetWithText(FilledButton, t.common.save); + +final class _FailingHotkeyPreferences extends InMemorySharedPreferencesAsync { + _FailingHotkeyPreferences(super.data) : super.withData(); + + bool failNextHotkeyWrite = false; + + @override + Future setString(String key, String value, SharedPreferencesOptions options) { + if (key == SettingsService.keyboardHotkeys.key && failNextHotkeyWrite) { + failNextHotkeyWrite = false; + throw PlatformException(code: 'write_failed'); + } + return super.setString(key, value, options); + } +} diff --git a/test/screens/settings/mpv_config_screen_test.dart b/test/screens/settings/mpv_config_screen_test.dart new file mode 100644 index 00000000..58a64881 --- /dev/null +++ b/test/screens/settings/mpv_config_screen_test.dart @@ -0,0 +1,330 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/i18n/strings.g.dart'; +import 'package:plezy/models/mpv_config_models.dart'; +import 'package:plezy/screens/settings/mpv_config_screen.dart'; +import 'package:plezy/services/base_shared_preferences_service.dart'; +import 'package:plezy/services/settings_service.dart'; +import 'package:plezy/theme/mono_theme.dart'; +import 'package:plezy/widgets/dialog_action_button.dart'; +import 'package:plezy/widgets/focusable_list_tile.dart'; +import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart'; +import 'package:shared_preferences_platform_interface/shared_preferences_async_platform_interface.dart'; +import 'package:shared_preferences_platform_interface/types.dart'; + +import '../../test_helpers/prefs.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + setUpAll(() => LocaleSettings.setLocaleSync(AppLocale.en)); + + testWidgets('typing burst coalesces to one full-document write', (tester) async { + final backend = await _pumpEditor(tester, holdConfigWrites: true); + + await tester.enterText(find.byType(TextField), 'vo'); + await tester.enterText(find.byType(TextField), 'vol'); + await tester.enterText(find.byType(TextField), 'volume=80'); + + await tester.pump(const Duration(milliseconds: 399)); + expect(backend.configWrites, isEmpty); + + await tester.pump(const Duration(milliseconds: 1)); + expect(backend.configWrites, ['volume=80']); + expect(backend.maxActiveConfigWrites, 1); + + backend.completeNextConfigWrite(); + await tester.pump(); + + expect(backend.durableConfig, 'volume=80'); + }); + + testWidgets('new revisions wait for the active write and only the latest follows', (tester) async { + final backend = await _pumpEditor(tester, holdConfigWrites: true); + + await tester.enterText(find.byType(TextField), 'first=1'); + await tester.pump(const Duration(milliseconds: 400)); + expect(backend.configWrites, ['first=1']); + + await tester.enterText(find.byType(TextField), 'second=2'); + await tester.enterText(find.byType(TextField), 'final=3'); + await tester.pump(const Duration(milliseconds: 400)); + + expect(backend.configWrites, ['first=1']); + expect(backend.activeConfigWrites, 1); + + backend.completeNextConfigWrite(); + await tester.pump(); + + expect(backend.configWrites, ['first=1', 'final=3']); + expect(backend.maxActiveConfigWrites, 1); + expect(tester.widget(find.byType(TextField)).controller!.text, 'final=3'); + + backend.completeNextConfigWrite(); + await tester.pump(); + + expect(backend.durableConfig, 'final=3'); + }); + + testWidgets('manual Enter insertion joins the debounced writer', (tester) async { + final backend = await _pumpEditor(tester, holdConfigWrites: true); + + await tester.enterText(find.byType(TextField), 'alpha=1'); + await tester.pump(const Duration(milliseconds: 400)); + backend.completeNextConfigWrite(); + await tester.pump(); + backend.configWrites.clear(); + + await tester.sendKeyEvent(LogicalKeyboardKey.enter); + expect(tester.widget(find.byType(TextField)).controller!.text, 'alpha=1\n'); + + await tester.pump(const Duration(milliseconds: 399)); + expect(backend.configWrites, isEmpty); + await tester.pump(const Duration(milliseconds: 1)); + expect(backend.configWrites, ['alpha=1\n']); + + backend.completeNextConfigWrite(); + await tester.pump(); + expect(backend.durableConfig, 'alpha=1\n'); + }); + + testWidgets('observed external replacement wins after an in-flight local write', (tester) async { + final backend = await _pumpEditor(tester, holdConfigWrites: true); + final settings = SettingsService.instance; + + await tester.enterText(find.byType(TextField), 'local=old'); + await tester.pump(const Duration(milliseconds: 400)); + expect(backend.configWrites, ['local=old']); + + unawaited(settings.write(SettingsService.mpvConfigText, 'external=new')); + await tester.pump(); + expect(backend.configWrites, ['local=old', 'external=new']); + + backend.completeConfigWriteAt(1); + await tester.pump(); + expect(tester.widget(find.byType(TextField)).controller!.text, 'external=new'); + + backend.completeNextConfigWrite(); + await tester.pump(); + expect(backend.configWrites, ['local=old', 'external=new', 'external=new']); + + backend.completeNextConfigWrite(); + await tester.pump(); + expect(backend.durableConfig, 'external=new'); + }); + + testWidgets('focus loss flushes immediately and route pop waits for persistence', (tester) async { + final backend = await _pumpEditor(tester, holdConfigWrites: true); + + await tester.enterText(find.byType(TextField), 'profile=gpu-hq'); + FocusManager.instance.primaryFocus?.unfocus(); + await tester.pump(); + + expect(backend.configWrites, ['profile=gpu-hq']); + + unawaited(tester.binding.handlePopRoute()); + await tester.pump(); + expect(find.byType(MpvConfigScreen), findsOneWidget); + + backend.completeNextConfigWrite(); + await tester.pumpAndSettle(); + + expect(find.byType(MpvConfigScreen), findsNothing); + expect(find.text('home'), findsOneWidget); + expect(backend.durableConfig, 'profile=gpu-hq'); + }); + + testWidgets('dispose flushes its captured edit without using disposed UI', (tester) async { + final backend = await _pumpEditor(tester, holdConfigWrites: true); + + await tester.enterText(find.byType(TextField), 'video-sync=display-resample'); + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pump(); + + expect(backend.configWrites, ['video-sync=display-resample']); + + backend.completeNextConfigWrite(); + await tester.pump(); + + expect(tester.takeException(), isNull); + expect(backend.durableConfig, 'video-sync=display-resample'); + }); + + testWidgets('failed flush stays retryable and does not pop until retry succeeds', (tester) async { + final backend = await _pumpEditor(tester, holdConfigWrites: true); + const config = 'gpu-api=secret-test-value'; + + await tester.enterText(find.byType(TextField), config); + FocusManager.instance.primaryFocus?.unfocus(); + await tester.pump(); + + backend.completeNextConfigWrite(error: PlatformException(code: 'write_failed')); + await tester.pump(); + await tester.pump(const Duration(milliseconds: 300)); + + expect(find.text(t.settings.saveFailed), findsOneWidget); + expect(find.textContaining('write_failed'), findsNothing); + expect(backend.durableConfig, isNull); + + unawaited(tester.binding.handlePopRoute()); + await tester.pump(); + expect(backend.configWrites, [config, config]); + expect(find.byType(MpvConfigScreen), findsOneWidget); + + backend.completeNextConfigWrite(); + await tester.pumpAndSettle(); + + expect(find.byType(MpvConfigScreen), findsNothing); + expect(backend.durableConfig, config); + }); + + testWidgets('saving a preset flushes the matching active text before success', (tester) async { + final backend = await _pumpEditor(tester, holdConfigWrites: true); + final settings = SettingsService.instance; + + await tester.enterText(find.byType(TextField), 'preset-source=yes'); + await tester.pump(); + final saveTile = tester.widget(find.widgetWithText(FocusableListTile, t.mpvConfig.saveAsPreset)); + expect(saveTile.enabled, isTrue); + saveTile.onTap!(); + await tester.pumpAndSettle(); + + final dialog = find.byType(AlertDialog); + expect(dialog, findsOneWidget); + final nameField = find.descendant(of: dialog, matching: find.byType(TextField)); + expect(nameField, findsOneWidget); + await tester.enterText(nameField, 'Saved'); + await tester.tap(find.widgetWithText(DialogActionButton, t.common.save)); + await tester.pump(); + + expect(settings.read(SettingsService.mpvPresets), isEmpty); + expect(find.text(t.mpvConfig.presetSaved), findsNothing); + + backend.completeNextConfigWrite(); + await tester.pump(); + await tester.pump(const Duration(milliseconds: 300)); + + final presets = settings.read(SettingsService.mpvPresets); + expect(presets, hasLength(1)); + expect(presets.single.name, 'Saved'); + expect(presets.single.text, 'preset-source=yes'); + expect(find.text(t.mpvConfig.presetSaved), findsOneWidget); + }); + + testWidgets('preset replacement waits behind an active edit and wins last', (tester) async { + final preset = MpvPreset(name: 'Cinema', text: 'profile=gpu-hq', createdAt: DateTime(2026)); + final backend = await _pumpEditor(tester, holdConfigWrites: true, presets: [preset]); + + await tester.enterText(find.byType(TextField), 'old-edit=yes'); + await tester.pump(const Duration(milliseconds: 400)); + expect(backend.configWrites, ['old-edit=yes']); + + await tester.tap(find.text('Cinema')); + await tester.pump(); + expect(backend.configWrites, ['old-edit=yes']); + expect(find.text(t.mpvConfig.presetLoaded), findsNothing); + + backend.completeNextConfigWrite(); + await tester.pump(); + expect(backend.configWrites, ['old-edit=yes', 'profile=gpu-hq']); + expect(backend.maxActiveConfigWrites, 1); + + backend.completeNextConfigWrite(); + await tester.pump(); + await tester.pump(const Duration(milliseconds: 300)); + + expect(find.text(t.mpvConfig.presetLoaded), findsOneWidget); + expect(backend.durableConfig, 'profile=gpu-hq'); + }); + + testWidgets('clean external settings update replaces the editor', (tester) async { + final backend = await _pumpEditor(tester); + final settings = SettingsService.instance; + + await settings.write(SettingsService.mpvConfigText, 'external=yes'); + await tester.pump(); + + expect(tester.widget(find.byType(TextField)).controller!.text, 'external=yes'); + expect(backend.durableConfig, 'external=yes'); + }); +} + +Future<_ControlledPreferences> _pumpEditor( + WidgetTester tester, { + bool holdConfigWrites = false, + List presets = const [], +}) async { + resetSharedPreferencesForTest(); + final initial = { + if (presets.isNotEmpty) + SettingsService.mpvPresets.key: jsonEncode(presets.map((preset) => preset.toJson()).toList()), + }; + final backend = _ControlledPreferences(initial)..holdConfigWrites = holdConfigWrites; + SharedPreferencesAsyncPlatform.instance = backend; + BaseSharedPreferencesService.resetForTesting(); + SettingsService.resetForTesting(); + await SettingsService.getInstance(); + + final navigatorKey = GlobalKey(); + await tester.pumpWidget( + TranslationProvider( + child: MaterialApp( + navigatorKey: navigatorKey, + theme: monoTheme(dark: true), + home: const Scaffold(body: Text('home')), + ), + ), + ); + unawaited(navigatorKey.currentState!.push(MaterialPageRoute(builder: (_) => const MpvConfigScreen()))); + await tester.pumpAndSettle(); + return backend; +} + +base class _ControlledPreferences extends InMemorySharedPreferencesAsync { + _ControlledPreferences(super.data) : super.withData(); + + bool holdConfigWrites = false; + final List configWrites = []; + final List> _configWriteGates = []; + int activeConfigWrites = 0; + int maxActiveConfigWrites = 0; + String? durableConfig; + + @override + Future setString(String key, String value, SharedPreferencesOptions options) async { + if (key != SettingsService.mpvConfigText.key) return super.setString(key, value, options); + + configWrites.add(value); + activeConfigWrites++; + if (activeConfigWrites > maxActiveConfigWrites) maxActiveConfigWrites = activeConfigWrites; + try { + if (holdConfigWrites) { + final gate = Completer(); + _configWriteGates.add(gate); + await gate.future; + } + final result = await super.setString(key, value, options); + durableConfig = value; + return result; + } finally { + activeConfigWrites--; + } + } + + void completeNextConfigWrite({Object? error}) { + completeConfigWriteAt(0, error: error); + } + + void completeConfigWriteAt(int index, {Object? error}) { + final gate = _configWriteGates.removeAt(index); + if (error == null) { + gate.complete(); + } else { + gate.completeError(error); + } + } +} diff --git a/test/screens/settings/settings_screen_test.dart b/test/screens/settings/settings_screen_test.dart index d34e7d3a..3f7fc86b 100644 --- a/test/screens/settings/settings_screen_test.dart +++ b/test/screens/settings/settings_screen_test.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:io'; import 'package:file_picker/file_picker.dart'; @@ -24,11 +25,13 @@ import 'package:plezy/screens/settings/settings_screen.dart'; import 'package:plezy/services/donation_service.dart'; import 'package:plezy/services/download_storage_service.dart'; import 'package:plezy/services/download_manager_service.dart'; +import 'package:plezy/services/settings_export_service.dart'; import 'package:plezy/services/settings_service.dart'; import 'package:plezy/services/update_service.dart'; import 'package:plezy/theme/mono_theme.dart'; import 'package:plezy/utils/platform_detector.dart'; import 'package:plezy/widgets/app_icon.dart'; +import 'package:plezy/widgets/dialog_action_button.dart'; import 'package:plezy/widgets/focusable_list_tile.dart'; import 'package:plezy/widgets/loading_indicator_box.dart'; import 'package:plezy/widgets/setting_tile.dart'; @@ -310,6 +313,148 @@ void main() { expect(SettingsService.instance.read(SettingsService.customDownloadPath), isNull); expect(find.text(t.settings.resetSettingsSuccess), findsOneWidget); }); + + testWidgets('cancelled directory picker remains silent and leaves the dialog retryable', (tester) async { + final harness = await _pumpSettingsScreen(tester); + addTearDown(() => harness.dispose(tester)); + + await tester.tap(find.text(t.settings.downloadLocationDefault)); + await _pumpUi(tester); + await tester.tap(find.text(t.settings.selectFolder)); + await _pumpUi(tester); + + expect(find.byType(AlertDialog), findsOneWidget); + expect(find.text(t.settings.saveFailed), findsNothing); + expect(find.text(t.settings.downloadLocationChanged), findsNothing); + expect(harness.locationEvents, isEmpty); + }); + + testWidgets('directory picker platform failure uses shared settings feedback', (tester) async { + directoryPicker.directoryError = PlatformException(code: 'picker_failed'); + final harness = await _pumpSettingsScreen(tester); + addTearDown(() => harness.dispose(tester)); + + await tester.tap(find.text(t.settings.downloadLocationDefault)); + await _pumpUi(tester); + await tester.tap(find.text(t.settings.selectFolder)); + await _pumpUi(tester); + + expect(find.byType(AlertDialog), findsOneWidget); + expect(find.text(t.settings.saveFailed), findsOneWidget); + expect(harness.locationEvents, isEmpty); + }); + + testWidgets('directory filesystem failure uses shared settings feedback', (tester) async { + directoryPicker.directoryPath = '${temporaryDirectory.path}/selected-downloads'; + final harness = await _pumpSettingsScreen( + tester, + writableChecker: (_) async => throw const FileSystemException('writable check failed'), + ); + addTearDown(() => harness.dispose(tester)); + + await tester.tap(find.text(t.settings.downloadLocationDefault)); + await _pumpUi(tester); + await tester.tap(find.text(t.settings.selectFolder)); + await _pumpUi(tester); + + expect(find.byType(AlertDialog), findsOneWidget); + expect(find.text(t.settings.saveFailed), findsOneWidget); + expect(harness.locationEvents, isEmpty); + }); + + testWidgets('late directory picker completion does not use a disposed context', (tester) async { + directoryPicker.directoryGate = Completer(); + final harness = await _pumpSettingsScreen(tester); + + await tester.tap(find.text(t.settings.downloadLocationDefault)); + await _pumpUi(tester); + await tester.tap(find.text(t.settings.selectFolder)); + await tester.pump(); + await harness.dispose(tester); + + directoryPicker.directoryGate!.complete('${temporaryDirectory.path}/late-downloads'); + await tester.pump(); + + expect(tester.takeException(), isNull); + expect(harness.locationEvents, isEmpty); + }); + + testWidgets('late directory picker failure does not use a disposed context', (tester) async { + directoryPicker.directoryGate = Completer(); + final harness = await _pumpSettingsScreen(tester); + + await tester.tap(find.text(t.settings.downloadLocationDefault)); + await _pumpUi(tester); + await tester.tap(find.text(t.settings.selectFolder)); + await tester.pump(); + await harness.dispose(tester); + + directoryPicker.directoryGate!.completeError(PlatformException(code: 'late_picker_failure')); + await tester.pump(); + + expect(tester.takeException(), isNull); + expect(harness.locationEvents, isEmpty); + }); + + testWidgets('late settings export failure does not use a disposed context', (tester) async { + final exportGate = Completer(); + final harness = await _pumpSettingsScreen(tester, settingsExporter: () => exportGate.future); + + await tester.tap(find.text(t.settings.exportSettings)); + await tester.pump(); + await harness.dispose(tester); + + exportGate.completeError(PlatformException(code: 'late_export_failure')); + await tester.pump(); + + expect(tester.takeException(), isNull); + }); + + testWidgets('late settings import failure does not use a disposed context', (tester) async { + final importGate = Completer(); + final harness = await _pumpSettingsScreen(tester, settingsImporter: () => importGate.future); + + await tester.tap(find.text(t.settings.importSettings)); + await _pumpUi(tester); + await tester.tap(find.widgetWithText(DialogActionButton, t.settings.importSettings)); + await tester.pump(); + await harness.dispose(tester); + + importGate.completeError(PlatformException(code: 'late_import_failure')); + await tester.pump(); + + expect(tester.takeException(), isNull); + }); + + testWidgets('settings export platform failure uses shared settings feedback', (tester) async { + final harness = await _pumpSettingsScreen( + tester, + settingsExporter: () async => throw PlatformException(code: 'save_failed'), + ); + addTearDown(() => harness.dispose(tester)); + + await tester.tap(find.text(t.settings.exportSettings)); + await _pumpUi(tester); + + expect(find.text(t.settings.saveFailed), findsOneWidget); + expect(find.text(t.settings.exportSettingsSuccess), findsNothing); + }); + + testWidgets('settings import platform failure uses shared settings feedback', (tester) async { + final harness = await _pumpSettingsScreen( + tester, + settingsImporter: () async => throw PlatformException(code: 'pick_failed'), + ); + addTearDown(() => harness.dispose(tester)); + + await tester.tap(find.text(t.settings.importSettings)); + await _pumpUi(tester); + await tester.tap(find.widgetWithText(DialogActionButton, t.settings.importSettings)); + await _pumpUi(tester); + + expect(find.text(t.settings.saveFailed), findsOneWidget); + expect(find.text(t.settings.importSettingsSuccess), findsNothing); + }); } Finder _navigationTileFor(String title) => @@ -376,7 +521,12 @@ class _SettingsHarness { } } -Future<_SettingsHarness> _pumpSettingsScreen(WidgetTester tester) async { +Future<_SettingsHarness> _pumpSettingsScreen( + WidgetTester tester, { + Future Function(Directory directory)? writableChecker, + Future Function()? settingsExporter, + Future Function()? settingsImporter, +}) async { tester.view.physicalSize = const Size(1800, 3200); tester.view.devicePixelRatio = 1; addTearDown(tester.view.resetPhysicalSize); @@ -451,7 +601,11 @@ Future<_SettingsHarness> _pumpSettingsScreen(WidgetTester tester) async { ], child: MaterialApp( theme: monoTheme(dark: true).copyWith(platform: TargetPlatform.android), - home: SettingsScreen(downloadDirectoryWritableChecker: (_) async => true), + home: SettingsScreen( + downloadDirectoryWritableChecker: writableChecker ?? (_) async => true, + settingsExporter: settingsExporter, + settingsImporter: settingsImporter, + ), ), ), ), @@ -463,6 +617,8 @@ Future<_SettingsHarness> _pumpSettingsScreen(WidgetTester tester) async { class _FakeDirectoryPicker extends FilePicker { String? directoryPath; + Object? directoryError; + Completer? directoryGate; @override Future getDirectoryPath({ @@ -470,6 +626,10 @@ class _FakeDirectoryPicker extends FilePicker { String? initialDirectory, bool lockParentWindow = false, }) async { + final gate = directoryGate; + if (gate != null) return gate.future; + final error = directoryError; + if (error != null) throw error; return directoryPath; } } diff --git a/test/screens/settings/settings_utils_test.dart b/test/screens/settings/settings_utils_test.dart index daf35933..a202cd55 100644 --- a/test/screens/settings/settings_utils_test.dart +++ b/test/screens/settings/settings_utils_test.dart @@ -1,8 +1,13 @@ +import 'dart:async'; +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/i18n/strings.g.dart'; import 'package:plezy/screens/settings/settings_utils.dart'; import 'package:plezy/utils/platform_detector.dart'; +import 'package:plezy/widgets/dialog_action_button.dart'; void main() { tearDown(() { @@ -60,4 +65,105 @@ void main() { expect(saved, isEmpty); expect(tester.takeException(), isNull); }); + + testWidgets('settings save helper reports platform failures and remains retryable', (tester) async { + final context = await _pumpHost(tester); + + showRegexInputDialog( + context: context, + title: 'Regex', + currentValue: 'abc', + defaultValue: '.*', + onSave: (_) async => throw PlatformException(code: 'write_failed'), + ); + await tester.pumpAndSettle(); + await tester.tap(_saveButton()); + await tester.pump(); + + expect(find.byType(AlertDialog), findsOneWidget); + expect(find.text(t.settings.saveFailed), findsOneWidget); + }); + + testWidgets('settings save helper reports filesystem failures and remains retryable', (tester) async { + final context = await _pumpHost(tester); + + showRegexInputDialog( + context: context, + title: 'Regex', + currentValue: 'abc', + defaultValue: '.*', + onSave: (_) async => throw const FileSystemException('write failed'), + ); + await tester.pumpAndSettle(); + await tester.tap(_saveButton()); + await tester.pump(); + + expect(find.byType(AlertDialog), findsOneWidget); + expect(find.text(t.settings.saveFailed), findsOneWidget); + }); + + testWidgets('settings save helper closes only after a successful save', (tester) async { + final context = await _pumpHost(tester); + var saved = false; + + showRegexInputDialog( + context: context, + title: 'Regex', + currentValue: 'abc', + defaultValue: '.*', + onSave: (_) async => saved = true, + ); + await tester.pumpAndSettle(); + await tester.tap(_saveButton()); + await tester.pumpAndSettle(); + + expect(saved, isTrue); + expect(find.byType(AlertDialog), findsNothing); + }); + + testWidgets('disposed settings save context does not present late feedback', (tester) async { + final context = await _pumpHost(tester); + final saveGate = Completer(); + + showRegexInputDialog( + context: context, + title: 'Regex', + currentValue: 'abc', + defaultValue: '.*', + onSave: (_) async { + await saveGate.future; + throw PlatformException(code: 'late_write_failure'); + }, + ); + await tester.pumpAndSettle(); + await tester.tap(_saveButton()); + await tester.pump(); + await tester.pumpWidget(const SizedBox.shrink()); + saveGate.complete(); + await tester.pump(); + + expect(find.text(t.settings.saveFailed), findsNothing); + expect(tester.takeException(), isNull); + }); } + +Future _pumpHost(WidgetTester tester) async { + late BuildContext context; + await tester.pumpWidget( + TranslationProvider( + child: MaterialApp( + home: Scaffold( + body: Builder( + builder: (hostContext) { + context = hostContext; + return const SizedBox.shrink(); + }, + ), + ), + ), + ), + ); + return context; +} + +Finder _saveButton() => find.widgetWithText(DialogActionButton, t.common.save); diff --git a/test/scripts/generate_ducet_ranks_test.dart b/test/scripts/generate_ducet_ranks_test.dart new file mode 100644 index 00000000..eb93d51d --- /dev/null +++ b/test/scripts/generate_ducet_ranks_test.dart @@ -0,0 +1,329 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:crypto/crypto.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../scripts/generate_ducet_ranks.dart'; + +void main() { + late Directory temporaryDirectory; + + setUp(() async { + temporaryDirectory = await Directory.systemTemp.createTemp('plezy_ducet_test_'); + }); + + tearDown(() async { + if (await temporaryDirectory.exists()) { + await temporaryDirectory.delete(recursive: true); + } + }); + + test('pins immutable Unicode and CLDR source descriptors', () { + expect(allKeysSource.url, 'https://www.unicode.org/Public/UCA/13.0.0/allkeys.txt'); + expect(allKeysSource.sha256Digest, 'a3255d45b7af97f4dc14fb8364d7573b434425e5c58cacf00d16901ce081c78d'); + expect(allKeysSource.bundledFileName, 'allkeys-13.0.0.txt.gz'); + expect(allKeysSource.licenseUrl, 'https://www.unicode.org/license.txt'); + expect( + fractionalUcaSource.url, + 'https://raw.githubusercontent.com/unicode-org/cldr/' + '651afecf9ccf1541a49306993e8210fa2209aa0b/common/uca/FractionalUCA.txt', + ); + expect(fractionalUcaSource.sha256Digest, 'a6144d0c8c19cc899a5d2f48fbc14e3e31e819049a73aa86b67111f1f3f81637'); + expect(fractionalUcaSource.bundledFileName, 'FractionalUCA-651afecf9ccf1541a49306993e8210fa2209aa0b.txt.gz'); + expect(fractionalUcaSource.licenseUrl, contains('/651afecf9ccf1541a49306993e8210fa2209aa0b/LICENSE')); + }); + + test('bundled gzip inputs have deterministic normalized headers and bytes', () { + final allKeys = File('scripts/data/${allKeysSource.bundledFileName}').readAsBytesSync(); + final fractional = File('scripts/data/${fractionalUcaSource.bundledFileName}').readAsBytesSync(); + + expect(allKeys.take(8), [0x1F, 0x8B, 0x08, 0, 0, 0, 0, 0]); + expect(fractional.take(8), [0x1F, 0x8B, 0x08, 0, 0, 0, 0, 0]); + expect(sha256.convert(allKeys).toString(), '744040b99e266f9ec599744e267091c159369a36f6ca7558c12a9eb3e039575f'); + expect(sha256.convert(fractional).toString(), 'edc486bae663abf83d18c9006d08c1e8bb19986810cf8ab663fa33bee6d22275'); + }); + + test('dense lookup stores rank plus one with a zero sentinel', () { + final ranks = buildDenseRankLookup([0x41, 0x24, 0x5C]); + + expect(ranks.length, 0x10000); + expect(ranks.codeUnitAt(0x41), 1); + expect(ranks.codeUnitAt(0x24), 2); + expect(ranks.codeUnitAt(0x5C), 3); + expect(ranks.codeUnitAt(0x42), 0); + }); + + test('dense lookup rejects duplicate, out-of-BMP, and overflowing orders', () { + expect(() => buildDenseRankLookup([0x41, 0x41]), throwsStateError); + expect(() => buildDenseRankLookup([-1]), throwsRangeError); + expect(() => buildDenseRankLookup([0x10000]), throwsRangeError); + expect(() => buildDenseRankLookup(List.generate(0x10000, (index) => index)), throwsStateError); + }); + + test('parse and render seams are deterministic and escape Dart interpolation characters', () { + const allKeysText = ''' +0041 ; [.0100.0020.0002] +30A2 ; [.0200.0020.000F] +3042 ; [.0200.0020.000D] +'''; + const fractionalText = '[radical 1=โผ€ไธ€:ไธ€ไธ]'; + + final firstAllKeys = parseAllKeys(allKeysText); + final secondAllKeys = parseAllKeys(allKeysText); + final (firstCjk, firstKangxi) = parseRadicals(fractionalText); + final (secondCjk, secondKangxi) = parseRadicals(fractionalText); + final firstOrder = buildOrder(firstAllKeys, firstCjk); + final secondOrder = buildOrder(secondAllKeys, secondCjk); + + expect(firstOrder, secondOrder); + expect(renderDucetOrder(firstOrder, firstKangxi), renderDucetOrder(secondOrder, secondKangxi)); + + final ranksWithSpecialCodeUnits = List.generate(0x5C, (index) => 0x1000 + index); + final rendered = renderDucetOrder(ranksWithSpecialCodeUnits, const {}); + expect(rendered, contains(r"\'")); + expect(rendered, contains(r'\\')); + expect(rendered, contains(r'\$')); + }); + + test('explicit inputs are both verified before parsing and writing', () async { + const allKeysText = '0041 ; [.0100.0020.0002]\n'; + const fractionalText = '[radical 1=โผ€ไธ€:ไธ€]\n'; + final allKeysFile = File('${temporaryDirectory.path}/allkeys.txt')..writeAsStringSync(allKeysText); + final fractionalFile = File('${temporaryDirectory.path}/FractionalUCA.txt')..writeAsStringSync(fractionalText); + final output = File('${temporaryDirectory.path}/ducet_order.dart')..writeAsStringSync('old output'); + var downloads = 0; + + await generateDucetRanks( + useBundledSources: false, + explicitAllKeys: allKeysFile, + explicitFractionalUca: fractionalFile, + output: output, + allKeysDescriptor: descriptorFor('allkeys', allKeysText), + fractionalUcaDescriptor: descriptorFor('fractional', fractionalText), + downloader: (_) async { + downloads++; + throw StateError('network must not be used'); + }, + ); + + expect(downloads, 0); + expect(output.readAsStringSync(), contains('const String _ducetRanks =')); + expect(output.readAsStringSync(), isNot(contains('_buildRanks'))); + }); + + test('rejects an explicit digest mismatch without replacing output', () async { + final allKeysFile = File('${temporaryDirectory.path}/allkeys.txt')..writeAsStringSync('tampered'); + final fractionalFile = File('${temporaryDirectory.path}/FractionalUCA.txt')..writeAsStringSync('fractional'); + final output = File('${temporaryDirectory.path}/ducet_order.dart')..writeAsStringSync('old output'); + var writerCalled = false; + + await expectLater( + generateDucetRanks( + useBundledSources: false, + explicitAllKeys: allKeysFile, + explicitFractionalUca: fractionalFile, + output: output, + allKeysDescriptor: descriptorFor('allkeys', 'expected'), + fractionalUcaDescriptor: descriptorFor('fractional', 'fractional'), + writer: (_, _) => writerCalled = true, + ), + throwsA(isA()), + ); + + expect(writerCalled, isFalse); + expect(output.readAsStringSync(), 'old output'); + expect(allKeysFile.readAsStringSync(), 'tampered'); + }); + + test('rejects an invalid cached source without downloading or replacing files', () async { + final cache = Directory('${temporaryDirectory.path}/cache')..createSync(); + final allKeysDescriptor = descriptorFor('allkeys', 'expected allkeys'); + final fractionalDescriptor = descriptorFor('fractional', 'fractional'); + final cachedAllKeys = File('${cache.path}/${allKeysDescriptor.cacheFileName}')..writeAsStringSync('tampered cache'); + final output = File('${temporaryDirectory.path}/ducet_order.dart')..writeAsStringSync('old output'); + var downloads = 0; + + await expectLater( + generateDucetRanks( + useBundledSources: false, + cacheDirectory: cache, + output: output, + allKeysDescriptor: allKeysDescriptor, + fractionalUcaDescriptor: fractionalDescriptor, + downloader: (_) async { + downloads++; + return response(HttpStatus.ok, utf8.encode('unused')); + }, + ), + throwsA(isA()), + ); + + expect(downloads, 0); + expect(cachedAllKeys.readAsStringSync(), 'tampered cache'); + expect(output.readAsStringSync(), 'old output'); + }); + + test('rejects HTTP status before parsing, caching, or replacing output', () async { + final cache = Directory('${temporaryDirectory.path}/cache')..createSync(); + final output = File('${temporaryDirectory.path}/ducet_order.dart')..writeAsStringSync('old output'); + + await expectLater( + generateDucetRanks( + useBundledSources: false, + cacheDirectory: cache, + output: output, + allKeysDescriptor: descriptorFor('allkeys', 'allkeys'), + fractionalUcaDescriptor: descriptorFor('fractional', 'fractional'), + downloader: (_) async => response(HttpStatus.notFound, utf8.encode('not found')), + ), + throwsA(isA().having((error) => error.message, 'message', contains('HTTP 404'))), + ); + + expect(cache.listSync(), isEmpty); + expect(output.readAsStringSync(), 'old output'); + }); + + test('a rejected second download preserves the first cache and output', () async { + const allKeysText = '0041 ; [.0100.0020.0002]\n'; + const fractionalText = '[radical 1=โผ€ไธ€:ไธ€]\n'; + final cache = Directory('${temporaryDirectory.path}/cache')..createSync(); + final marker = File('${cache.path}/marker')..writeAsStringSync('keep'); + final output = File('${temporaryDirectory.path}/ducet_order.dart')..writeAsStringSync('old output'); + var request = 0; + + await expectLater( + generateDucetRanks( + useBundledSources: false, + cacheDirectory: cache, + output: output, + allKeysDescriptor: descriptorFor('allkeys', allKeysText), + fractionalUcaDescriptor: descriptorFor('fractional', fractionalText), + downloader: (_) async { + request++; + return response(HttpStatus.ok, utf8.encode(request == 1 ? allKeysText : 'tampered fractional')); + }, + ), + throwsA(isA()), + ); + + expect(request, 2); + expect(cache.listSync().map((entity) => entity.path).toList(), [marker.path]); + expect(marker.readAsStringSync(), 'keep'); + expect(output.readAsStringSync(), 'old output'); + }); + + test('parse rejection leaves verified inputs, caches, and output untouched', () async { + const duplicateAllKeys = ''' +0041 ; [.0100.0020.0002] +0041 ; [.0101.0020.0002] +'''; + const fractionalText = '[radical 1=โผ€ไธ€:ไธ€]\n'; + final allKeysFile = File('${temporaryDirectory.path}/allkeys.txt')..writeAsStringSync(duplicateAllKeys); + final fractionalFile = File('${temporaryDirectory.path}/FractionalUCA.txt')..writeAsStringSync(fractionalText); + final cache = Directory('${temporaryDirectory.path}/cache')..createSync(); + final marker = File('${cache.path}/marker')..writeAsStringSync('keep'); + final output = File('${temporaryDirectory.path}/ducet_order.dart')..writeAsStringSync('old output'); + + await expectLater( + generateDucetRanks( + useBundledSources: false, + explicitAllKeys: allKeysFile, + explicitFractionalUca: fractionalFile, + cacheDirectory: cache, + output: output, + allKeysDescriptor: descriptorFor('allkeys', duplicateAllKeys), + fractionalUcaDescriptor: descriptorFor('fractional', fractionalText), + ), + throwsFormatException, + ); + + expect(allKeysFile.readAsStringSync(), duplicateAllKeys); + expect(fractionalFile.readAsStringSync(), fractionalText); + expect(cache.listSync().map((entity) => entity.path).toList(), [marker.path]); + expect(output.readAsStringSync(), 'old output'); + }); + + test('default bundled generation is deterministic and never downloads', () async { + final output = File('${temporaryDirectory.path}/ducet_order.dart'); + var downloads = 0; + String? first; + String? second; + Future failDownloader(Uri _) async { + downloads++; + throw StateError('bundled generation must not use the network'); + } + + await generateDucetRanks(output: output, downloader: failDownloader, writer: (_, contents) => first = contents); + await generateDucetRanks(output: output, downloader: failDownloader, writer: (_, contents) => second = contents); + + expect(downloads, 0); + expect(first, isNotNull); + expect(second, first); + expect(first, File('lib/data/ducet_order.dart').readAsStringSync()); + }); + + test('tampered bundled gzip fails before replacing output', () async { + const allKeysText = '0041 ; [.0100.0020.0002]\n'; + const fractionalText = '[radical 1=โผ€ไธ€:ไธ€]\n'; + final bundled = Directory('${temporaryDirectory.path}/bundled')..createSync(); + final allKeysDescriptor = descriptorFor('allkeys', allKeysText); + final fractionalDescriptor = descriptorFor('fractional', fractionalText); + File('${bundled.path}/${allKeysDescriptor.bundledFileName}').writeAsBytesSync(const [0x1F, 0x8B, 0x08, 0x00, 0x00]); + writeBundledSource(bundled, fractionalDescriptor, fractionalText); + final output = File('${temporaryDirectory.path}/ducet_order.dart')..writeAsStringSync('old output'); + + await expectLater( + generateDucetRanks( + bundledSourceDirectory: bundled, + output: output, + allKeysDescriptor: allKeysDescriptor, + fractionalUcaDescriptor: fractionalDescriptor, + ), + throwsA(isA()), + ); + + expect(output.readAsStringSync(), 'old output'); + }); + + test('tampered decompressed bundled bytes fail digest before replacing output', () async { + const allKeysText = '0041 ; [.0100.0020.0002]\n'; + const fractionalText = '[radical 1=โผ€ไธ€:ไธ€]\n'; + final bundled = Directory('${temporaryDirectory.path}/bundled')..createSync(); + final allKeysDescriptor = descriptorFor('allkeys', allKeysText); + final fractionalDescriptor = descriptorFor('fractional', fractionalText); + writeBundledSource(bundled, allKeysDescriptor, 'tampered raw bytes'); + writeBundledSource(bundled, fractionalDescriptor, fractionalText); + final output = File('${temporaryDirectory.path}/ducet_order.dart')..writeAsStringSync('old output'); + + await expectLater( + generateDucetRanks( + bundledSourceDirectory: bundled, + output: output, + allKeysDescriptor: allKeysDescriptor, + fractionalUcaDescriptor: fractionalDescriptor, + ), + throwsA( + isA().having((error) => error.message, 'message', contains('SHA-256 mismatch')), + ), + ); + + expect(output.readAsStringSync(), 'old output'); + }); +} + +SourceDescriptor descriptorFor(String name, String contents) => SourceDescriptor( + name: name, + url: 'https://example.test/$name', + bundledFileName: '$name.txt.gz', + cacheFileName: '$name.txt', + sha256Digest: sha256.convert(utf8.encode(contents)).toString(), + licenseUrl: 'https://example.test/license', +); + +void writeBundledSource(Directory directory, SourceDescriptor descriptor, String contents) { + File('${directory.path}/${descriptor.bundledFileName}').writeAsBytesSync(gzip.encode(utf8.encode(contents))); +} + +SourceDownloadResponse response(int statusCode, List bytes) => + SourceDownloadResponse(statusCode: statusCode, bytes: Stream>.value(bytes)); diff --git a/test/scripts/generate_hid_key_labels_test.dart b/test/scripts/generate_hid_key_labels_test.dart new file mode 100644 index 00000000..1031f5d4 --- /dev/null +++ b/test/scripts/generate_hid_key_labels_test.dart @@ -0,0 +1,91 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +import '../../scripts/generate_hid_key_labels.dart'; + +void main() { + late String validSource; + + setUpAll(() async { + validSource = await File(defaultHidKeyLabelsInput).readAsString(); + }); + + test('parse and render are deterministic and reproduce the checked-in artifact', () async { + final first = renderHidKeyLabels(parseHidKeyLabelsCatalog(validSource)); + final second = renderHidKeyLabels(parseHidKeyLabelsCatalog(validSource)); + + expect(second, first); + expect(first, await File(defaultHidKeyLabelsOutput).readAsString()); + }); + + test('rejects invalid schema, empty groups, group names, keys, labels, and IDs', () { + _expectInvalid(validSource, (catalog) => catalog['schemaVersion'] = 2); + _expectInvalid(validSource, (catalog) => catalog['groups'] = []); + _expectInvalid(validSource, (catalog) => _group(catalog, 0)['name'] = ' '); + _expectInvalid(validSource, (catalog) => _group(catalog, 0)['keys'] = []); + _expectInvalid(validSource, (catalog) => _key(catalog, 0, 0)['label'] = ''); + _expectInvalid(validSource, (catalog) => _key(catalog, 0, 0)['id'] = '0000001'); + _expectInvalid(validSource, (catalog) => _key(catalog, 0, 0)['id'] = '0000001A'); + }); + + test('rejects globally duplicate or noncanonical numeric IDs', () { + _expectInvalid(validSource, (catalog) => _key(catalog, 0, 1)['id'] = _key(catalog, 0, 0)['id']); + _expectInvalid(validSource, (catalog) => _key(catalog, 0, 1)['id'] = '0000000f'); + _expectInvalid(validSource, (catalog) => _key(catalog, 1, 0)['id'] = '0000000f'); + }); + + test('escapes controls in labels that require double-quoted Dart literals', () { + const catalog = HidKeyCatalog( + groups: [ + HidKeyGroup( + name: 'Test', + keys: [HidKeyLabel(id: '00000001', label: "Player's\nKey")], + ), + ], + ); + + expect(renderHidKeyLabels(catalog), contains("\"Player's\\nKey\"")); + }); + + test('invalid input fails before the existing output is replaced', () async { + final directory = await Directory.systemTemp.createTemp('plezy_hid_generator_test.'); + addTearDown(() => directory.delete(recursive: true)); + final input = File('${directory.path}/invalid.json'); + final output = File('${directory.path}/output.dart'); + await input.writeAsString('{"schemaVersion":1,"groups":[]}'); + await output.writeAsString('sentinel'); + + await expectLater(generateHidKeyLabels(input.path, output.path), throwsA(isA())); + expect(await output.readAsString(), 'sentinel'); + }); + + test('atomic writer replaces the complete destination', () async { + final directory = await Directory.systemTemp.createTemp('plezy_hid_atomic_test.'); + addTearDown(() => directory.delete(recursive: true)); + final output = File('${directory.path}/output.dart'); + await output.writeAsString('old'); + + await writeFileAtomically(output.path, 'new bytes\n'); + + expect(await output.readAsString(), 'new bytes\n'); + expect(directory.listSync().where((entry) => entry.path.contains('.tmp.')), isEmpty); + }); +} + +void _expectInvalid(String source, void Function(Map catalog) mutate) { + final catalog = (jsonDecode(source) as Map).cast(); + mutate(catalog); + expect(() => parseHidKeyLabelsCatalog(jsonEncode(catalog)), throwsA(isA())); +} + +Map _group(Map catalog, int index) { + final groups = catalog['groups']! as List; + return (groups[index]! as Map).cast(); +} + +Map _key(Map catalog, int groupIndex, int keyIndex) { + final keys = _group(catalog, groupIndex)['keys']! as List; + return (keys[keyIndex]! as Map).cast(); +} diff --git a/test/scripts/generate_iso_639_data_test.dart b/test/scripts/generate_iso_639_data_test.dart new file mode 100644 index 00000000..a6a90b22 --- /dev/null +++ b/test/scripts/generate_iso_639_data_test.dart @@ -0,0 +1,98 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +import '../../scripts/generate_iso_639_data.dart'; + +void main() { + late String validSource; + + setUpAll(() async { + validSource = await File(defaultIso639Input).readAsString(); + }); + + test('parse and render are deterministic and reproduce the checked-in artifact', () async { + final first = renderIso639Data(parseIso639Catalog(validSource)); + final second = renderIso639Data(parseIso639Catalog(validSource)); + + expect(second, first); + expect(first, await File(defaultIso639Output).readAsString()); + }); + + test('rejects invalid schema, keys, primary consistency, names, and field shapes', () { + _expectInvalid(validSource, (catalog) => catalog['schemaVersion'] = 2); + _expectInvalid(validSource, (catalog) => catalog['languages'] = {}); + _expectInvalid(validSource, (catalog) => _entry(catalog, 'aa')['primary'] = 'ab'); + _expectInvalid(validSource, (catalog) => _entry(catalog, 'aa')['terminology'] = 'AAR'); + _expectInvalid(validSource, (catalog) => _entry(catalog, 'bo')['bibliographic'] = 'TIB'); + _expectInvalid(validSource, (catalog) => _entry(catalog, 'aa')['name'] = ' '); + + _expectInvalid(validSource, (catalog) { + final languages = _languages(catalog); + languages['a'] = languages.remove('aa'); + }); + }); + + test('rejects duplicate aliases and noncanonical primary ordering', () { + _expectInvalid( + validSource, + (catalog) => _entry(catalog, 'ab')['terminology'] = _entry(catalog, 'aa')['terminology'], + ); + _expectInvalid( + validSource, + (catalog) => _entry(catalog, 'bo')['bibliographic'] = _entry(catalog, 'aa')['terminology'], + ); + _expectInvalid(validSource, (catalog) { + final languages = _languages(catalog); + final first = languages.remove('aa'); + languages['aa'] = first; + }); + }); + + test('escapes controls in names that require double-quoted Dart literals', () { + const catalog = Iso639Catalog( + entries: [Iso639CatalogEntry(primary: 'aa', terminology: 'aaa', bibliographic: null, name: "People's\nLanguage")], + ); + + expect(renderIso639Data(catalog), contains("\"People's\\nLanguage\"")); + }); + + test('invalid input fails before the existing output is replaced', () async { + final directory = await Directory.systemTemp.createTemp('plezy_iso_generator_test.'); + addTearDown(() => directory.delete(recursive: true)); + final input = File('${directory.path}/invalid.json'); + final output = File('${directory.path}/output.dart'); + await input.writeAsString('{"schemaVersion":1,"languages":{}}'); + await output.writeAsString('sentinel'); + + await expectLater(generateIso639Data(input.path, output.path), throwsA(isA())); + expect(await output.readAsString(), 'sentinel'); + }); + + test('atomic writer replaces the complete destination', () async { + final directory = await Directory.systemTemp.createTemp('plezy_iso_atomic_test.'); + addTearDown(() => directory.delete(recursive: true)); + final output = File('${directory.path}/output.dart'); + await output.writeAsString('old'); + + await writeFileAtomically(output.path, 'new bytes\n'); + + expect(await output.readAsString(), 'new bytes\n'); + expect(directory.listSync().where((entry) => entry.path.contains('.tmp.')), isEmpty); + }); +} + +void _expectInvalid(String source, void Function(Map catalog) mutate) { + final catalog = (jsonDecode(source) as Map).cast(); + mutate(catalog); + expect(() => parseIso639Catalog(jsonEncode(catalog)), throwsA(isA())); +} + +Map _languages(Map catalog) { + return (catalog['languages']! as Map).cast(); +} + +Map _entry(Map catalog, String code) { + return (_languages(catalog)[code]! as Map).cast(); +} diff --git a/test/services/data_aggregation_bridge_test.dart b/test/services/data_aggregation_bridge_test.dart index 780951fd..9e4a4567 100644 --- a/test/services/data_aggregation_bridge_test.dart +++ b/test/services/data_aggregation_bridge_test.dart @@ -150,7 +150,7 @@ void main() { 'SearchResult': [ { 'score': 100, - 'Metadata': {'ratingKey': 'plex-movie', 'type': 'movie', 'title': 'The Boys in the Boat'}, + 'Metadata': {'ratingKey': 'plex-movie', 'type': 'movie', 'title': 'Spider Man Returns'}, }, ], }, @@ -169,7 +169,7 @@ void main() { if (req.url.path == '/Items') { return _json({ 'Items': [ - {'Id': 'jf-show', 'Type': 'Series', 'Name': 'The Boys'}, + {'Id': 'jf-show', 'Type': 'Series', 'Name': 'Spiderโ€‘Man'}, ], }); } @@ -179,17 +179,19 @@ void main() { addTearDown(jellyfinClient.close); manager.debugRegisterJellyfinClientForTesting(jellyfinClient); - final results = await service.searchAcrossServers('The Boys', limit: 1); + final results = await service.searchAcrossServers('Spider Man', limit: 1); expect(results.map((item) => item.id), ['jf-show']); + expect(plexRequests.single.queryParameters['query'], 'Spider Man'); expect(plexRequests.single.queryParameters['limit'], '100'); expect(plexRequests.single.queryParameters['searchTypes'], 'movies,tv,music'); // Jellyfin search fans out to /Items plus a best-effort /Artists call // (500 above โ†’ treated as empty). final jfItemsRequest = jellyfinRequests.singleWhere((url) => url.path == '/Items'); expect(jfItemsRequest.queryParameters['Limit'], '100'); + expect(jfItemsRequest.queryParameters['SearchTerm'], 'Spider Man'); final jfArtistsRequest = jellyfinRequests.singleWhere((url) => url.path == '/Artists'); - expect(jfArtistsRequest.queryParameters['searchTerm'], 'The Boys'); + expect(jfArtistsRequest.queryParameters['searchTerm'], 'Spider Man'); }); test('getOnDeckFromAllServers forwards preview limit to clients', () async { diff --git a/test/services/keyboard_shortcuts_service_test.dart b/test/services/keyboard_shortcuts_service_test.dart index 67097747..dcaf6a0e 100644 --- a/test/services/keyboard_shortcuts_service_test.dart +++ b/test/services/keyboard_shortcuts_service_test.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:convert'; import 'package:flutter/services.dart'; @@ -6,8 +7,12 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:plezy/models/hotkey_model.dart'; import 'package:plezy/mpv/mpv.dart'; import 'package:plezy/services/keyboard_shortcuts_service.dart'; +import 'package:plezy/services/base_shared_preferences_service.dart'; import 'package:plezy/services/settings_service.dart'; import 'package:plezy/services/video_filter_manager.dart'; +import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart'; +import 'package:shared_preferences_platform_interface/shared_preferences_async_platform_interface.dart'; +import 'package:shared_preferences_platform_interface/types.dart'; import '../test_helpers/prefs.dart'; @@ -87,6 +92,97 @@ void main() { expect(service.getHotkey('play_pause')?.key, PhysicalKeyboardKey.space); expect(SettingsService.instance.prefs.containsKey(SettingsService.keyboardHotkeys.key), isFalse); }); + + test('explicit unassignment survives restart and reset restores dispatch', () async { + final service = await KeyboardShortcutsService.getInstance(); + await service.setHotkey('play_pause', null); + await service.setHotkey('volume_up', const HotKey(key: PhysicalKeyboardKey.keyQ)); + + final stored = + json.decode(SettingsService.instance.prefs.getString(SettingsService.keyboardHotkeys.key)!) + as Map; + expect(stored['play_pause'], {'disabled': true}); + expect(service.getHotkey('play_pause'), isNull); + expect(service.getActionForHotkey(const HotKey(key: PhysicalKeyboardKey.space)), isNull); + + service.dispose(); + SettingsService.resetForTesting(); + BaseSharedPreferencesService.resetForTesting(); + + final reloaded = await KeyboardShortcutsService.getInstance(); + addTearDown(reloaded.dispose); + expect(reloaded.getHotkey('play_pause'), isNull); + expect(reloaded.getHotkey('volume_up')?.key, PhysicalKeyboardKey.keyQ); + expect(reloaded.getHotkey('volume_down')?.key, PhysicalKeyboardKey.arrowDown); + + var playPauseCalls = 0; + final player = _FakePlayer(); + KeyEventResult dispatch() { + return reloaded.handleVideoPlayerKeyEvent( + const KeyDownEvent( + physicalKey: PhysicalKeyboardKey.space, + logicalKey: LogicalKeyboardKey.space, + timeStamp: Duration.zero, + ), + player, + null, + null, + null, + null, + null, + null, + canControlPlayback: true, + canNavigateMediaItems: true, + onPlayPause: () => playPauseCalls++, + ); + } + + expect(dispatch(), KeyEventResult.ignored); + expect(playPauseCalls, 0); + await reloaded.resetToDefaults(); + expect(dispatch(), KeyEventResult.handled); + expect(playPauseCalls, 1); + + final resetStored = + json.decode(SettingsService.instance.prefs.getString(SettingsService.keyboardHotkeys.key)!) + as Map; + expect(resetStored['play_pause'], {'key': '0007002c', 'modifiers': []}); + }); + + test('serialized writes preserve rapid edits and recover after a failure', () async { + final preferences = _HotkeyPreferences(const {}); + SharedPreferencesAsyncPlatform.instance = preferences; + SettingsService.resetForTesting(); + BaseSharedPreferencesService.resetForTesting(); + final service = await KeyboardShortcutsService.getInstance(); + addTearDown(service.dispose); + + preferences.blockNextHotkeyWrite(); + final first = service.setHotkey('play_pause', const HotKey(key: PhysicalKeyboardKey.keyQ)); + await preferences.blocked; + final second = service.setHotkey('volume_up', const HotKey(key: PhysicalKeyboardKey.keyW)); + await Future.delayed(Duration.zero); + + expect(preferences.hotkeyWriteCount, 1); + expect(service.getHotkey('play_pause')?.key, PhysicalKeyboardKey.space); + preferences.release(); + await Future.wait([first, second]); + + expect(preferences.hotkeyWriteCount, 2); + expect(service.getHotkey('play_pause')?.key, PhysicalKeyboardKey.keyQ); + expect(service.getHotkey('volume_up')?.key, PhysicalKeyboardKey.keyW); + + preferences.failNextHotkeyWrite = true; + await expectLater( + service.setHotkey('play_pause', const HotKey(key: PhysicalKeyboardKey.keyE)), + throwsA(isA()), + ); + expect(service.getHotkey('play_pause')?.key, PhysicalKeyboardKey.keyQ); + + await service.setHotkey('volume_down', const HotKey(key: PhysicalKeyboardKey.keyR)); + expect(service.getHotkey('play_pause')?.key, PhysicalKeyboardKey.keyQ); + expect(service.getHotkey('volume_down')?.key, PhysicalKeyboardKey.keyR); + }); }); testWidgets('Ctrl+S takes a screenshot once while held', (tester) async { @@ -597,3 +693,41 @@ class _FakePlayer implements Player { @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } + +final class _HotkeyPreferences extends InMemorySharedPreferencesAsync { + _HotkeyPreferences(super.data) : super.withData(); + + Completer? _entered; + Completer? _release; + int hotkeyWriteCount = 0; + bool failNextHotkeyWrite = false; + + Future get blocked => _entered!.future; + + void blockNextHotkeyWrite() { + _entered = Completer(); + _release = Completer(); + } + + void release() { + final release = _release; + if (release != null && !release.isCompleted) release.complete(); + } + + @override + Future setString(String key, String value, SharedPreferencesOptions options) async { + if (key == SettingsService.keyboardHotkeys.key) { + hotkeyWriteCount++; + if (failNextHotkeyWrite) { + failNextHotkeyWrite = false; + throw PlatformException(code: 'write_failed'); + } + final entered = _entered; + if (entered != null && !entered.isCompleted) { + entered.complete(); + await _release!.future; + } + } + return super.setString(key, value, options); + } +} diff --git a/test/services/plex_client_http_contract_test.dart b/test/services/plex_client_http_contract_test.dart index ee304a8c..2e080e6c 100644 --- a/test/services/plex_client_http_contract_test.dart +++ b/test/services/plex_client_http_contract_test.dart @@ -13,6 +13,7 @@ import 'package:plezy/media/media_kind.dart'; import 'package:plezy/services/plex_api_cache.dart'; import 'package:plezy/services/plex_client.dart'; import 'package:plezy/utils/active_client_scope.dart'; +import 'package:plezy/utils/media_server_http_client.dart'; import '../test_helpers/backend_client_fixtures.dart'; import '../test_helpers/media_items.dart'; @@ -268,6 +269,29 @@ void main() { expect(activities.last.cancellable, isTrue); }); + test('activity fetch abort reaches transport and preserves cancellation identity', () async { + final transport = _AbortAwareActivitiesClient(); + final client = testPlexClient( + serverId: publicServerId, + profileScopeId: defaultProfileScopeId, + httpClient: transport, + prioritizedEndpoints: const ['https://plex.example.com', 'https://plex-fallback.example.com'], + ); + addTearDown(client.close); + final abort = AbortController(); + + final activities = client.getActivities(abort: abort); + await transport.requestStarted.future; + abort.abort(); + + await expectLater( + activities, + throwsA(isA().having((error) => error.isCancellation, 'isCancellation', isTrue)), + ); + await expectLater(transport.abortObserved.future, completes); + expect(transport.requestCount, 1); + }); + test('metadata edit preserves locked fields and removed tag wire format', () async { http.Request? captured; final client = makeClient((request) async { diff --git a/test/services/settings_export_service_test.dart b/test/services/settings_export_service_test.dart index b24fc8b4..41920af9 100644 --- a/test/services/settings_export_service_test.dart +++ b/test/services/settings_export_service_test.dart @@ -5,8 +5,11 @@ import 'package:file_picker/file_picker.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:package_info_plus/package_info_plus.dart'; +import 'package:plezy/models/shader_preset.dart'; import 'package:plezy/services/base_shared_preferences_service.dart'; import 'package:plezy/services/settings_export_service.dart'; +import 'package:plezy/services/settings_service.dart'; +import 'package:plezy/services/trackers/tracker_constants.dart'; import '../test_helpers/prefs.dart'; @@ -34,14 +37,16 @@ void main() { }); group('portable settings registry', () { - test('exports every supported storage type and strips only active-user library scope', () async { + test('exports scalar and JSON-backed values and strips only the active-user library scope', () async { final prefs = await BaseSharedPreferencesService.sharedCache(); await prefs.setBool('enable_hardware_decoding', true); await prefs.setInt('seek_time_small', 42); await prefs.setDouble('volume', 75.5); await prefs.setString('preferred_video_codec', 'h264'); - await prefs.setStringList('user_alice_library_order', const ['movies', 'shows']); - await prefs.setStringList('user_bob_library_order', const ['private']); + await prefs.setString('user_alice_hidden_libraries', jsonEncode(['server-a:hidden'])); + await prefs.setString('user_alice_library_order', jsonEncode(['movies', 'shows'])); + await prefs.setString('user_bob_hidden_libraries', jsonEncode(['private-hidden'])); + await prefs.setString('user_bob_library_order', jsonEncode(['private-order'])); final out = SettingsExportService.buildExportMap(prefs, currentUserUuid: 'alice', appVersion: '1.2.3'); final exported = out['prefs'] as Map; @@ -53,11 +58,16 @@ void main() { expect(exported['seek_time_small'], {'type': 'int', 'value': 42}); expect(exported['volume'], {'type': 'double', 'value': 75.5}); expect(exported['preferred_video_codec'], {'type': 'string', 'value': 'h264'}); - expect(exported['library_order'], { - 'type': 'stringList', - 'value': ['movies', 'shows'], + expect(exported['hidden_libraries'], { + 'type': 'string', + 'value': jsonEncode(['server-a:hidden']), }); - expect(jsonEncode(out), isNot(contains('private'))); + expect(exported['library_order'], { + 'type': 'string', + 'value': jsonEncode(['movies', 'shows']), + }); + expect(jsonEncode(out), isNot(contains('private-hidden'))); + expect(jsonEncode(out), isNot(contains('private-order'))); }); test('excludes device-local download roots while preserving portable download controls', () async { @@ -78,6 +88,32 @@ void main() { expect(encoded, isNot(contains(sourcePath))); }); + test('round-trips a custom shader selection as a portable disabled selection', () async { + const custom = ShaderPreset( + id: 'custom_local-only.glsl', + name: 'Local only', + type: ShaderPresetType.custom, + fileName: 'local-only.glsl', + ); + final prefs = await BaseSharedPreferencesService.sharedCache(); + await prefs.setString('custom_shader_presets', jsonEncode([custom.toJson()])); + await prefs.setString('global_shader_preset', custom.id); + + final export = SettingsExportService.buildExportMap(prefs, currentUserUuid: 'alice'); + final exported = export['prefs'] as Map; + expect(exported['global_shader_preset'], {'type': 'string', 'value': ShaderPreset.none.id}); + expect(exported, isNot(contains('custom_shader_presets'))); + expect(jsonEncode(export), isNot(contains(custom.fileName!))); + + await prefs.clear(); + final result = await SettingsExportService.applyImportMap(export, prefs, currentUserUuid: 'bob'); + + expect(result.keysImported, 1); + expect(result.keysSkipped, 0); + expect(prefs.getString('global_shader_preset'), ShaderPreset.none.id); + expect(prefs.getString('custom_shader_presets'), isNull); + }); + test('fails closed for unknown, credential, account, path, history, and runtime keys', () async { const canaries = ['SEERR-BEARER-CANARY', 'ACCOUNT-ID-CANARY', 'DEVICE-PATH-CANARY', 'RUNTIME-TIME-CANARY']; final prefs = await BaseSharedPreferencesService.sharedCache(); @@ -115,7 +151,7 @@ void main() { test('does not export any user-scoped value without an active user', () async { final prefs = await BaseSharedPreferencesService.sharedCache(); - await prefs.setStringList('user_alice_library_order', const ['movies']); + await prefs.setString('user_alice_library_order', jsonEncode(['movies'])); await prefs.setBool('enable_hdr', true); final exported = SettingsExportService.buildExportMap(prefs)['prefs'] as Map; @@ -169,6 +205,130 @@ void main() { expect(prefs.getBool('enable_hdr'), isNull); }); + test('round-trips both filter modes and IDs for every tracker service', () async { + final prefs = await BaseSharedPreferencesService.sharedCache(); + + for (final mode in TrackerLibraryFilterMode.values) { + await prefs.clear(); + for (final service in TrackerService.values) { + await prefs.setString(SettingsService.trackerFilterModePref(service).key, mode.name); + await prefs.setStringList(SettingsService.trackerFilterIdsPref(service).key, [ + '${service.name}:library-a', + '${service.name}:library-b', + ]); + } + + final export = SettingsExportService.buildExportMap(prefs, currentUserUuid: 'source-user'); + final exported = export['prefs'] as Map; + for (final service in TrackerService.values) { + final modeKey = SettingsService.trackerFilterModePref(service).key; + final idsKey = SettingsService.trackerFilterIdsPref(service).key; + expect(exported[modeKey], {'type': 'string', 'value': mode.name}); + expect(exported[idsKey], { + 'type': 'stringList', + 'value': ['${service.name}:library-a', '${service.name}:library-b'], + }); + } + + await prefs.clear(); + final result = await SettingsExportService.applyImportMap(export, prefs, currentUserUuid: 'target-user'); + + expect(result.keysImported, TrackerService.values.length * 2); + expect(result.keysSkipped, 0); + for (final service in TrackerService.values) { + expect(prefs.getString(SettingsService.trackerFilterModePref(service).key), mode.name); + expect(prefs.getStringList(SettingsService.trackerFilterIdsPref(service).key), [ + '${service.name}:library-a', + '${service.name}:library-b', + ]); + } + } + }); + + test('preserves an empty whitelist so import cannot broaden tracker access', () async { + final prefs = await BaseSharedPreferencesService.sharedCache(); + for (final service in TrackerService.values) { + await prefs.setString( + SettingsService.trackerFilterModePref(service).key, + TrackerLibraryFilterMode.whitelist.name, + ); + await prefs.setStringList(SettingsService.trackerFilterIdsPref(service).key, const []); + } + + final export = SettingsExportService.buildExportMap(prefs, currentUserUuid: 'source-user'); + await prefs.clear(); + final result = await SettingsExportService.applyImportMap(export, prefs, currentUserUuid: 'target-user'); + final settings = await SettingsService.getInstance(); + + expect(result.keysImported, TrackerService.values.length * 2); + expect(result.keysSkipped, 0); + for (final service in TrackerService.values) { + expect(settings.read(SettingsService.trackerFilterModePref(service)), TrackerLibraryFilterMode.whitelist); + expect(settings.read(SettingsService.trackerFilterIdsPref(service)), isEmpty); + expect(settings.isLibraryAllowedForTracker(service, '${service.name}:unlisted'), isFalse); + expect(settings.isLibraryAllowedForTracker(service, null), isFalse); + } + }); + + test('rejects tracker preference keys with unknown service suffixes', () async { + const modeKey = 'tracker_library_filter_mode_future'; + const idsKey = 'tracker_library_filter_ids_future'; + final prefs = await BaseSharedPreferencesService.sharedCache(); + await prefs.setString(modeKey, 'local-mode'); + await prefs.setStringList(idsKey, const ['local-id']); + + final exported = SettingsExportService.buildExportMap(prefs, currentUserUuid: 'alice')['prefs'] as Map; + expect(exported, isNot(contains(modeKey))); + expect(exported, isNot(contains(idsKey))); + + final result = await SettingsExportService.applyImportMap( + { + 'formatVersion': SettingsExportService.formatVersion, + 'prefs': { + modeKey: {'type': 'string', 'value': TrackerLibraryFilterMode.whitelist.name}, + idsKey: { + 'type': 'stringList', + 'value': ['crafted-id'], + }, + }, + }, + prefs, + currentUserUuid: 'alice', + ); + + expect(result.keysImported, 0); + expect(result.keysSkipped, 2); + expect(prefs.getString(modeKey), 'local-mode'); + expect(prefs.getStringList(idsKey), ['local-id']); + }); + + test('normalizes format-v1 hidden and order string lists into JSON string storage', () async { + final prefs = await BaseSharedPreferencesService.sharedCache(); + + final result = await SettingsExportService.applyImportMap( + { + 'formatVersion': 1, + 'prefs': { + 'hidden_libraries': { + 'type': 'stringList', + 'value': ['server-a:hidden'], + }, + 'library_order': { + 'type': 'stringList', + 'value': ['server-b:movies', 'server-a:shows'], + }, + }, + }, + prefs, + currentUserUuid: 'target-user', + ); + + expect(result.keysImported, 2); + expect(result.keysSkipped, 0); + expect(prefs.getString('user_target-user_hidden_libraries'), jsonEncode(['server-a:hidden'])); + expect(prefs.getString('user_target-user_library_order'), jsonEncode(['server-b:movies', 'server-a:shows'])); + }); + test('imports allowlisted values, re-scopes library settings, and skips unsafe entries', () async { const seerrCanary = 'SEERR-IMPORT-CANARY'; final prefs = await BaseSharedPreferencesService.sharedCache(); @@ -184,8 +344,8 @@ void main() { 'enable_hardware_decoding': {'type': 'bool', 'value': true}, 'default_playback_speed': {'type': 'double', 'value': 1}, 'library_order': { - 'type': 'stringList', - 'value': ['movies'], + 'type': 'string', + 'value': jsonEncode(['movies']), }, 'library_sort_movies': {'type': 'string', 'value': '{"key":"titleSort"}'}, 'seerr_session': {'type': 'string', 'value': seerrCanary}, @@ -206,7 +366,7 @@ void main() { expect(result.keysSkipped, 8); expect(prefs.getBool('enable_hardware_decoding'), isTrue); expect(prefs.getDouble('default_playback_speed'), 1.0); - expect(prefs.getStringList('user_alice_library_order'), ['movies']); + expect(prefs.getString('user_alice_library_order'), jsonEncode(['movies'])); expect(prefs.getString('user_alice_library_sort_movies'), '{"key":"titleSort"}'); expect(prefs.getString('seerr_session'), isNull); expect(prefs.getString('user_alice_seerr_session'), isNull); @@ -248,6 +408,26 @@ void main() { expect(prefs.getString('custom_download_path'), isNot(contains(sourcePath))); }); + test('reports an unresolved custom shader selection as skipped', () async { + final prefs = await BaseSharedPreferencesService.sharedCache(); + await prefs.setString('global_shader_preset', ShaderPreset.nvscalerDefault.id); + + final result = await SettingsExportService.applyImportMap( + { + 'formatVersion': SettingsExportService.formatVersion, + 'prefs': { + 'global_shader_preset': {'type': 'string', 'value': 'custom_missing.glsl'}, + }, + }, + prefs, + currentUserUuid: 'alice', + ); + + expect(result.keysImported, 0); + expect(result.keysSkipped, 1); + expect(prefs.getString('global_shader_preset'), ShaderPreset.nvscalerDefault.id); + }); + test('skips malformed or mismatched entries before applying valid mutations', () async { final prefs = await BaseSharedPreferencesService.sharedCache(); @@ -294,7 +474,7 @@ void main() { prefs, currentUserUuid: 'alice', ), - throwsA(isA()), + throwsA(isA()), ); expect(prefs.getBool('enable_hdr'), isFalse); @@ -304,7 +484,8 @@ void main() { test('round-trips portable values across user scopes without account identifiers', () async { final prefs = await BaseSharedPreferencesService.sharedCache(); await prefs.setBool('enable_hardware_decoding', true); - await prefs.setStringList('user_alice_library_order', const ['movies']); + await prefs.setString('user_alice_hidden_libraries', jsonEncode(['server-a:hidden'])); + await prefs.setString('user_alice_library_order', jsonEncode(['server-b:movies'])); final export = SettingsExportService.buildExportMap(prefs, currentUserUuid: 'alice'); expect(jsonEncode(export), isNot(contains('alice'))); @@ -312,11 +493,13 @@ void main() { final result = await SettingsExportService.applyImportMap(export, prefs, currentUserUuid: 'bob'); - expect(result.keysImported, 2); + expect(result.keysImported, 3); expect(result.keysSkipped, 0); expect(prefs.getBool('enable_hardware_decoding'), isTrue); - expect(prefs.getStringList('user_bob_library_order'), ['movies']); - expect(prefs.getStringList('user_alice_library_order'), isNull); + expect(prefs.getString('user_bob_hidden_libraries'), jsonEncode(['server-a:hidden'])); + expect(prefs.getString('user_bob_library_order'), jsonEncode(['server-b:movies'])); + expect(prefs.getString('user_alice_hidden_libraries'), isNull); + expect(prefs.getString('user_alice_library_order'), isNull); }); test('malicious import cannot replace any tvOS database recovery key', () async { @@ -389,7 +572,7 @@ void main() { expect(await SettingsExportService.exportToFile(), isNull); picker.saveError = PlatformException(code: 'save_failed'); - await expectLater(SettingsExportService.exportToFile(), throwsA(isA())); + await expectLater(SettingsExportService.exportToFile(), throwsA(isA())); picker.saveError = null; picker.saveResult = '/tmp/recovered.json'; @@ -432,11 +615,14 @@ void main() { picker.pickResult = FilePickerResult([ PlatformFile(name: 'missing.json', size: 1, path: '/path/that/does/not/exist.json'), ]); - await expectLater(SettingsExportService.importFromFile(), throwsA(isA())); + await expectLater(SettingsExportService.importFromFile(), throwsA(isA())); picker.pickResult = FilePickerResult([PlatformFile(name: 'settings.json', size: 1, bytes: importBytes())]); expect((await SettingsExportService.importFromFile())?.keysImported, 1); expect(picker.pickCalls, 4); + + picker.pickError = PlatformException(code: 'pick_failed'); + await expectLater(SettingsExportService.importFromFile(), throwsA(isA())); }); test('missing active profile rejects before opening the picker', () async { diff --git a/test/services/shader_asset_loader_test.dart b/test/services/shader_asset_loader_test.dart new file mode 100644 index 00000000..1dfa1ffa --- /dev/null +++ b/test/services/shader_asset_loader_test.dart @@ -0,0 +1,193 @@ +import 'dart:io'; + +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:path/path.dart' as path; +import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; +import 'package:plezy/models/shader_preset.dart'; +import 'package:plezy/services/shader_asset_loader.dart'; + +import '../test_helpers/io_fakes.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + late PathProviderPlatform originalPathProvider; + late Directory root; + late Directory supportDirectory; + late File sentinel; + + setUp(() async { + originalPathProvider = PathProviderPlatform.instance; + root = await Directory.systemTemp.createTemp('plezy_shader_asset_loader_test_'); + PathProviderPlatform.instance = FakePathProvider(root); + supportDirectory = Directory(path.join(root.path, 'support'))..createSync(recursive: true); + sentinel = File(path.join(supportDirectory.path, 'sentinel.glsl'))..writeAsStringSync('sentinel'); + ShaderAssetLoader.clearCache(); + }); + + tearDown(() async { + PathProviderPlatform.instance = originalPathProvider; + ShaderAssetLoader.clearCache(); + if (await root.exists()) await root.delete(recursive: true); + }); + + ShaderPreset customPreset(String fileName) { + return ShaderPreset(id: 'custom_$fileName', name: fileName, type: ShaderPresetType.custom, fileName: fileName); + } + + Future> bundledBytes(String assetPath) async { + final data = await rootBundle.load('assets/shaders/$assetPath'); + return data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + } + + Future expectBundledFile(String filePath, String assetPath) async { + expect(await File(filePath).readAsBytes(), await bundledBytes(assetPath)); + } + + test('traversal and absolute names cannot load or delete outside managed directory', () async { + for (final fileName in ['../sentinel.glsl', sentinel.path]) { + expect(await ShaderAssetLoader.getShadersForPreset(customPreset(fileName)), isEmpty); + await ShaderAssetLoader.deleteCustomShader(fileName); + expect(await sentinel.readAsString(), 'sentinel'); + } + }); + + test('repairs stale built-in bytes in the application cache without touching temporary storage', () async { + final cacheFile = File(path.join(root.path, 'cache', 'shaders', 'nvscaler', 'NVScaler.glsl')) + ..createSync(recursive: true) + ..writeAsStringSync('stale'); + final oldTemporaryFile = File(path.join(root.path, 'temp', 'shaders', 'nvscaler', 'NVScaler.glsl')) + ..createSync(recursive: true) + ..writeAsStringSync('old temporary sentinel'); + + final shaders = await ShaderAssetLoader.getShadersForPreset(ShaderPreset.nvscalerDefault); + + expect(shaders, [cacheFile.path]); + await expectBundledFile(shaders.single, 'nvscaler/NVScaler.glsl'); + expect(await oldTemporaryFile.readAsString(), 'old temporary sentinel'); + }); + + test('recovers a truncated built-in final through a complete staged replacement', () async { + final targetDirectory = Directory(path.join(root.path, 'cache', 'shaders', 'nvscaler')) + ..createSync(recursive: true); + final target = File(path.join(targetDirectory.path, 'NVScaler.glsl'))..writeAsBytesSync([1, 2, 3]); + final unrelatedPending = File('${target.path}.pending.interrupted')..writeAsBytesSync([1]); + + final shaders = await ShaderAssetLoader.getNVScalerShaders(); + + expect(shaders, [target.path]); + await expectBundledFile(target.path, 'nvscaler/NVScaler.glsl'); + expect(unrelatedPending.existsSync(), isTrue); + final ownedPending = await targetDirectory + .list() + .where((entry) => entry.path.contains('.pending.') && entry.path != unrelatedPending.path) + .toList(); + expect(ownedPending, isEmpty); + }); + + test('does not return a partial path when final-file promotion fails', () async { + final target = Directory(path.join(root.path, 'cache', 'shaders', 'nvscaler', 'NVScaler.glsl')) + ..createSync(recursive: true); + + expect(await ShaderAssetLoader.getNVScalerShaders(), isEmpty); + + final siblings = await target.parent.list().toList(); + expect(siblings.where((entry) => entry.path.contains('.pending.')), isEmpty); + expect(target.existsSync(), isTrue); + }); + + test('coalesces concurrent built-in loads onto one complete final path', () async { + final results = await Future.wait([ShaderAssetLoader.getNVScalerShaders(), ShaderAssetLoader.getNVScalerShaders()]); + + expect(results[0], results[1]); + expect(results[0], hasLength(1)); + await expectBundledFile(results[0].single, 'nvscaler/NVScaler.glsl'); + final directory = File(results[0].single).parent; + expect((await directory.list().toList()).where((entry) => entry.path.contains('.pending.')), isEmpty); + }); + + test('materializes representative built-in chains in MPV order with bundled bytes', () async { + final nvscaler = await ShaderAssetLoader.getNVScalerShaders(); + final artcnn = await ShaderAssetLoader.getArtCNNShaders( + const ArtCNNConfig(model: ArtCNNModel.c4f16, variant: ArtCNNVariant.denoise), + ); + final anime4k = await ShaderAssetLoader.getAnime4KShaders( + const Anime4KConfig(quality: Anime4KQuality.fast, mode: Anime4KMode.modeB), + ); + + final expected = { + nvscaler.single: 'nvscaler/NVScaler.glsl', + artcnn.single: 'artcnn/ArtCNN_C4F16_DN.glsl', + anime4k[0]: 'anime4k/Anime4K_Clamp_Highlights.glsl', + anime4k[1]: 'anime4k/Anime4K_Restore_CNN_M.glsl', + anime4k[2]: 'anime4k/Anime4K_Upscale_CNN_x2_M.glsl', + anime4k[3]: 'anime4k/Anime4K_AutoDownscalePre_x2.glsl', + }; + expect(anime4k.map(path.basename).toList(), [ + 'Anime4K_Clamp_Highlights.glsl', + 'Anime4K_Restore_CNN_M.glsl', + 'Anime4K_Upscale_CNN_x2_M.glsl', + 'Anime4K_AutoDownscalePre_x2.glsl', + ]); + for (final entry in expected.entries) { + expect(path.isWithin(path.join(root.path, 'cache'), entry.key), isTrue); + await expectBundledFile(entry.key, entry.value); + } + }); + + test('nested and non-GLSL names are rejected without touching matching files', () async { + final customDirectory = Directory(path.join(supportDirectory.path, 'custom_shaders'))..createSync(recursive: true); + final nested = File(path.join(customDirectory.path, 'subdir', 'name.glsl')) + ..createSync(recursive: true) + ..writeAsStringSync('nested'); + final extraExtension = File(path.join(customDirectory.path, 'name.glsl.txt'))..writeAsStringSync('extra'); + + for (final fileName in ['subdir/name.glsl', r'subdir\name.glsl', '.', '..', 'name.glsl.txt', 'name.txt']) { + expect(ShaderAssetLoader.isValidCustomShaderFileName(fileName), isFalse); + expect(await ShaderAssetLoader.getShadersForPreset(customPreset(fileName)), isEmpty); + await ShaderAssetLoader.deleteCustomShader(fileName); + } + + expect(await nested.readAsString(), 'nested'); + expect(await extraExtension.readAsString(), 'extra'); + }); + + test('non-GLSL import fails before creating a managed file', () async { + final source = File(path.join(root.path, 'shader.txt'))..writeAsStringSync('not glsl'); + + await expectLater(ShaderAssetLoader.importCustomShader(source.path), throwsArgumentError); + + final customDirectory = Directory(path.join(supportDirectory.path, 'custom_shaders')); + expect(customDirectory.existsSync(), isFalse); + }); + + test('imports a direct UUID GLSL child and deletes only that file', () async { + final source = File(path.join(root.path, 'shader.GLSL'))..writeAsStringSync('shader'); + + final storedName = await ShaderAssetLoader.importCustomShader(source.path); + expect(storedName, matches(RegExp(r'^[0-9a-f-]+\.glsl$'))); + expect(ShaderAssetLoader.isValidCustomShaderFileName(storedName), isTrue); + + final shaders = await ShaderAssetLoader.getShadersForPreset(customPreset(storedName)); + expect(shaders, hasLength(1)); + expect(path.dirname(shaders.single), path.join(supportDirectory.path, 'custom_shaders')); + expect(await File(shaders.single).readAsString(), 'shader'); + + await ShaderAssetLoader.deleteCustomShader(storedName); + expect(File(shaders.single).existsSync(), isFalse); + expect(await source.readAsString(), 'shader'); + }); + + test('legacy base-36 managed names remain loadable and deletable', () async { + const storedName = 'ks9p7.glsl'; + final customDirectory = Directory(path.join(supportDirectory.path, 'custom_shaders'))..createSync(recursive: true); + final managedFile = File(path.join(customDirectory.path, storedName))..writeAsStringSync('legacy'); + + expect(ShaderAssetLoader.isValidCustomShaderFileName(storedName), isTrue); + expect(await ShaderAssetLoader.getShadersForPreset(customPreset(storedName)), [managedFile.path]); + + await ShaderAssetLoader.deleteCustomShader(storedName); + expect(managedFile.existsSync(), isFalse); + }); +} diff --git a/test/services/shader_service_test.dart b/test/services/shader_service_test.dart new file mode 100644 index 00000000..41975c2a --- /dev/null +++ b/test/services/shader_service_test.dart @@ -0,0 +1,62 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:path/path.dart' as path; +import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; +import 'package:plezy/models/shader_preset.dart'; +import 'package:plezy/mpv/player/player.dart'; +import 'package:plezy/services/shader_service.dart'; + +import '../test_helpers/io_fakes.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + late PathProviderPlatform originalPathProvider; + late Directory root; + + setUp(() async { + originalPathProvider = PathProviderPlatform.instance; + root = await Directory.systemTemp.createTemp('plezy_shader_service_test_'); + PathProviderPlatform.instance = FakePathProvider(root); + }); + + tearDown(() async { + PathProviderPlatform.instance = originalPathProvider; + if (await root.exists()) await root.delete(recursive: true); + }); + + test('an escaped custom preset never reaches the MPV shader append command', () async { + final supportDirectory = Directory(path.join(root.path, 'support'))..createSync(recursive: true); + final sentinel = File(path.join(supportDirectory.path, 'sentinel.glsl'))..writeAsStringSync('sentinel'); + final player = _RecordingPlayer(); + final service = ShaderService(player); + const preset = ShaderPreset( + id: 'custom_traversal', + name: 'Traversal', + type: ShaderPresetType.custom, + fileName: '../sentinel.glsl', + ); + + await service.applyPreset(preset); + + expect(player.commands.where((command) => command.length > 2 && command[2] == 'append'), isEmpty); + expect(player.commands.single, ['change-list', 'glsl-shaders', 'clr', '']); + expect(await sentinel.readAsString(), 'sentinel'); + }); +} + +class _RecordingPlayer implements Player { + final commands = >[]; + + @override + String get playerType => 'mpv'; + + @override + Future command(List args) async { + commands.add(List.unmodifiable(args)); + } + + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} diff --git a/test/utils/initials_palette_test.dart b/test/utils/initials_palette_test.dart new file mode 100644 index 00000000..41475adf --- /dev/null +++ b/test/utils/initials_palette_test.dart @@ -0,0 +1,19 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/utils/initials_palette.dart'; + +void main() { + group('initialOf', () { + test('keeps fallback, trimming, and ordinary casing behavior', () { + expect(initialOf(''), '?'); + expect(initialOf(' \t\n'), '?'); + expect(initialOf(' alice '), 'A'); + }); + + test('returns the complete first extended grapheme', () { + expect(initialOf('๐Ÿ‡ฏ๐Ÿ‡ต Japan'), '๐Ÿ‡ฏ๐Ÿ‡ต'); + expect(initialOf('๐Ÿ‘๐Ÿฝ Approved'), '๐Ÿ‘๐Ÿฝ'); + expect(initialOf('๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ Family'), '๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ'); + expect(initialOf('e\u0301clair'), 'E\u0301'); + }); + }); +} diff --git a/test/utils/search_relevance_test.dart b/test/utils/search_relevance_test.dart new file mode 100644 index 00000000..8f085655 --- /dev/null +++ b/test/utils/search_relevance_test.dart @@ -0,0 +1,132 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/media/media_item.dart'; +import 'package:plezy/utils/search_relevance.dart'; + +import '../test_helpers/media_items.dart'; + +void main() { + group('normalizeSearchText', () { + test('normalizes canonical, compatibility, separator, and typography variants', () { + expect(normalizeSearchText('Amรฉlie'), normalizeSearchText('Ame\u0301lie')); + expect(normalizeSearchText('๏ผก๏ฝ๏ฝ…๏ฝŒ๏ฝ‰๏ฝ…'), normalizeSearchText('Amelie')); + expect(normalizeSearchText('Spider\u00a0Man'), normalizeSearchText('Spider Man')); + + final expected = normalizeSearchText('Spider Man'); + for (final value in ['Spider-Man', 'Spiderโ€‘Man', 'Spiderโ€“Man', 'Spiderโ€”Man']) { + expect(normalizeSearchText(value), expected, reason: value); + } + }); + + test('preserves accents and script-significant marks', () { + expect(normalizeSearchText('Cafe'), isNot(normalizeSearchText('Cafรฉ'))); + expect(normalizeSearchText('Cafรฉ'), normalizeSearchText('Cafe\u0301')); + expect(normalizeSearchText('เค•'), isNot(normalizeSearchText('เค•เคฟ'))); + expect(normalizeSearchText('เค•เคฟ'), contains('เคฟ')); + }); + }); + + group('media search ranking', () { + test('does not give an English-only leading article bonus', () { + final items = [ + testMediaItem(id: 'the', title: 'The Boys'), + testMediaItem(id: 'les', title: 'Les Boys'), + testMediaItem(id: 'los', title: 'Los Boys'), + ]; + + expect(_ids(rankMediaSearchResults(items, 'Boys')), ['the', 'les', 'los']); + expect(_ids(rankMediaSearchResults(items.reversed.toList(), 'Boys')), ['los', 'les', 'the']); + }); + + test('keeps exact titles above longer prefixes', () { + final items = [ + testMediaItem(id: 'longer', title: 'The Boys in the Boat'), + testMediaItem(id: 'exact', title: 'The Boys'), + ]; + + expect(_ids(rankMediaSearchResults(items, 'The Boys')), ['exact', 'longer']); + }); + + test('preserves nullable-field weighting', () { + final items = [ + testMediaItem(id: 'parent', parentTitle: 'Target'), + testMediaItem(id: 'original', originalTitle: 'Target'), + ]; + + expect(_ids(rankMediaSearchResults(items, 'Target')), ['original', 'parent']); + }); + }); + + group('rankMediaSearchResults', () { + test('ranks equivalent query forms identically and preserves normalized ties', () { + final items = [ + testMediaItem(id: 'first', title: 'Spider-Man'), + testMediaItem(id: 'second', title: 'Spiderโ€‘Man'), + testMediaItem(id: 'third', title: 'Spider Man Returns'), + testMediaItem(id: 'accented', title: 'Amรฉlie'), + testMediaItem(id: 'decomposed', title: 'Ame\u0301lie'), + ]; + + final asciiOrder = _ids(rankMediaSearchResults(items, 'Spider Man')); + final compatibilityOrder = _ids(rankMediaSearchResults(items, '๏ผณ๏ฝ๏ฝ‰๏ฝ„๏ฝ…๏ฝ’ใ€€๏ผญ๏ฝ๏ฝŽ')); + final typographicOrder = _ids(rankMediaSearchResults(items, 'Spiderโ€”Man')); + + expect(compatibilityOrder, asciiOrder); + expect(typographicOrder, asciiOrder); + expect(asciiOrder.take(2), ['first', 'second']); + expect(_ids(rankMediaSearchResults(items, 'Spider Man', limit: 1)), ['first']); + expect(_ids(rankMediaSearchResults(items, 'Amรฉlie')).take(2), ['accented', 'decomposed']); + }); + + test('bounded selection matches the unbounded full ordering for a large input', () { + final items = [ + for (var i = 0; i < 1000; i++) + testMediaItem( + id: 'item-$i', + title: switch (i) { + 999 => 'Target', + _ when i % 137 == 0 => 'Target result $i', + _ when i % 41 == 0 => 'A Target result $i', + _ => 'Candidate $i', + }, + ), + ]; + final expected = _fullyRankedIds(items, 'Target').take(100).toList(); + + expect(_ids(rankMediaSearchResults(items, 'Target', limit: 100)), expected); + expect(expected.first, 'item-999'); + }); + + test('retains the earliest items when an equal-score run crosses the cap', () { + final items = [for (var i = 0; i < 150; i++) testMediaItem(id: 'tie-$i', title: 'Same title')]; + + expect(_ids(rankMediaSearchResults(items, 'Same title', limit: 100)), [for (var i = 0; i < 100; i++) 'tie-$i']); + }); + + test('preserves limit boundaries, full ordering, and empty-query input order', () { + final items = [ + testMediaItem(id: 'prefix', title: 'Target Extended'), + testMediaItem(id: 'exact', title: 'Target'), + testMediaItem(id: 'contains', title: 'A Target Story'), + ]; + final expected = _fullyRankedIds(items, 'Target'); + + expect(rankMediaSearchResults(items, 'Target', limit: 0), isEmpty); + expect(_ids(rankMediaSearchResults(items, 'Target', limit: 1)), ['exact']); + expect(_ids(rankMediaSearchResults(items, 'Target', limit: items.length)), expected); + expect(_ids(rankMediaSearchResults(items, 'Target', limit: items.length + 5)), expected); + expect(_ids(rankMediaSearchResults(items, 'Target')), expected); + expect(_ids(rankMediaSearchResults(items, 'โ€” โ€‘ !!!', limit: 2)), ['prefix', 'exact']); + }); + + test('keeps the negative-limit failure contract', () { + final items = [testMediaItem(title: 'Target')]; + + expect(() => rankMediaSearchResults(items, 'Target', limit: -1), throwsRangeError); + expect(() => rankMediaSearchResults(items, '!!!', limit: -1), throwsRangeError); + }); + }); +} + +List _ids(Iterable items) => [for (final item in items) item.id]; + +List _fullyRankedIds(List items, String query) => _ids(rankMediaSearchResults(items, query)); diff --git a/test/widgets/app_bar_back_button_test.dart b/test/widgets/app_bar_back_button_test.dart new file mode 100644 index 00000000..103517fb --- /dev/null +++ b/test/widgets/app_bar_back_button_test.dart @@ -0,0 +1,58 @@ +import 'dart:ui' show SemanticsAction; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/focus/input_mode_tracker.dart'; +import 'package:plezy/i18n/strings.g.dart'; +import 'package:plezy/widgets/app_bar_back_button.dart'; + +void main() { + Future pumpButton(WidgetTester tester, {required FocusNode focusNode, required VoidCallback onPressed}) async { + await tester.pumpWidget( + TranslationProvider( + child: MaterialApp( + home: InputModeTracker( + child: Scaffold( + body: AppBarBackButton(focusNode: focusNode, onPressed: onPressed), + ), + ), + ), + ), + ); + } + + testWidgets('pointer, D-pad select, and Space activate exactly once', (tester) async { + final focusNode = FocusNode(debugLabel: 'back_button_test'); + addTearDown(focusNode.dispose); + var activations = 0; + + await pumpButton(tester, focusNode: focusNode, onPressed: () => activations++); + + await tester.tap(find.byType(AppBarBackButton)); + expect(activations, 1); + + focusNode.requestFocus(); + await tester.pump(); + await tester.sendKeyEvent(LogicalKeyboardKey.select); + expect(activations, 2); + + await tester.sendKeyEvent(LogicalKeyboardKey.space); + expect(activations, 3); + }); + + testWidgets('exposes one localized operable button node', (tester) async { + final semantics = tester.ensureSemantics(); + final focusNode = FocusNode(debugLabel: 'back_button_semantics'); + addTearDown(focusNode.dispose); + + await pumpButton(tester, focusNode: focusNode, onPressed: () {}); + + final finder = find.bySemanticsLabel(t.common.back); + expect(finder, findsOneWidget); + final data = tester.getSemantics(finder).getSemanticsData(); + expect(data.flagsCollection.isButton, isTrue); + expect(data.hasAction(SemanticsAction.tap), isTrue); + semantics.dispose(); + }); +} diff --git a/test/widgets/cycling_media_backdrop_test.dart b/test/widgets/cycling_media_backdrop_test.dart index ee66ae0f..593071fe 100644 --- a/test/widgets/cycling_media_backdrop_test.dart +++ b/test/widgets/cycling_media_backdrop_test.dart @@ -7,6 +7,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:plezy/media/media_item.dart'; import 'package:plezy/media/media_kind.dart'; import 'package:plezy/services/settings_service.dart'; +import 'package:plezy/utils/media_image_helper.dart'; import 'package:plezy/widgets/cycling_media_backdrop.dart'; import 'package:plezy/widgets/tv_spotlight_background.dart'; @@ -62,7 +63,6 @@ void main() { mediaKey: mediaKey, imagePaths: paths, client: null, - localArtworkPathResolver: (path) => path, imageProviderResolver: (path) => imageProviders[path], allowNetwork: false, active: active, @@ -78,6 +78,48 @@ void main() { ); } + Widget buildAsyncBackdrop( + List paths, { + required Future Function(File file) fileExists, + Object? mediaKey = 'movie-1', + List fallbackPaths = const [], + }) { + final (memWidth, memHeight) = MediaImageHelper.getMemCacheDimensions( + displayWidth: 320, + displayHeight: 180, + imageType: ImageType.art, + ); + return MaterialApp( + home: MediaQuery( + data: const MediaQueryData(size: Size(320, 180), devicePixelRatio: 1), + child: SizedBox( + width: 320, + height: 180, + child: CyclingMediaBackdrop( + mediaKey: mediaKey, + imagePaths: paths, + fallbackImagePaths: fallbackPaths, + client: null, + localArtworkPathResolver: (path) => path, + imageProviderResolver: (path) { + final provider = imageProviders[path]; + return provider == null + ? null + : MediaImageHelper.boundedDecode(provider, memWidth: memWidth, memHeight: memHeight); + }, + localFileExists: fileExists, + allowNetwork: false, + width: 320, + height: 180, + fallbackColor: Colors.black, + rotationInterval: _rotationInterval, + fadeDuration: _fadeDuration, + ), + ), + ), + ); + } + String pathForProvider(ImageProvider provider) { while (provider is ResizeImage) { provider = provider.imageProvider; @@ -101,7 +143,11 @@ void main() { Future finishImageTransition(WidgetTester tester, {Duration fadeDuration = _fadeDuration}) async { final incoming = find.byType(Image).last; final image = tester.widget(incoming); - if (image.image is MemoryImage) { + var source = image.image; + while (source is ResizeImage) { + source = source.imageProvider; + } + if (source is MemoryImage) { final configuration = createLocalImageConfiguration(tester.element(incoming)); await tester.runAsync(() { final frame = Completer(); @@ -161,6 +207,113 @@ void main() { await tester.pumpWidget(const SizedBox.shrink()); }); + testWidgets('pending local rotation keeps the settled backdrop until the file resolves', (tester) async { + final checks = >{}; + final probes = {}; + Future fileExists(File file) { + probes.update(file.path, (count) => count + 1, ifAbsent: () => 1); + return (checks[file.path] ??= Completer()).future; + } + + await tester.pumpWidget(buildAsyncBackdrop([first.path, second.path], fileExists: fileExists)); + checks[first.path]!.complete(true); + await tester.pump(); + await tester.pump(); + await finishImageTransition(tester); + expectVisibleBackdrop(tester, first.path); + + await tester.pump(_rotationInterval); + expect(checks[second.path], isNotNull); + expect(renderedFilePaths(tester), [first.path]); + expect(probes[second.path], 1); + + checks[second.path]!.complete(true); + await tester.pump(); + await tester.pump(); + expect(renderedFilePaths(tester), [first.path, second.path]); + final incoming = tester.widget(find.byType(Image).last); + final resized = incoming.image as ResizeImage; + final (expectedWidth, expectedHeight) = MediaImageHelper.getMemCacheDimensions( + displayWidth: 320, + displayHeight: 180, + imageType: ImageType.art, + ); + expect(resized.width, expectedWidth); + expect(resized.height, expectedHeight); + await finishImageTransition(tester); + expectVisibleBackdrop(tester, second.path); + + await tester.pumpWidget(const SizedBox.shrink()); + }); + + testWidgets('late local completion cannot replace a newer media path', (tester) async { + final checks = >{}; + Future fileExists(File file) => (checks[file.path] ??= Completer()).future; + + await tester.pumpWidget(buildAsyncBackdrop([first.path], fileExists: fileExists, mediaKey: 'movie-a')); + expect(find.byType(Image), findsNothing); + + await tester.pumpWidget(buildAsyncBackdrop([second.path], fileExists: fileExists, mediaKey: 'movie-b')); + checks[second.path]!.complete(true); + await tester.pump(); + await tester.pump(); + await finishImageTransition(tester); + expectVisibleBackdrop(tester, second.path); + + checks[first.path]!.complete(true); + await tester.pump(); + await tester.pump(); + await tester.pump(); + expect(renderedFilePaths(tester), [second.path]); + expectVisibleBackdrop(tester, second.path); + + await tester.pumpWidget(const SizedBox.shrink()); + }); + + testWidgets('confirmed missing local path advances once and stays cached', (tester) async { + final missing = '${directory.path}/missing.png'; + final checks = >{}; + final probes = {}; + Future fileExists(File file) { + probes.update(file.path, (count) => count + 1, ifAbsent: () => 1); + return (checks[file.path] ??= Completer()).future; + } + + await tester.pumpWidget(buildAsyncBackdrop([first.path], fileExists: fileExists, mediaKey: 'settled')); + checks[first.path]!.complete(true); + await tester.pump(); + await tester.pump(); + await finishImageTransition(tester); + expectVisibleBackdrop(tester, first.path); + + await tester.pumpWidget( + buildAsyncBackdrop([missing, second.path], fileExists: fileExists, mediaKey: 'replacement'), + ); + expect(renderedFilePaths(tester), [first.path]); + + checks[missing]!.complete(false); + await tester.pump(); + await tester.pump(); + await tester.pump(); + expect(checks[second.path], isNotNull); + expect(renderedFilePaths(tester), [first.path]); + + checks[second.path]!.complete(true); + await tester.pump(); + await tester.pump(); + await finishImageTransition(tester); + expectVisibleBackdrop(tester, second.path); + + await tester.pumpWidget( + buildAsyncBackdrop([missing, second.path], fileExists: fileExists, mediaKey: 'replacement'), + ); + await tester.pump(_rotationInterval * 2); + expect(probes[missing], 1); + expectVisibleBackdrop(tester, second.path); + + await tester.pumpWidget(const SizedBox.shrink()); + }); + testWidgets('pauses while the application is not resumed', (tester) async { addTearDown(() => tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.resumed)); await tester.pumpWidget(buildBackdrop([first.path, second.path])); @@ -244,12 +397,16 @@ void main() { ), ), ); + await tester.runAsync(() => Future.delayed(const Duration(milliseconds: 20))); + await tester.pump(); + await tester.pump(); expect(renderedFilePaths(tester), [first.path]); await tester.pump(const Duration(seconds: 10)); + await tester.runAsync(() => Future.delayed(const Duration(milliseconds: 20))); + await tester.pump(); + await tester.pump(); expect(renderedFilePaths(tester).last, second.path); - await finishImageTransition(tester, fadeDuration: const Duration(milliseconds: 280)); - expectVisibleBackdrop(tester, second.path); await tester.pumpWidget(const SizedBox.shrink()); }); diff --git a/test/widgets/dialog_action_button_test.dart b/test/widgets/dialog_action_button_test.dart index dc09c2b7..150c8d20 100644 --- a/test/widgets/dialog_action_button_test.dart +++ b/test/widgets/dialog_action_button_test.dart @@ -29,7 +29,7 @@ void main() { expect(backed, 1); }); - testWidgets('nullable callback keeps its graph position while disabling activation', (tester) async { + testWidgets('nullable callback disables activation and removes the action from traversal', (tester) async { final focusNode = FocusNode(debugLabel: 'disabled dialog action'); addTearDown(focusNode.dispose); @@ -48,9 +48,11 @@ void main() { ); await tester.pump(); - expect(focusNode.hasFocus, isTrue); + expect(focusNode.canRequestFocus, isFalse); + expect(focusNode.hasFocus, isFalse); expect(tester.widget(find.byType(FilledButton)).onPressed, isNull); - await tester.sendKeyEvent(LogicalKeyboardKey.enter); - expect(focusNode.hasFocus, isTrue); + focusNode.requestFocus(); + await tester.pump(); + expect(focusNode.hasFocus, isFalse); }); } diff --git a/test/widgets/focusable_text_field_test.dart b/test/widgets/focusable_text_field_test.dart index c709e8fe..0346ab26 100644 --- a/test/widgets/focusable_text_field_test.dart +++ b/test/widgets/focusable_text_field_test.dart @@ -674,6 +674,128 @@ void main() { expect(controller.selection, const TextSelection.collapsed(offset: 1)); }); + testWidgets('TV hardware caret and deletion stay on grapheme boundaries', (tester) async { + TvDetectionService.debugSetAppleTVOverride(null); + await TvDetectionService.getInstance(forceTv: true); + TvDetectionService.setForceTVSync(true); + final controller = TextEditingController(); + final fieldFocusNode = FocusNode(debugLabel: 'grapheme_field'); + addTearDown(controller.dispose); + addTearDown(fieldFocusNode.dispose); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: FocusableTextField( + controller: controller, + focusNode: fieldFocusNode, + tvKeyboardAutoOpenBehavior: TvKeyboardAutoOpenBehavior.never, + ), + ), + ), + ); + fieldFocusNode.requestFocus(); + await tester.pump(); + + for (final grapheme in ['๐Ÿ˜€', 'e\u0301', '๐Ÿ‡ฏ๐Ÿ‡ต', '๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ']) { + final text = 'A${grapheme}B'; + final graphemeEnd = 1 + grapheme.length; + + controller.value = TextEditingValue( + text: text, + selection: TextSelection.collapsed(offset: graphemeEnd), + ); + await tester.sendKeyEvent(LogicalKeyboardKey.arrowLeft); + expect(controller.selection, const TextSelection.collapsed(offset: 1)); + await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight); + expect(controller.selection, TextSelection.collapsed(offset: graphemeEnd)); + await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight); + expect(controller.selection, TextSelection.collapsed(offset: text.length)); + await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight); + expect(controller.selection, TextSelection.collapsed(offset: text.length)); + + controller.selection = const TextSelection.collapsed(offset: 2); + await tester.sendKeyEvent(LogicalKeyboardKey.arrowLeft); + expect(controller.selection, const TextSelection.collapsed(offset: 1)); + controller.selection = const TextSelection.collapsed(offset: 2); + await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight); + expect(controller.selection, TextSelection.collapsed(offset: graphemeEnd)); + + controller.value = TextEditingValue(text: text, selection: const TextSelection.collapsed(offset: 0)); + await tester.sendKeyEvent(LogicalKeyboardKey.arrowLeft); + await tester.sendKeyEvent(LogicalKeyboardKey.backspace); + expect(controller.text, text); + expect(controller.selection, const TextSelection.collapsed(offset: 0)); + await tester.sendKeyEvent(LogicalKeyboardKey.delete); + expect(controller.text, '${grapheme}B'); + expect(controller.selection, const TextSelection.collapsed(offset: 0)); + + controller.value = TextEditingValue( + text: text, + selection: TextSelection.collapsed(offset: graphemeEnd), + ); + await tester.sendKeyEvent(LogicalKeyboardKey.backspace); + expect(controller.text, 'AB'); + expect(controller.selection, const TextSelection.collapsed(offset: 1)); + + controller.value = TextEditingValue(text: text, selection: const TextSelection.collapsed(offset: 1)); + await tester.sendKeyEvent(LogicalKeyboardKey.delete); + expect(controller.text, 'AB'); + expect(controller.selection, const TextSelection.collapsed(offset: 1)); + + controller.value = TextEditingValue( + text: text, + selection: TextSelection(baseOffset: graphemeEnd - 1, extentOffset: 1), + ); + await tester.sendKeyEvent(LogicalKeyboardKey.backspace); + expect(controller.text, 'AB'); + expect(controller.selection, const TextSelection.collapsed(offset: 1)); + } + }); + + testWidgets('grapheme deletion preserves formatter and callback ordering', (tester) async { + TvDetectionService.debugSetAppleTVOverride(null); + await TvDetectionService.getInstance(forceTv: true); + TvDetectionService.setForceTVSync(true); + const grapheme = '๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ'; + final text = 'A${grapheme}B'; + final controller = TextEditingController(text: text); + final fieldFocusNode = FocusNode(debugLabel: 'formatted_grapheme_field'); + final formatterCandidates = []; + final changes = []; + addTearDown(controller.dispose); + addTearDown(fieldFocusNode.dispose); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: FocusableTextField( + controller: controller, + focusNode: fieldFocusNode, + tvKeyboardAutoOpenBehavior: TvKeyboardAutoOpenBehavior.never, + maxLength: 8, + inputFormatters: [ + TextInputFormatter.withFunction((_, nextValue) { + formatterCandidates.add(nextValue); + return nextValue; + }), + ], + onChanged: changes.add, + ), + ), + ), + ); + fieldFocusNode.requestFocus(); + await tester.pump(); + controller.selection = TextSelection.collapsed(offset: 1 + grapheme.length); + + await tester.sendKeyEvent(LogicalKeyboardKey.backspace); + + expect(formatterCandidates.single.text, 'AB'); + expect(controller.text, 'AB'); + expect(controller.selection, const TextSelection.collapsed(offset: 1)); + expect(changes, ['AB']); + }); testWidgets('TV keyboard done resolves callbacks against the latest field widget', (tester) async { TvDetectionService.debugSetAppleTVOverride(null); await TvDetectionService.getInstance(forceTv: true); diff --git a/test/widgets/hotkey_recorder_test.dart b/test/widgets/hotkey_recorder_test.dart index b20ba38b..285ba6fc 100644 --- a/test/widgets/hotkey_recorder_test.dart +++ b/test/widgets/hotkey_recorder_test.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -12,7 +14,7 @@ void main() { tearDown(SelectKeyUpSuppressor.clearSuppression); testWidgets('initially unbound shortcut captures from a tap and saves', (tester) async { - final saved = []; + final saved = []; await _pumpRecorder(tester, saved: saved); expect(_recorder(tester).enabled, isFalse); @@ -39,48 +41,106 @@ void main() { await tester.tap(find.widgetWithText(FilledButton, t.common.save)); expect(saved, hasLength(1)); - expect(saved.single.key, PhysicalKeyboardKey.keyK); - expect(saved.single.modifiers, isNull); + expect(saved.single!.key, PhysicalKeyboardKey.keyK); + expect(saved.single!.modifiers, isNull); }); - testWidgets('cleared shortcut can capture and save a replacement', (tester) async { - final saved = []; + testWidgets('cleared assigned shortcut saves an explicit unassignment', (tester) async { + final saved = []; await _pumpRecorder( tester, saved: saved, currentHotKey: const HotKey(key: PhysicalKeyboardKey.keyJ, modifiers: [HotKeyModifier.shift]), ); - expect(find.text(physicalKeyLabel(PhysicalKeyboardKey.keyJ)), findsOneWidget); - expect(_saveAction(tester).onPressed, isNotNull); - await tester.tap(find.byTooltip(t.hotkeys.clearShortcut)); await tester.pump(); expect(_recorder(tester).enabled, isFalse); expect(find.text(physicalKeyLabel(PhysicalKeyboardKey.keyJ)), findsNothing); - expect(find.text(t.hotkeys.pressToRecord), findsNWidgets(2)); expect(FocusManager.instance.primaryFocus?.debugLabel, 'HotKeyRecorder.record'); - expect(_saveAction(tester).onPressed, isNull); - - await tester.tap(find.byType(HotKeyRecorder)); - await tester.pump(); - await tester.sendKeyEvent(LogicalKeyboardKey.keyL, physicalKey: PhysicalKeyboardKey.keyL); - await _pumpFocusChange(tester); - - expect(_recorder(tester).enabled, isFalse); - expect(find.text(physicalKeyLabel(PhysicalKeyboardKey.keyL)), findsOneWidget); - expect(FocusManager.instance.primaryFocus?.debugLabel, 'HotKeyRecorder.save'); + expect(_saveAction(tester).onPressed, isNotNull); await tester.tap(find.widgetWithText(FilledButton, t.common.save)); + await tester.pump(); - expect(saved, hasLength(1)); - expect(saved.single.key, PhysicalKeyboardKey.keyL); - expect(saved.single.modifiers, isNull); + expect(saved, [null]); + }); + + testWidgets('D-pad can save a cleared shortcut', (tester) async { + final saved = []; + await _pumpRecorder( + tester, + saved: saved, + currentHotKey: const HotKey(key: PhysicalKeyboardKey.keyJ), + ); + + await tester.tap(find.byTooltip(t.hotkeys.clearShortcut)); + await tester.pump(); + await tester.sendKeyEvent(LogicalKeyboardKey.arrowDown); + await _pumpFocusChange(tester); + + expect(FocusManager.instance.primaryFocus?.debugLabel, 'HotKeyRecorder.save'); + await tester.sendKeyEvent(LogicalKeyboardKey.enter); + await tester.pump(); + expect(saved, [null]); + }); + + testWidgets('cancel and Escape discard a local clear', (tester) async { + final saved = []; + var cancelCount = 0; + const original = HotKey(key: PhysicalKeyboardKey.keyJ); + await _pumpRecorder(tester, saved: saved, currentHotKey: original, onCancel: () => cancelCount++); + + await tester.tap(find.byTooltip(t.hotkeys.clearShortcut)); + await tester.pump(); + await tester.tap(find.widgetWithText(TextButton, t.common.cancel)); + expect(saved, isEmpty); + expect(cancelCount, 1); + + await _pumpRecorder(tester, saved: saved, currentHotKey: original, onCancel: () => cancelCount++); + expect(find.text(physicalKeyLabel(PhysicalKeyboardKey.keyJ)), findsOneWidget); + await tester.tap(find.ancestor(of: find.byType(HotKeyRecorder), matching: find.byType(GestureDetector)).first); + await tester.pump(); + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pump(); + + expect(saved, isEmpty); + expect(cancelCount, 2); + }); + + testWidgets('save is single-flight and blocks cancellation', (tester) async { + final gate = Completer(); + var saveCount = 0; + var cancelCount = 0; + await _pumpRecorder( + tester, + saved: [], + currentHotKey: const HotKey(key: PhysicalKeyboardKey.keyJ), + onCancel: () => cancelCount++, + onSave: (_) { + saveCount++; + return gate.future; + }, + ); + + await tester.tap(find.widgetWithText(FilledButton, t.common.save)); + await tester.tap(find.widgetWithText(FilledButton, t.common.save), warnIfMissed: false); + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pump(); + + expect(saveCount, 1); + expect(cancelCount, 0); + expect(_saveAction(tester).onPressed, isNull); + expect(_cancelAction(tester).onPressed, isNull); + + gate.complete(); + await tester.pump(); + expect(_cancelAction(tester).onPressed, isNotNull); }); testWidgets('modifier-first Control+P completes with the held modifier', (tester) async { - final saved = []; + final saved = []; await _pumpRecorder(tester, saved: saved); await tester.tap(find.byType(HotKeyRecorder)); await tester.pump(); @@ -105,8 +165,8 @@ void main() { await tester.tap(find.widgetWithText(FilledButton, t.common.save)); expect(saved, hasLength(1)); - expect(saved.single.key, PhysicalKeyboardKey.keyP); - expect(saved.single.modifiers, [HotKeyModifier.control]); + expect(saved.single!.key, PhysicalKeyboardKey.keyP); + expect(saved.single!.modifiers, [HotKeyModifier.control]); }); for (final entry in <(String, LogicalKeyboardKey, PhysicalKeyboardKey)>[ @@ -114,7 +174,7 @@ void main() { ('select', LogicalKeyboardKey.select, PhysicalKeyboardKey.select), ]) { testWidgets('${entry.$1} completion does not rearm capture or activate Save on key-up', (tester) async { - final saved = []; + final saved = []; await _pumpRecorder(tester, saved: saved); await tester.tap(find.byType(HotKeyRecorder)); await tester.pump(); @@ -138,21 +198,28 @@ void main() { await tester.tap(find.widgetWithText(FilledButton, t.common.save)); expect(saved, hasLength(1)); - expect(saved.single.key, entry.$3); - expect(saved.single.modifiers, isNull); + expect(saved.single!.key, entry.$3); + expect(saved.single!.modifiers, isNull); }); } } -Future _pumpRecorder(WidgetTester tester, {required List saved, HotKey? currentHotKey}) async { +Future _pumpRecorder( + WidgetTester tester, { + required List saved, + HotKey? currentHotKey, + VoidCallback? onCancel, + FutureOr Function(HotKey?)? onSave, +}) async { await tester.pumpWidget( MaterialApp( home: Scaffold( body: HotKeyRecorderWidget( + key: UniqueKey(), actionName: 'Play/Pause', currentHotKey: currentHotKey, - onHotKeyRecorded: saved.add, - onCancel: () {}, + onHotKeyRecorded: onSave ?? saved.add, + onCancel: onCancel ?? () {}, ), ), ), @@ -169,3 +236,6 @@ HotKeyRecorder _recorder(WidgetTester tester) => tester.widget(find.byType(HotKe DialogActionButton _saveAction(WidgetTester tester) => tester.widget(find.widgetWithText(DialogActionButton, t.common.save)); + +DialogActionButton _cancelAction(WidgetTester tester) => + tester.widget(find.widgetWithText(DialogActionButton, t.common.cancel)); diff --git a/test/widgets/hub_section_test.dart b/test/widgets/hub_section_test.dart index a9e9e68e..30769d74 100644 --- a/test/widgets/hub_section_test.dart +++ b/test/widgets/hub_section_test.dart @@ -3,6 +3,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:plezy/focus/input_mode_tracker.dart'; +import 'package:plezy/focus/locked_hub_controller.dart'; import 'package:plezy/media/media_backend.dart'; import 'package:plezy/media/media_hub.dart'; import 'package:plezy/media/media_item.dart'; @@ -43,6 +44,7 @@ void main() { _TestApp( child: HubSection( hub: _hubWith(item), + focusMemory: HubFocusMemory(), icon: Symbols.live_tv_rounded, onItemTap: (value) => tappedItem = value, onItemLongPress: (value) => longPressedItem = value, @@ -74,6 +76,7 @@ void main() { child: HubSection( key: hubKey, hub: _hubWith(item), + focusMemory: HubFocusMemory(), icon: Symbols.live_tv_rounded, onItemTap: (value) => tappedItem = value, onItemLongPress: (value) => longPressedItem = value, @@ -109,6 +112,7 @@ void main() { _TestApp( child: HubSection( hub: _hubWith(item), + focusMemory: HubFocusMemory(), icon: Symbols.live_tv_rounded, cardSizing: HubCardSizing.grid, episodePosterModeOverride: EpisodePosterMode.seriesPoster, @@ -128,6 +132,69 @@ void main() { ); expect(outerPadding.padding.resolve(TextDirection.ltr).bottom, 0); }); + + testWidgets('restores within one owner but resets for a fresh owner', (tester) async { + final items = [ + for (var index = 0; index < 3; index++) + testMediaItem(id: 'item_$index', backend: MediaBackend.plex, kind: MediaKind.movie, title: 'Item $index'), + ]; + MediaHub hub(String id) => MediaHub(id: id, title: id, type: 'movie', items: items, size: items.length); + + final ownerA = HubFocusMemory(); + final ownerB = HubFocusMemory(); + String? focusedItemId; + + Future mount({ + required HubFocusMemory owner, + required String hubId, + required GlobalKey key, + }) async { + await tester.pumpWidget( + _TestApp( + child: HubSection( + key: key, + hub: hub(hubId), + focusMemory: owner, + icon: Symbols.movie_rounded, + onFocusedItemChanged: (item) => focusedItemId = item.id, + ), + ), + ); + } + + final firstMountKey = GlobalKey(); + await mount(owner: ownerA, hubId: 'detail_episodes', key: firstMountKey); + firstMountKey.currentState!.requestFocusAt(2); + await tester.pumpAndSettle(); + expect(focusedItemId, 'item_2'); + + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pump(); + + final remountKey = GlobalKey(); + await mount(owner: ownerA, hubId: 'detail_episodes', key: remountKey); + remountKey.currentState!.requestFocusFromMemory(); + await tester.pumpAndSettle(); + expect(focusedItemId, 'item_2'); + + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pump(); + + final secondHubKey = GlobalKey(); + await mount(owner: ownerA, hubId: 'detail_extras', key: secondHubKey); + secondHubKey.currentState!.requestFocusFromMemory(); + await tester.pumpAndSettle(); + expect(focusedItemId, 'item_2'); + + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pump(); + + final freshOwnerKey = GlobalKey(); + await mount(owner: ownerB, hubId: 'detail_episodes', key: freshOwnerKey); + freshOwnerKey.currentState!.requestFocusFromMemory(); + await tester.pumpAndSettle(); + expect(focusedItemId, 'item_0'); + }); } MediaHub _hubWith(MediaItem item) { diff --git a/test/widgets/media_card_full_card_test.dart b/test/widgets/media_card_full_card_test.dart index 2208c7ce..a1137f84 100644 --- a/test/widgets/media_card_full_card_test.dart +++ b/test/widgets/media_card_full_card_test.dart @@ -1,8 +1,11 @@ +import 'dart:ui' as ui; + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:plezy/focus/focus_glow_overlay.dart'; import 'package:plezy/focus/focus_theme.dart'; import 'package:plezy/focus/input_mode_tracker.dart'; +import 'package:plezy/i18n/strings.g.dart'; import 'package:plezy/media/media_backend.dart'; import 'package:plezy/media/media_kind.dart'; @@ -208,6 +211,151 @@ void main() { expect(find.byType(CompositedTransformFollower), findsNothing); }); + testWidgets('grid and list cards expose card and detail actions without decorative semantics', (tester) async { + final semantics = tester.ensureSemantics(); + final item = testMediaItem( + id: 'semantic_episode', + backend: MediaBackend.plex, + kind: MediaKind.episode, + title: 'Decorative Episode Title', + summary: 'Decorative episode summary', + parentId: 'season_2', + parentIndex: 2, + index: 3, + grandparentId: 'show_1', + grandparentTitle: 'Semantic Series', + ); + + for (final forceGridMode in [true, false]) { + await tester.pumpWidget( + _TestApp( + child: SizedBox( + width: forceGridMode ? 200 : 420, + height: forceGridMode ? 330 : 180, + child: MediaCard(item: item, forceGridMode: forceGridMode, forceListMode: !forceGridMode, isOffline: true), + ), + ), + ); + + final cardData = tester.getSemantics(find.bySemanticsLabel(mediaCardSemanticLabel(item))).getSemanticsData(); + expect(cardData.flagsCollection.isButton, isTrue); + expect(cardData.hasAction(ui.SemanticsAction.tap), isTrue); + + for (final detailLabel in ['Semantic Series', 'S2']) { + final detailData = tester.getSemantics(find.bySemanticsLabel(detailLabel)).getSemanticsData(); + expect(detailData.flagsCollection.isButton, isTrue); + expect(detailData.hasAction(ui.SemanticsAction.tap), isTrue); + expect(detailData.hint, t.mediaMenu.viewDetails); + } + + expect(find.bySemanticsLabel(RegExp('Decorative Episode Title|Decorative episode summary')), findsNothing); + } + + semantics.dispose(); + }); + + testWidgets('movie and season title links remain distinct semantic actions', (tester) async { + final semantics = tester.ensureSemantics(); + final scenarios = [ + ( + item: testMediaItem( + id: 'linked_movie', + kind: MediaKind.movie, + title: 'Linked Movie', + summary: 'Movie decorative summary', + ), + forceGridMode: true, + detailLabel: 'Linked Movie', + decorativeLabel: 'Movie decorative summary', + ), + ( + item: testMediaItem( + id: 'linked_season', + kind: MediaKind.season, + title: 'Season Two', + parentId: 'linked_show', + parentTitle: 'Linked Series', + summary: 'Season decorative summary', + ), + forceGridMode: false, + detailLabel: 'Linked Series', + decorativeLabel: 'Season Two', + ), + ]; + + for (final scenario in scenarios) { + await tester.pumpWidget( + _TestApp( + child: SizedBox( + width: scenario.forceGridMode ? 200 : 420, + height: scenario.forceGridMode ? 330 : 180, + child: MediaCard( + item: scenario.item, + forceGridMode: scenario.forceGridMode, + forceListMode: !scenario.forceGridMode, + isOffline: true, + ), + ), + ), + ); + + expect( + tester + .getSemantics(find.bySemanticsLabel(mediaCardSemanticLabel(scenario.item))) + .getSemanticsData() + .hasAction(ui.SemanticsAction.tap), + isTrue, + ); + final detail = tester.getSemantics(find.bySemanticsLabel(scenario.detailLabel)).getSemanticsData(); + expect(detail.flagsCollection.isButton, isTrue); + expect(detail.hasAction(ui.SemanticsAction.tap), isTrue); + expect(detail.hint, t.mediaMenu.viewDetails); + expect(find.bySemanticsLabel(scenario.decorativeLabel), findsNothing); + } + + semantics.dispose(); + }); + + testWidgets('custom card actions keep detail-link semantics disabled in grid and list modes', (tester) async { + final semantics = tester.ensureSemantics(); + final item = testMediaItem( + id: 'semantic_movie', + backend: MediaBackend.plex, + kind: MediaKind.movie, + title: 'Custom Semantic Movie', + summary: 'Decorative movie summary', + ); + var tapCount = 0; + + for (final forceGridMode in [true, false]) { + await tester.pumpWidget( + _TestApp( + child: SizedBox( + width: forceGridMode ? 200 : 420, + height: forceGridMode ? 330 : 180, + child: MediaCard( + item: item, + forceGridMode: forceGridMode, + forceListMode: !forceGridMode, + isOffline: true, + onTap: () => tapCount++, + ), + ), + ), + ); + + final card = tester.getSemantics(find.bySemanticsLabel(mediaCardSemanticLabel(item))); + expect(card.getSemanticsData().hasAction(ui.SemanticsAction.tap), isTrue); + expect(find.bySemanticsLabel('Custom Semantic Movie'), findsNothing); + expect(find.bySemanticsLabel(RegExp('Decorative movie summary')), findsNothing); + + card.owner!.performAction(card.id, ui.SemanticsAction.tap); + expect(tapCount, forceGridMode ? 1 : 2); + } + + semantics.dispose(); + }); + testWidgets('custom tap owns pointer and programmatic activation', (tester) async { final item = testMediaItem( id: 'custom_tap', diff --git a/test/widgets/optimized_media_image_test.dart b/test/widgets/optimized_media_image_test.dart index 6d9eec25..e0bf2d2f 100644 --- a/test/widgets/optimized_media_image_test.dart +++ b/test/widgets/optimized_media_image_test.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:convert'; import 'dart:io'; @@ -89,6 +90,102 @@ void main() { expect(tester.getSize(placeholder), const Size(96, 96)); }); + testWidgets('local resolver rejects stale path completions and disposal completions', (tester) async { + final checks = >{}; + final probes = {}; + var path = '/artwork/a.png'; + late StateSetter rebuild; + Future fileExists(File file) { + probes.update(file.path, (count) => count + 1, ifAbsent: () => 1); + return (checks[file.path] ??= Completer()).future; + } + + Widget resolutionBuilder(BuildContext context, LocalFileResolution resolution, File? file) { + return Text('${resolution.name}:${file?.path ?? path}'); + } + + await tester.pumpWidget( + MaterialApp( + home: StatefulBuilder( + builder: (context, setState) { + rebuild = setState; + return ResolvedLocalFile(path: path, fileExists: fileExists, builder: resolutionBuilder); + }, + ), + ), + ); + expect(find.text('pending:/artwork/a.png'), findsOneWidget); + + rebuild(() => path = '/artwork/b.png'); + await tester.pump(); + rebuild(() {}); + await tester.pump(); + expect(find.text('pending:/artwork/b.png'), findsOneWidget); + expect(probes['/artwork/b.png'], 1); + + checks['/artwork/a.png']!.complete(true); + await tester.pump(); + expect(find.text('pending:/artwork/b.png'), findsOneWidget); + + checks['/artwork/b.png']!.complete(true); + await tester.pump(); + await tester.pump(); + expect(find.text('present:/artwork/b.png'), findsOneWidget); + + rebuild(() => path = '/artwork/c.png'); + await tester.pump(); + await tester.pumpWidget(const SizedBox.shrink()); + checks['/artwork/c.png']!.complete(true); + await tester.pump(); + await tester.pump(); + expect(tester.takeException(), isNull); + }); + + testWidgets('local resolver caches confirmed missing paths only when requested', (tester) async { + final probes = {}; + var path = '/artwork/missing-a.png'; + late StateSetter rebuild; + Future fileExists(File file) { + probes.update(file.path, (count) => count + 1, ifAbsent: () => 1); + return Future.value(false); + } + + await tester.pumpWidget( + MaterialApp( + home: StatefulBuilder( + builder: (context, setState) { + rebuild = setState; + return ResolvedLocalFile( + path: path, + cacheMissing: true, + fileExists: fileExists, + builder: (context, resolution, file) => Text('${resolution.name}:$path'), + ); + }, + ), + ), + ); + await tester.pump(); + expect(find.text('missing:/artwork/missing-a.png'), findsOneWidget); + expect(probes['/artwork/missing-a.png'], 1); + + rebuild(() {}); + await tester.pump(); + rebuild(() {}); + await tester.pump(); + expect(probes['/artwork/missing-a.png'], 1); + + rebuild(() => path = '/artwork/missing-b.png'); + await tester.pump(); + await tester.pump(); + expect(probes['/artwork/missing-b.png'], 1); + + rebuild(() => path = '/artwork/missing-a.png'); + await tester.pump(); + expect(find.text('missing:/artwork/missing-a.png'), findsOneWidget); + expect(probes['/artwork/missing-a.png'], 1); + }); + testWidgets('same local artwork path re-resolves after the file appears', (tester) async { tester.view.devicePixelRatio = 1; tester.view.physicalSize = const Size(1280, 720); diff --git a/test/widgets/pin_entry_dialog_test.dart b/test/widgets/pin_entry_dialog_test.dart index 55945455..c08e8774 100644 --- a/test/widgets/pin_entry_dialog_test.dart +++ b/test/widgets/pin_entry_dialog_test.dart @@ -65,6 +65,34 @@ void main() { expect(find.byType(PinEntryDialog), findsNothing); }); + testWidgets('mobile PIN normalizes oversized input before submitting', (tester) async { + TvDetectionService.debugSetAppleTVOverride(false); + String? result; + + await tester.pumpWidget( + MaterialApp( + theme: ThemeData(platform: TargetPlatform.iOS), + home: Builder( + builder: (context) => Scaffold( + body: TextButton( + onPressed: () async { + result = await showPinEntryDialog(context, 'Protected Profile'); + }, + child: const Text('Open'), + ), + ), + ), + ), + ); + await tester.tap(find.text('Open')); + await tester.pumpAndSettle(); + + tester.widget(find.byType(TextField)).onChanged!('12345'); + await tester.pumpAndSettle(); + + expect(result, '1234'); + expect(find.byType(PinEntryDialog), findsNothing); + }); testWidgets('mobile duplicate submit does not pop route below PIN dialog', (tester) async { TvDetectionService.debugSetAppleTVOverride(false); String? pinResult; @@ -304,6 +332,24 @@ void main() { expect(find.byType(PinEntryDialog), findsNothing); }); + testWidgets('unowned keyboard keys remain available to ancestor handlers', (tester) async { + TvDetectionService.debugSetAppleTVOverride(true); + + await _pumpPinDialogLauncher(tester, onResult: (_) {}); + await tester.tap(find.text('Open')); + await tester.pumpAndSettle(); + + final result = _dispatchKey( + const KeyDownEvent( + physicalKey: PhysicalKeyboardKey.f12, + logicalKey: LogicalKeyboardKey.f12, + timeStamp: Duration.zero, + ), + ); + + expect(result, KeyEventResult.ignored); + expect(find.byType(PinEntryDialog), findsOneWidget); + }); testWidgets('non-mobile PIN entry accepts physical keyboard digits', (tester) async { TvDetectionService.debugSetAppleTVOverride(true); String? result; diff --git a/test/widgets/player_queue_spoilers_test.dart b/test/widgets/player_queue_spoilers_test.dart index fbf3e99e..21a0ac27 100644 --- a/test/widgets/player_queue_spoilers_test.dart +++ b/test/widgets/player_queue_spoilers_test.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:plezy/focus/focusable_wrapper.dart'; +import 'package:plezy/focus/input_mode_tracker.dart'; import 'package:plezy/i18n/strings.g.dart'; import 'package:plezy/media/media_backend.dart'; import 'package:plezy/media/media_item.dart'; @@ -105,6 +107,139 @@ void main() { expect(thumbnails.map((thumbnail) => thumbnail.blurThumbnail), [true, false, false]); }); + testWidgets('content strip falls back from chapters to a focusable queue', (tester) async { + final playback = _playbackWithQueue(); + addTearDown(playback.dispose); + final player = _FakePlayer(); + final stripKey = GlobalKey(); + final chapter = MediaChapter(id: 1, startTimeOffset: 10000, title: 'Old Chapter'); + MediaItem? selectedItem; + + await tester.pumpWidget( + _queueHarness( + playback: playback, + child: ContentStrip( + key: stripKey, + player: player, + chapters: [chapter], + chaptersLoaded: true, + canControl: true, + showQueueTab: true, + onQueueItemSelected: (item) => selectedItem = item, + useFocusNavigation: true, + ), + ), + ); + await tester.sendKeyEvent(LogicalKeyboardKey.arrowDown); + await tester.pump(); + + expect(find.text(t.videoControls.chapters), findsOneWidget); + expect(find.text('Old Chapter'), findsOneWidget); + expect(find.text('Spoiler Episode'), findsNothing); + + await tester.pumpWidget( + _queueHarness( + playback: playback, + child: ContentStrip( + key: stripKey, + player: player, + chapters: const [], + chaptersLoaded: true, + canControl: true, + showQueueTab: true, + onQueueItemSelected: (item) => selectedItem = item, + useFocusNavigation: true, + ), + ), + ); + await tester.pump(); + + expect(find.text(t.videoControls.queue), findsOneWidget); + expect(find.text('Spoiler Episode'), findsOneWidget); + expect(find.text('Old Chapter'), findsNothing); + + stripKey.currentState!.requestInitialFocus(); + await tester.pump(); + final firstQueueItem = tester.widget( + find.ancestor(of: find.text('Spoiler Episode'), matching: find.byType(FocusableWrapper)), + ); + expect(firstQueueItem.focusNode!.hasPrimaryFocus, isTrue); + + await tester.sendKeyEvent(LogicalKeyboardKey.enter); + await tester.pump(); + expect(selectedItem?.id, 'spoiler-episode'); + }); + + testWidgets('content strip preserves queue selection until only chapters remain', (tester) async { + final playback = _playbackWithQueue(); + addTearDown(playback.dispose); + final player = _FakePlayer(); + final stripKey = GlobalKey(); + final initialChapter = MediaChapter(id: 1, startTimeOffset: 10000, title: 'Initial Chapter'); + final replacementChapter = MediaChapter(id: 2, startTimeOffset: 20000, title: 'Replacement Chapter'); + + await tester.pumpWidget( + _queueHarness( + playback: playback, + child: ContentStrip( + key: stripKey, + player: player, + chapters: [initialChapter], + chaptersLoaded: true, + canControl: true, + showQueueTab: true, + onQueueItemSelected: (_) {}, + ), + ), + ); + await tester.pump(); + await tester.tap(find.text(t.videoControls.queue)); + await tester.pump(); + expect(find.text('Spoiler Episode'), findsOneWidget); + expect(find.text('Initial Chapter'), findsNothing); + + await tester.pumpWidget( + _queueHarness( + playback: playback, + child: ContentStrip( + key: stripKey, + player: player, + chapters: [replacementChapter], + chaptersLoaded: true, + canControl: true, + showQueueTab: true, + onQueueItemSelected: (_) {}, + ), + ), + ); + await tester.pump(); + + expect(find.text('Spoiler Episode'), findsOneWidget); + expect(find.text('Replacement Chapter'), findsNothing); + + await tester.pumpWidget( + _queueHarness( + playback: playback, + child: ContentStrip( + key: stripKey, + player: player, + chapters: [replacementChapter], + chaptersLoaded: true, + canControl: true, + showQueueTab: false, + onQueueItemSelected: null, + ), + ), + ); + await tester.pump(); + + expect(find.text('Replacement Chapter'), findsOneWidget); + expect(find.text('Spoiler Episode'), findsNothing); + await tester.tap(find.text('Replacement Chapter')); + await tester.pump(); + expect(player.seeks, [const Duration(seconds: 20)]); + }); + testWidgets('denied chapter remains visible but touch and select do not seek', (tester) async { final playback = PlaybackStateProvider(); addTearDown(playback.dispose); @@ -197,9 +332,11 @@ void main() { Widget _queueHarness({required PlaybackStateProvider playback, required Widget child}) { return ChangeNotifierProvider.value( value: playback, - child: MaterialApp( - theme: ThemeData(extensions: const [_testTokens]), - home: Scaffold(body: SizedBox(width: 600, height: 400, child: child)), + child: InputModeTracker( + child: MaterialApp( + theme: ThemeData(extensions: const [_testTokens]), + home: Scaffold(body: SizedBox(width: 600, height: 400, child: child)), + ), ), ); } diff --git a/test/widgets/server_activities_button_test.dart b/test/widgets/server_activities_button_test.dart index ed799831..dfe410a1 100644 --- a/test/widgets/server_activities_button_test.dart +++ b/test/widgets/server_activities_button_test.dart @@ -1,19 +1,35 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:drift/native.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:http/http.dart' as http; +import 'package:plezy/database/app_database.dart'; import 'package:plezy/i18n/strings.g.dart'; +import 'package:plezy/media/ids.dart'; import 'package:plezy/providers/multi_server_provider.dart'; import 'package:plezy/services/data_aggregation_service.dart'; import 'package:plezy/services/multi_server_manager.dart'; +import 'package:plezy/services/plex_api_cache.dart'; +import 'package:plezy/theme/mono_theme.dart'; import 'package:plezy/widgets/server_activities_button.dart'; import 'package:provider/provider.dart'; +import '../test_helpers/backend_client_fixtures.dart'; + void main() { TestWidgetsFlutterBinding.ensureInitialized(); + late AppDatabase database; setUp(() { LocaleSettings.setLocaleSync(AppLocale.en); + database = AppDatabase.forTesting(NativeDatabase.memory()); + PlexApiCache.initialize(database); }); + tearDown(() => database.close()); + testWidgets('togglePanel opens and closes the server activities overlay', (tester) async { final manager = MultiServerManager(); final multiServerProvider = MultiServerProvider(manager, DataAggregationService(manager)); @@ -47,4 +63,224 @@ void main() { expect(find.text(t.serverTasks.title), findsNothing); }); + + testWidgets('polls three seconds after completion without overlapping activity aggregates', (tester) async { + final transport = _ControlledActivitiesClient(); + final harness = await _pumpActivitiesHarness(tester, transport); + + expect(transport.activityRequests, hasLength(1)); + transport.completeActivities(0, const ['Initial activity']); + await tester.pump(); + await tester.pump(); + expect(find.text('Initial activity'), findsOneWidget); + + await tester.pump(const Duration(seconds: 3)); + expect(transport.activityRequests, hasLength(2)); + expect(transport.activeActivityGets, 1); + + await tester.pump(const Duration(seconds: 4)); + expect(transport.activityRequests, hasLength(2)); + expect(transport.maximumActiveActivityGets, 1); + + transport.completeActivities(1, const ['Completed poll']); + await tester.pump(); + await tester.pump(); + expect(find.text('Completed poll'), findsOneWidget); + + await tester.pump(const Duration(milliseconds: 2999)); + expect(transport.activityRequests, hasLength(2)); + await tester.pump(const Duration(milliseconds: 1)); + expect(transport.activityRequests, hasLength(3)); + expect(transport.maximumActiveActivityGets, 1); + + harness.buttonKey.currentState!.togglePanel(); + await tester.pump(); + }); + + testWidgets('close and reopen rejects a stale completion and preserves the new poll cadence', (tester) async { + final transport = _ControlledActivitiesClient(honorAbort: false); + final harness = await _pumpActivitiesHarness(tester, transport); + final oldRequest = transport.activityRequests.single; + + harness.buttonKey.currentState!.togglePanel(); + await tester.pump(); + await expectLater(oldRequest.abortObserved.future, completes); + + harness.buttonKey.currentState!.togglePanel(); + await tester.pump(); + expect(transport.activityRequests, hasLength(2)); + + transport.completeActivities(1, const ['Fresh activity']); + await tester.pump(); + await tester.pump(); + expect(find.text('Fresh activity'), findsOneWidget); + + transport.completeActivities(0, const ['Old activity']); + await tester.pump(); + await tester.pump(); + expect(find.text('Fresh activity'), findsOneWidget); + expect(find.text('Old activity'), findsNothing); + + await tester.pump(const Duration(milliseconds: 2999)); + expect(transport.activityRequests, hasLength(2)); + await tester.pump(const Duration(milliseconds: 1)); + expect(transport.activityRequests, hasLength(3)); + transport.completeActivities(2, const ['Next activity']); + await tester.pump(); + await tester.pump(); + + harness.buttonKey.currentState!.togglePanel(); + await tester.pump(); + }); + + testWidgets('post-cancel refresh cannot be undone by a pre-cancel poll', (tester) async { + final transport = _ControlledActivitiesClient(honorAbort: false); + final harness = await _pumpActivitiesHarness(tester, transport); + + transport.completeActivities(0, const ['Cancelable activity'], cancellable: true); + await tester.pump(); + await tester.pump(); + expect(find.text('Cancelable activity'), findsOneWidget); + + await tester.pump(const Duration(seconds: 3)); + expect(transport.activityRequests, hasLength(2)); + + await tester.tap(find.byTooltip(t.common.cancel)); + await tester.pump(); + await tester.pump(); + expect(transport.deleteCount, 1); + expect(transport.activityRequests, hasLength(3)); + await expectLater(transport.activityRequests[1].abortObserved.future, completes); + + transport.completeActivities(2, const []); + await tester.pump(); + await tester.pump(); + expect(find.text(t.serverTasks.noTasks), findsOneWidget); + + transport.completeActivities(1, const ['Cancelable activity'], cancellable: true); + await tester.pump(); + await tester.pump(); + expect(find.text(t.serverTasks.noTasks), findsOneWidget); + expect(find.text('Cancelable activity'), findsNothing); + expect(transport.activityRequests, hasLength(3)); + + harness.buttonKey.currentState!.togglePanel(); + await tester.pump(); + }); +} + +class _ActivitiesHarness { + const _ActivitiesHarness(this.buttonKey); + + final GlobalKey buttonKey; +} + +Future<_ActivitiesHarness> _pumpActivitiesHarness(WidgetTester tester, _ControlledActivitiesClient transport) async { + final serverId = ServerId('plex-server'); + final client = testPlexClient(serverId: serverId, serverName: 'Test server', httpClient: transport); + final manager = MultiServerManager()..debugRegisterClientForTesting(client); + final multiServerProvider = MultiServerProvider(manager, DataAggregationService(manager)); + final buttonKey = GlobalKey(); + + addTearDown(() { + multiServerProvider.dispose(); + manager.dispose(); + }); + + await tester.pumpWidget( + TranslationProvider( + child: ChangeNotifierProvider.value( + value: multiServerProvider, + child: MaterialApp( + theme: monoTheme(dark: true), + home: Scaffold(body: ServerActivitiesButton(key: buttonKey)), + ), + ), + ), + ); + buttonKey.currentState!.togglePanel(); + await tester.pump(); + return _ActivitiesHarness(buttonKey); +} + +class _ControlledActivityRequest { + _ControlledActivityRequest(this.request); + + final http.BaseRequest request; + final response = Completer(); + final abortObserved = Completer(); +} + +class _ControlledActivitiesClient extends http.BaseClient { + _ControlledActivitiesClient({this.honorAbort = true}); + + final bool honorAbort; + final activityRequests = <_ControlledActivityRequest>[]; + var activeActivityGets = 0; + var maximumActiveActivityGets = 0; + var deleteCount = 0; + + @override + Future send(http.BaseRequest request) { + if (request.method == 'DELETE' && request.url.path.startsWith('/activities/')) { + deleteCount++; + return Future.value(_response(request, const {})); + } + if (request.method != 'GET' || request.url.path != '/activities') { + return Future.value(_response(request, const {})); + } + + final pending = _ControlledActivityRequest(request); + activityRequests.add(pending); + activeActivityGets++; + if (activeActivityGets > maximumActiveActivityGets) { + maximumActiveActivityGets = activeActivityGets; + } + + final abortTrigger = (request as http.Abortable).abortTrigger!; + unawaited( + abortTrigger.then((_) { + if (!pending.abortObserved.isCompleted) { + pending.abortObserved.complete(); + } + if (honorAbort && !pending.response.isCompleted) { + pending.response.completeError(http.RequestAbortedException(request.url)); + } + }), + ); + + return pending.response.future.whenComplete(() { + activeActivityGets--; + }); + } + + void completeActivities(int requestIndex, List titles, {bool cancellable = false}) { + final pending = activityRequests[requestIndex]; + if (pending.response.isCompleted) return; + pending.response.complete( + _response(pending.request, { + 'MediaContainer': { + 'Activity': [ + for (var index = 0; index < titles.length; index++) + { + 'uuid': 'activity-$requestIndex-$index', + 'type': 'library.update', + 'title': titles[index], + 'progress': 50, + 'cancellable': cancellable, + }, + ], + }, + }), + ); + } + + http.StreamedResponse _response(http.BaseRequest request, Map body) { + return http.StreamedResponse( + Stream.value(utf8.encode(jsonEncode(body))), + 200, + headers: const {'content-type': 'application/json'}, + request: request, + ); + } } diff --git a/test/widgets/track_sheet_test.dart b/test/widgets/track_sheet_test.dart index da8f6c67..44a2b0a1 100644 --- a/test/widgets/track_sheet_test.dart +++ b/test/widgets/track_sheet_test.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'dart:ui' show Tristate; import 'package:flutter/material.dart'; @@ -106,7 +108,9 @@ void main() { isTranscoding: true, sourceSubtitleTracks: [MediaSubtitleTrack(id: 0, title: 'Stream zero', selected: false, forced: false)], selectedSubtitleChoice: const PlaybackSourceSubtitleChoice.off(), - onSwitchSubtitle: (choice) => switchedChoice = choice, + onSwitchSubtitle: (choice) async { + switchedChoice = choice; + }, subtitleSearchSupported: false, ), ); @@ -143,7 +147,9 @@ void main() { ], selectedSubtitleChoice: const PlaybackSourceSubtitleChoice.source(1), sourceSubtitleSidecarIds: const {2}, - onSwitchSubtitle: (choice) => switchedSourceChoice = choice, + onSwitchSubtitle: (choice) async { + switchedSourceChoice = choice; + }, subtitleSearchSupported: false, ), ); @@ -155,6 +161,71 @@ void main() { expect(switchedSourceChoice, const PlaybackSourceSubtitleChoice.source(2)); }); + testWidgets('keeps a source sheet open until the async selection commits', (tester) async { + final player = _FakeTrackSheetPlayer( + tracks: const Tracks( + subtitle: [SubtitleTrack(id: 's1', language: 'eng', codec: 'srt')], + ), + track: const TrackSelection( + subtitle: SubtitleTrack(id: 's1', language: 'eng', codec: 'srt'), + ), + ); + final selectionGate = Completer(); + late BuildContext hostContext; + + await tester.pumpWidget( + MaterialApp( + theme: ThemeData(extensions: const [_testTokens]), + home: OverlaySheetHost( + child: Builder( + builder: (context) { + hostContext = context; + return const Scaffold(body: SizedBox.expand()); + }, + ), + ), + ), + ); + final sheetResult = OverlaySheetController.of(hostContext).show( + builder: (_) => SizedBox( + height: 400, + child: TrackSheet( + player: player, + trackControlsState: TrackControlsState( + sourceSubtitleTracks: [ + MediaSubtitleTrack(id: 1, languageCode: 'eng', codec: 'srt', selected: true, forced: false), + MediaSubtitleTrack( + id: 2, + title: 'Remote sidecar', + codec: 'ass', + external: true, + selected: false, + forced: false, + ), + ], + selectedSubtitleChoice: const PlaybackSourceSubtitleChoice.source(1), + sourceSubtitleSidecarIds: const {2}, + onSwitchSubtitle: (_) => selectionGate.future, + subtitleSearchSupported: false, + ), + ), + ), + ); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Remote sidecar')); + await tester.pump(); + + expect(find.byType(LinearProgressIndicator), findsOneWidget); + expect(find.text('Remote sidecar'), findsOneWidget); + + selectionGate.complete(); + await tester.pumpAndSettle(); + await sheetResult; + + expect(find.text('Remote sidecar'), findsNothing); + }); + testWidgets('direct-play embedded selection stays on the native player path', (tester) async { final player = _FakeTrackSheetPlayer( tracks: const Tracks( @@ -178,7 +249,9 @@ void main() { MediaSubtitleTrack(id: 2, languageCode: 'swe', selected: false, forced: false), ], selectedSubtitleChoice: const PlaybackSourceSubtitleChoice.source(1), - onSwitchSubtitle: (choice) => switchedSourceChoice = choice, + onSwitchSubtitle: (choice) async { + switchedSourceChoice = choice; + }, subtitleSearchSupported: false, ), ); @@ -221,7 +294,7 @@ void main() { selectedSubtitleChoice: const PlaybackSourceSubtitleChoice.source(1), selectedSecondarySubtitleStreamId: 2, sourceSubtitleSidecarIds: const {2}, - onSwitchSubtitle: (_) {}, + onSwitchSubtitle: (_) async {}, subtitleSearchSupported: false, ), ); @@ -284,7 +357,7 @@ void main() { TrackControlsState( isTranscoding: true, sourceSubtitleTracks: [sourceSubtitle], - onSwitchSubtitle: (_) {}, + onSwitchSubtitle: (_) async {}, ).hasSubtitleControls(const Tracks()), isTrue, ); @@ -295,7 +368,7 @@ void main() { final state = TrackControlsState( sourceSubtitleTracks: [sourceSidecar], sourceSubtitleSidecarIds: {sourceSidecar.id}, - onSwitchSubtitle: (_) {}, + onSwitchSubtitle: (_) async {}, ); expect(state.canUseSourceSubtitles, isFalse); @@ -305,7 +378,7 @@ void main() { test('does not misclassify a Jellyfin external-delivery embedded row as a sidecar', () { final sourceTrack = MediaSubtitleTrack(id: 1, usesExternalDelivery: true, selected: false, forced: false); - final state = TrackControlsState(sourceSubtitleTracks: [sourceTrack], onSwitchSubtitle: (_) {}); + final state = TrackControlsState(sourceSubtitleTracks: [sourceTrack], onSwitchSubtitle: (_) async {}); expect(state.directPlaySourceSidecars, isEmpty); }); diff --git a/test/widgets/tv_browse_rail_test.dart b/test/widgets/tv_browse_rail_test.dart index d52009dc..3a2702be 100644 --- a/test/widgets/tv_browse_rail_test.dart +++ b/test/widgets/tv_browse_rail_test.dart @@ -319,10 +319,12 @@ void main() { }); }); + late HubFocusMemory focusMemory; + setUp(() async { resetSharedPreferencesForTest(); SettingsService.resetForTesting(); - HubFocusMemory.clear(); + focusMemory = HubFocusMemory(); await SettingsService.getInstance(); }); @@ -352,6 +354,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hub], autofocus: true, iconForHub: (_, _) => Icons.movie_rounded, @@ -413,7 +416,7 @@ void main() { body: SizedBox( width: 1280, height: 720, - child: TvBrowseRail(hubs: [hub], iconForHub: (_, _) => Icons.tv_rounded), + child: TvBrowseRail(focusMemory: focusMemory, hubs: [hub], iconForHub: (_, _) => Icons.tv_rounded), ), ), ), @@ -454,6 +457,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hubFor('serverA'), hubFor('serverB')], iconForHub: (_, _) => Icons.movie_rounded, ), @@ -496,7 +500,7 @@ void main() { body: SizedBox( width: 1280, height: 720, - child: TvBrowseRail(hubs: [hub], iconForHub: (_, _) => Icons.movie_rounded), + child: TvBrowseRail(focusMemory: focusMemory, hubs: [hub], iconForHub: (_, _) => Icons.movie_rounded), ), ), ), @@ -539,7 +543,12 @@ void main() { body: SizedBox( width: 1280, height: 720, - child: TvBrowseRail(hubs: [hub], autofocus: true, iconForHub: (_, _) => Icons.movie_rounded), + child: TvBrowseRail( + focusMemory: focusMemory, + hubs: [hub], + autofocus: true, + iconForHub: (_, _) => Icons.movie_rounded, + ), ), ), ), @@ -625,6 +634,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [firstHub, secondHub], autofocus: true, iconForHub: (_, _) => Icons.movie_rounded, @@ -696,7 +706,12 @@ void main() { body: SizedBox( width: 1280, height: 720, - child: TvBrowseRail(hubs: [hub], autofocus: true, iconForHub: (_, _) => Icons.movie_rounded), + child: TvBrowseRail( + focusMemory: focusMemory, + hubs: [hub], + autofocus: true, + iconForHub: (_, _) => Icons.movie_rounded, + ), ), ), ), @@ -751,7 +766,12 @@ void main() { body: SizedBox( width: 1280, height: 720, - child: TvBrowseRail(hubs: [hub], autofocus: true, iconForHub: (_, _) => Icons.movie_rounded), + child: TvBrowseRail( + focusMemory: focusMemory, + hubs: [hub], + autofocus: true, + iconForHub: (_, _) => Icons.movie_rounded, + ), ), ), ), @@ -808,6 +828,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hub], autofocus: true, iconForHub: (_, _) => Icons.movie_rounded, @@ -865,6 +886,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hub], autofocus: true, iconForHub: (_, _) => Icons.movie_rounded, @@ -922,7 +944,11 @@ void main() { body: SizedBox( width: 1280, height: 720, - child: TvBrowseRail(hubs: [firstHub, secondHub], iconForHub: (_, _) => Icons.movie_rounded), + child: TvBrowseRail( + focusMemory: focusMemory, + hubs: [firstHub, secondHub], + iconForHub: (_, _) => Icons.movie_rounded, + ), ), ), ), @@ -957,6 +983,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, key: const ValueKey('rail'), hubs: hubs, initialHubId: initialHubId, @@ -998,6 +1025,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, key: const ValueKey('rail'), hubs: hubs, initialHubId: initialHubId, @@ -1040,6 +1068,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, key: const ValueKey('rail'), hubs: hubs, initialItemId: initialItemId, @@ -1107,7 +1136,7 @@ void main() { // Seed remembered focus under the rail's server-qualified hub key (mirrors // _TvBrowseRailState._hubKey: ':'), so the multi-server keying // resolves it the same way the rail does. - HubFocusMemory.setForHub('${episodeHub.serverId ?? ''}:${episodeHub.id}', 5); + focusMemory.setForHub('${episodeHub.serverId ?? ''}:${episodeHub.id}', 5); await tester.pumpWidget( ChangeNotifierProvider( @@ -1121,6 +1150,7 @@ void main() { width: 700, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [movieHub, episodeHub], autofocus: true, iconForHub: (_, _) => Icons.tv_rounded, @@ -1232,6 +1262,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, key: const ValueKey('rail'), hubs: hubs, autofocus: true, @@ -1314,6 +1345,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, key: const ValueKey('rail'), hubs: [firstHub, activeHub, backgroundLoaded ? backgroundUpdatedHub : backgroundInitialHub], autofocus: true, @@ -1391,6 +1423,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [firstHub, middleLoaded ? middleUpdatedHub : middleInitialHub, lastHub], autofocus: true, iconForHub: (_, _) => Icons.tv_rounded, @@ -1452,7 +1485,7 @@ void main() { expect(_verticalRailPosition(tester).pixels, closeTo(middleTargetOffset, 0.1)); }); - testWidgets('uses per-hub item focus instead of global column hint', (tester) async { + testWidgets('uses per-hub item focus instead of the owner last-column hint', (tester) async { List movieItems() => List.generate( 8, (index) => @@ -1492,6 +1525,7 @@ void main() { width: 700, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [movieHub, episodeHub], autofocus: true, iconForHub: (_, _) => Icons.tv_rounded, @@ -1522,6 +1556,97 @@ void main() { expect(focused.last, 'movies:movie_5'); }); + testWidgets('repeated detail hub ids restore only within their browse owner', (tester) async { + final episodeItems = [ + for (var index = 0; index < 12; index++) + testMediaItem( + id: 'episode_$index', + backend: MediaBackend.plex, + kind: MediaKind.episode, + title: 'Episode $index', + thumbPath: '/episode_$index', + ), + ]; + final extraItems = [ + for (var index = 0; index < 3; index++) + testMediaItem(id: 'extra_$index', backend: MediaBackend.plex, kind: MediaKind.movie, title: 'Extra $index'), + ]; + final episodeHub = MediaHub( + id: 'detail_episodes', + title: 'Episodes', + type: 'episode', + items: episodeItems, + size: episodeItems.length, + ); + final extrasHub = MediaHub( + id: 'detail_extras', + title: 'Extras', + type: 'movie', + items: extraItems, + size: extraItems.length, + ); + final focused = []; + + Future mount(HubFocusMemory owner, List hubs) async { + final serverManager = MultiServerManager(); + await tester.pumpWidget( + ChangeNotifierProvider( + create: (_) => MultiServerProvider(serverManager, DataAggregationService(serverManager)), + child: MaterialApp( + theme: monoTheme(dark: true), + home: Scaffold( + body: SizedBox( + width: 700, + height: 720, + child: TvBrowseRail( + focusMemory: owner, + hubs: hubs, + autofocus: true, + iconForHub: (_, _) => Icons.tv_rounded, + onFocusedHubItemChanged: (hub, item) => focused.add('${hub.id}:${item.id}'), + episodePosterModeForHub: (_) => EpisodePosterMode.episodeThumbnail, + ), + ), + ), + ), + ), + ); + await tester.pump(); + tester.state(find.byType(TvBrowseRail)).requestFocus(); + await tester.pump(); + } + + Future press(LogicalKeyboardKey key) async { + await tester.sendKeyDownEvent(key); + await tester.pump(); + await tester.sendKeyUpEvent(key); + await tester.pumpAndSettle(); + } + + await mount(focusMemory, [episodeHub, extrasHub]); + for (var index = 0; index < 5; index++) { + await press(LogicalKeyboardKey.arrowRight); + } + expect(focused.last, 'detail_episodes:episode_5'); + expect(_activeRailPosition(tester).pixels, greaterThan(0)); + + await press(LogicalKeyboardKey.arrowDown); + expect(focused.last, 'detail_extras:extra_0'); + await press(LogicalKeyboardKey.arrowUp); + expect(focused.last, 'detail_episodes:episode_5'); + expect(_activeRailPosition(tester).pixels, greaterThan(0)); + + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pump(); + + final freshOwner = HubFocusMemory(); + await mount(freshOwner, [extrasHub, episodeHub]); + await press(LogicalKeyboardKey.arrowDown); + + expect(focused.last, 'detail_episodes:episode_0'); + expect(_activeRailPosition(tester).pixels, 0); + }); + testWidgets('keeps late episode thumbnails visible in long TV rows', (tester) async { await SettingsService.instanceOrNull!.write(SettingsService.tvFullCardLayout, false); tester.view.devicePixelRatio = 1.0; @@ -1563,6 +1688,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hub], autofocus: true, iconForHub: (_, _) => Icons.tv_rounded, @@ -1653,6 +1779,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hub], autofocus: true, iconForHub: (_, _) => Icons.tv_rounded, @@ -1726,6 +1853,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hub], iconForHub: (_, _) => Icons.person_rounded, onActivateItem: (_, _) { @@ -1788,6 +1916,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hub], iconForHub: (_, _) => Icons.person_rounded, onActivateItem: (_, _) { @@ -1838,6 +1967,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hub], iconForHub: (_, _) => Icons.person_rounded, onActivateItem: (_, _) { @@ -1885,6 +2015,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hub], iconForHub: (_, _) => Icons.person_rounded, selectSuppressionGestureSignal: gesture, @@ -1940,6 +2071,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hub], iconForHub: (_, _) => Icons.person_rounded, selectSuppressionGestureSignal: gesture, @@ -1989,7 +2121,12 @@ void main() { body: SizedBox( width: 1280, height: 720, - child: TvBrowseRail(hubs: [hub], autofocus: autofocus, iconForHub: (_, _) => Icons.tv_rounded), + child: TvBrowseRail( + focusMemory: focusMemory, + hubs: [hub], + autofocus: autofocus, + iconForHub: (_, _) => Icons.tv_rounded, + ), ), ), ), @@ -2025,7 +2162,11 @@ void main() { left: 0, right: 0, bottom: 0, - child: TvBrowseRail(hubs: [hub], iconForHub: (_, _) => Icons.movie_rounded), + child: TvBrowseRail( + focusMemory: focusMemory, + hubs: [hub], + iconForHub: (_, _) => Icons.movie_rounded, + ), ), ], ), @@ -2061,6 +2202,7 @@ void main() { width: 1060, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, hubs: [hub], iconForHub: (_, _) => Icons.movie_rounded, backgroundBleedLeft: SideNavigationRailState.expandedWidth, @@ -2101,6 +2243,7 @@ void main() { width: 1280, height: 720, child: TvBrowseRail( + focusMemory: focusMemory, key: const ValueKey('rail'), hubs: [hub], iconForHub: (_, _) => Icons.movie_rounded, diff --git a/test/widgets/tv_virtual_keyboard_test.dart b/test/widgets/tv_virtual_keyboard_test.dart index 51807bff..aa897023 100644 --- a/test/widgets/tv_virtual_keyboard_test.dart +++ b/test/widgets/tv_virtual_keyboard_test.dart @@ -58,6 +58,24 @@ void main() { expect(find.byType(Dialog), findsOneWidget); }); + testWidgets('unowned keyboard keys remain available to ancestor handlers', (tester) async { + final controller = TextEditingController(); + addTearDown(controller.dispose); + + await _pumpKeyboard(tester, controller: controller); + + final result = _dispatchKey( + const KeyDownEvent( + physicalKey: PhysicalKeyboardKey.f12, + logicalKey: LogicalKeyboardKey.f12, + timeStamp: Duration.zero, + ), + ); + + expect(result, KeyEventResult.ignored); + expect(controller.text, isEmpty); + expect(find.byType(Dialog), findsOneWidget); + }); testWidgets('directional pad enter activates highlighted key', (tester) async { final controller = TextEditingController(); addTearDown(controller.dispose); @@ -230,6 +248,79 @@ void main() { expect(find.byType(Dialog), findsNothing); expect(underlyingBackEvents, 0); }); + + testWidgets('rendered backspace deletes whole graphemes and keeps the keyboard open', (tester) async { + final controller = TextEditingController(); + addTearDown(controller.dispose); + + for (final grapheme in ['๐Ÿ˜€', 'e\u0301', '๐Ÿ‡ฏ๐Ÿ‡ต', '๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ']) { + controller.value = TextEditingValue( + text: 'A${grapheme}B', + selection: TextSelection.collapsed(offset: 1 + grapheme.length), + ); + await _pumpKeyboard(tester, controller: controller); + + await tester.tap(find.byIcon(Symbols.backspace_rounded)); + await tester.pump(); + + expect(controller.text, 'AB'); + expect(controller.selection, const TextSelection.collapsed(offset: 1)); + expect(find.byType(Dialog), findsOneWidget); + + await tester.sendKeyEvent(LogicalKeyboardKey.escape); + await tester.pumpAndSettle(); + } + }); + + testWidgets('physical delete removes a whole grapheme and dismisses the keyboard', (tester) async { + final controller = TextEditingController(); + addTearDown(controller.dispose); + + for (final grapheme in ['๐Ÿ˜€', 'e\u0301', '๐Ÿ‡ฏ๐Ÿ‡ต', '๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ']) { + controller.value = TextEditingValue(text: 'A${grapheme}B', selection: const TextSelection.collapsed(offset: 1)); + await _pumpKeyboard(tester, controller: controller); + + await tester.sendKeyEvent(LogicalKeyboardKey.delete); + await tester.pumpAndSettle(); + + expect(controller.text, 'AB'); + expect(controller.selection, const TextSelection.collapsed(offset: 1)); + expect(find.byType(Dialog), findsNothing); + } + }); + + testWidgets('grapheme selection deletion preserves formatter and callback ordering', (tester) async { + const grapheme = '๐Ÿ‡ฏ๐Ÿ‡ต'; + final controller = TextEditingController() + ..value = TextEditingValue( + text: 'A${grapheme}B', + selection: TextSelection(baseOffset: grapheme.length, extentOffset: 1), + ); + final formatterCandidates = []; + final changes = []; + addTearDown(controller.dispose); + + await _pumpKeyboard( + tester, + controller: controller, + maxLength: 8, + inputFormatters: [ + TextInputFormatter.withFunction((_, nextValue) { + formatterCandidates.add(nextValue); + return nextValue; + }), + ], + onChanged: changes.add, + ); + + await tester.tap(find.byIcon(Symbols.backspace_rounded)); + await tester.pump(); + + expect(formatterCandidates.single.text, 'AB'); + expect(controller.text, 'AB'); + expect(controller.selection, const TextSelection.collapsed(offset: 1)); + expect(changes, ['AB']); + }); } Future _pumpKeyboard( @@ -237,6 +328,9 @@ Future _pumpKeyboard( required TextEditingController controller, TextInputType? keyboardType, int? maxLines, + List? inputFormatters, + int? maxLength, + ValueChanged? onChanged, ValueChanged? onSubmitted, }) async { TvDetectionService.debugSetAppleTVOverride(true); @@ -260,6 +354,9 @@ Future _pumpKeyboard( controller: controller, keyboardType: keyboardType, maxLines: maxLines, + inputFormatters: inputFormatters, + maxLength: maxLength, + onChanged: onChanged, onSubmitted: onSubmitted, ); await tester.pumpAndSettle(); diff --git a/test/widgets/video_controls_test.dart b/test/widgets/video_controls_test.dart index eab0d32e..2c428548 100644 --- a/test/widgets/video_controls_test.dart +++ b/test/widgets/video_controls_test.dart @@ -4,6 +4,7 @@ import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:intl/date_symbol_data_local.dart'; +import 'package:material_symbols_icons/symbols.dart'; import 'package:provider/provider.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:plezy/focus/key_event_utils.dart'; @@ -13,9 +14,11 @@ import 'package:plezy/media/media_version.dart'; import 'package:plezy/models/shader_preset.dart'; import 'package:plezy/mpv/mpv.dart'; import 'package:plezy/services/playback_subtitle_resolver.dart'; +import 'package:plezy/providers/playback_state_provider.dart'; import 'package:plezy/services/settings_service.dart'; import 'package:plezy/services/video_volume_controller.dart'; import 'package:plezy/theme/mono_tokens.dart'; +import 'package:plezy/widgets/video_controls/widgets/player_toast_indicator.dart'; import 'package:plezy/widgets/video_controls/desktop_video_controls.dart'; import 'package:plezy/widgets/video_controls/mobile_video_controls.dart'; import 'package:plezy/watch_together/providers/watch_together_provider.dart'; @@ -27,6 +30,7 @@ import 'package:plezy/widgets/video_controls/widgets/mobile_skip_zones.dart'; import 'package:plezy/widgets/video_controls/widgets/skip_marker_button.dart'; import 'package:plezy/widgets/video_controls/widgets/sync_offset_control.dart'; import 'package:plezy/widgets/video_controls/widgets/timeline_slider.dart'; +import 'package:plezy/widgets/video_controls/video_control_button.dart'; import 'package:plezy/widgets/video_controls/widgets/video_timeline_bar.dart'; import '../test_helpers/watch_together_fakes.dart'; @@ -1479,6 +1483,85 @@ void main() { }); }); + group('subtitle visibility', () { + testWidgets('rolls back a failed latest toggle to the preceding successful mutation', (tester) async { + LocaleSettings.setLocaleSync(AppLocale.en); + await initializeDateFormatting('en'); + tester.view.physicalSize = const Size(1200, 800); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.reset); + resetSharedPreferencesForTest(); + SettingsService.resetForTesting(); + final settings = await SettingsService.getInstance(); + final firstWrite = Completer(); + final secondWrite = Completer(); + final player = _FakeSubtitleVisibilityPlayer(writes: [firstWrite, secondWrite]); + final volume = VideoVolumeController(player: player, settings: settings, initialVolume: 100); + final playbackState = PlaybackStateProvider(); + final watchTogether = WatchTogetherProvider(); + final chrome = PlayerChromeController(); + final toast = PlayerToastController(); + addTearDown(volume.dispose); + addTearDown(playbackState.dispose); + addTearDown(watchTogether.dispose); + addTearDown(chrome.dispose); + addTearDown(toast.dispose); + + await tester.pumpWidget( + MultiProvider( + providers: [ + ChangeNotifierProvider.value(value: playbackState), + ChangeNotifierProvider.value(value: watchTogether), + ], + child: MaterialApp( + theme: ThemeData(platform: TargetPlatform.macOS, extensions: const [_testTokens]), + home: Scaffold( + body: SizedBox( + width: 1200, + height: 800, + child: PlexVideoControls( + player: player, + volumeController: volume, + metadata: testMediaItem(id: 'subtitle-visibility'), + toastController: toast, + canNavigateMediaItems: false, + chromeController: chrome, + isLive: true, + ), + ), + ), + ), + ), + ); + await tester.pump(); + expect(find.byIcon(Symbols.subtitles_rounded), findsOneWidget); + + await tester.sendKeyEvent(LogicalKeyboardKey.keyS); + await tester.pump(); + expect(player.propertyValues, ['no']); + expect(find.byIcon(Symbols.subtitles_off_rounded), findsOneWidget); + + await tester.sendKeyEvent(LogicalKeyboardKey.keyS); + await tester.pump(); + expect(player.propertyValues, ['no'], reason: 'the latest toggle must wait for the in-flight native write'); + expect(find.byIcon(Symbols.subtitles_rounded), findsOneWidget); + + firstWrite.complete(); + await tester.pump(); + await tester.pump(); + expect(player.propertyValues, ['no', 'yes']); + + secondWrite.completeError(PlatformException(code: 'SET_PROPERTY_FAILED')); + await tester.pump(); + await tester.pump(); + + expect(tester.takeException(), isNull); + expect(find.byIcon(Symbols.subtitles_off_rounded), findsOneWidget); + chrome.cancelAutoHide(); + await tester.pumpWidget(const SizedBox.shrink()); + }); + }); + group('SyncOffsetControl', () { testWidgets('uses 100ms slider steps without rendering tick marks', (tester) async { LocaleSettings.setLocaleSync(AppLocale.en); @@ -1594,16 +1677,165 @@ void main() { tester.widget(find.byType(Slider)).onChangeEnd!(200); await tester.pump(); await tester.pump(); - expect(persistedOffsets, [200]); + expect(persistedOffsets, isEmpty); staleWrite.completeError(PlatformException(code: 'SET_PROPERTY_FAILED')); await tester.pump(); await tester.pump(); + await tester.pump(); expect(tester.takeException(), isNull); expect(tester.widget(find.byType(Slider)).value, 200); expect(persistedOffsets, [200]); }); + + testWidgets('rolls back a failed latest write to the preceding successful offset', (tester) async { + final firstWrite = Completer(); + final secondWrite = Completer(); + final propertyValues = []; + final persistedOffsets = []; + final player = _FakeSyncPlayer( + onSetProperty: (_, value) { + propertyValues.add(value); + return propertyValues.length == 1 ? firstWrite.future : secondWrite.future; + }, + ); + + await tester.pumpWidget( + MaterialApp( + theme: ThemeData(extensions: const [_testTokens]), + home: Scaffold( + body: SizedBox( + width: 700, + child: SyncOffsetControl( + player: player, + propertyName: 'sub-delay', + initialOffset: 0, + labelText: 'Subtitles', + onOffsetChanged: (offset) async { + persistedOffsets.add(offset); + }, + compact: true, + ), + ), + ), + ), + ); + + tester.widget(find.byType(Slider)).onChanged!(100); + tester.widget(find.byType(Slider)).onChangeEnd!(100); + await tester.pump(); + expect(propertyValues, ['0.1']); + + tester.widget(find.byType(Slider)).onChanged!(200); + tester.widget(find.byType(Slider)).onChangeEnd!(200); + await tester.pump(); + expect(propertyValues, ['0.1']); + expect(tester.widget(find.byType(Slider)).value, 200); + + firstWrite.complete(); + await tester.pump(); + await tester.pump(); + expect(propertyValues, ['0.1', '0.2']); + expect(persistedOffsets, [100]); + + secondWrite.completeError(PlatformException(code: 'SET_PROPERTY_FAILED')); + await tester.pump(); + await tester.pump(); + + expect(tester.takeException(), isNull); + expect(tester.widget(find.byType(Slider)).value, 100); + expect(persistedOffsets, [100]); + }); + + testWidgets('persists an accepted offset after the control is disposed', (tester) async { + final propertyWrite = Completer(); + final persistedOffsets = []; + final player = _FakeSyncPlayer(onSetProperty: (_, _) => propertyWrite.future); + + await tester.pumpWidget( + MaterialApp( + theme: ThemeData(extensions: const [_testTokens]), + home: Scaffold( + body: SizedBox( + width: 700, + child: SyncOffsetControl( + player: player, + propertyName: 'sub-delay', + initialOffset: 0, + labelText: 'Subtitles', + onOffsetChanged: (offset) async => persistedOffsets.add(offset), + compact: true, + ), + ), + ), + ), + ); + + tester.widget(find.byType(Slider)).onChanged!(100); + tester.widget(find.byType(Slider)).onChangeEnd!(100); + await tester.pumpWidget(const SizedBox.shrink()); + propertyWrite.complete(); + await tester.pump(); + + expect(persistedOffsets, [100]); + }); + }); + + group('VideoControlButton semantics', () { + testWidgets('exposes one operable node with value and checked state', (tester) async { + final semantics = tester.ensureSemantics(); + final focusNode = FocusNode(debugLabel: 'semantic_video_control'); + addTearDown(focusNode.dispose); + var activations = 0; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: VideoControlButton( + icon: Icons.settings, + tooltip: 'Player settings', + semanticValue: '720p', + checked: true, + focusNode: focusNode, + onPressed: () => activations++, + ), + ), + ), + ); + + final finder = find.bySemanticsLabel('Player settings'); + expect(finder, findsOneWidget); + final data = tester.getSemantics(finder).getSemanticsData(); + expect(data.value, '720p'); + expect(data.flagsCollection.isButton, isTrue); + expect(data.flagsCollection.isChecked, ui.CheckedState.isTrue); + expect(data.hasAction(ui.SemanticsAction.tap), isTrue); + + final node = tester.getSemantics(finder); + node.owner!.performAction(node.id, ui.SemanticsAction.tap); + await tester.pump(); + expect(activations, 1); + semantics.dispose(); + }); + + testWidgets('keeps disabled controls discoverable without a tap action', (tester) async { + final semantics = tester.ensureSemantics(); + + await tester.pumpWidget( + const MaterialApp( + home: Scaffold( + body: VideoControlButton(icon: Icons.skip_next, semanticLabel: 'Next item', onPressed: null), + ), + ), + ); + + final data = tester.getSemantics(find.bySemanticsLabel('Next item')).getSemanticsData(); + expect(data.flagsCollection.isButton, isTrue); + expect(data.flagsCollection.isEnabled, ui.Tristate.isFalse); + expect(data.hasAction(ui.SemanticsAction.tap), isFalse); + semantics.dispose(); + }); }); } @@ -1670,3 +1902,57 @@ class _FakeSyncPlayer implements Player { @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } + +class _FakeSubtitleVisibilityPlayer implements Player { + _FakeSubtitleVisibilityPlayer({required this.writes}); + + final List> writes; + final List propertyValues = []; + + @override + String get playerType => 'mpv'; + + @override + PlayerState get state => PlayerState( + duration: const Duration(minutes: 45), + seekable: true, + tracks: const Tracks( + subtitle: [SubtitleTrack(id: 'subtitle-1', language: 'eng')], + ), + track: const TrackSelection( + subtitle: SubtitleTrack(id: 'subtitle-1', language: 'eng'), + ), + ); + + @override + PlayerStreams get streams => PlayerStreams( + playing: const Stream.empty(), + completed: const Stream.empty(), + buffering: const Stream.empty(), + position: const Stream.empty(), + duration: const Stream.empty(), + seekable: const Stream.empty(), + buffer: const Stream.empty(), + volume: const Stream.empty(), + rate: const Stream.empty(), + tracks: const Stream.empty(), + track: const Stream.empty(), + log: const Stream.empty(), + error: const Stream.empty(), + audioDevice: const Stream.empty(), + audioDevices: const Stream>.empty(), + bufferRanges: const Stream>.empty(), + playbackRestart: const Stream.empty(), + backendSwitched: const Stream.empty(), + ); + + @override + Future setProperty(String name, String value) { + expect(name, 'sub-visibility'); + propertyValues.add(value); + return writes[propertyValues.length - 1].future; + } + + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +}